/* ============================================================================
   Loonwise — site.css v15 (shared; bump ?v= sitewide on edit)

   THE 2026-10-13 REDESIGN (design only): an image-led corporate system in the
   owner's blue family —
     navy #001D6C   headings, nav, link text
     band #002D9C   dark band, masthead tint, hero box
     brand #0D5BE1  eyebrows, progress bars, tickers
     pale #EDF5FF / #D0E2FF  cards, ticker strip, pale bands
     ink #161616    long body text
   Merriweather 300/400 for section titles, banner headlines and group titles;
   IBM Plex Sans (300/400/600) for everything else, Light 300 white for hero and
   masthead titles. Square 48px buttons (decision 4), never pills. The Waterline
   (black masthead rules, Mono record labels, the 320px axis) is retired; Plex
   Mono survives only inside the Run & Evolve demo scene. Every component is
   documented, with markup, in the redesign notes (COMPONENTS.md and the
   specimen page beside it; tools only, never deployed).
   v14: the hub panel (.hb banner, .hbox help box, .lifted / .lift-card) shared
   by /services and /industries; one intro rule (760px lead, the same space
   under every masthead or strip, left-aligned on phones); the thumbnail label
   in the lower-left corner and whole summaries on every cover; masthead ground
   flattened toward band blue with a phone drawing (.mast-fig); the closing
   band's phone crop on her face; the ticker's static state as a list; the
   current menu item's rule steps back while another panel is open; dead
   legacy blocks removed (.doc, .ledger, .cols4, .t-display/.t-title/.t-read).
   v15: the tablet list form of the covers applies only to a .cards grid of covers
   (it collapsed the covers inside drag rows at 641–960px); one photo-masthead
   recipe (greys lifted toward white under one blue multiply, one navy scrim);
   the hubs' intro on the 760px lead measure; one filter-row size on both hubs;
   the hub banner's lead and call to action inside the card (.hb-more); the
   banner boxes on one line (--bx); the anchor strip ends with its page's
   content (.pn-scope) and clears the reading rail; without JavaScript the six
   header links stay reachable below 1181px; a focused ticker item on a phone
   shows the items as the wrapping list; the footer rule in the pale hairline.
   ========================================================================== */
:root{
  --navy:#001D6C;--band:#002D9C;--brand:#0D5BE1;--brand-dark:#0043CE;
  --pale:#EDF5FF;--pale2:#D0E2FF;--pale3:#A6C8FF;
  --ink:#161616;--text2:#525252;--text3:#6F6F6F;
  --line:#E0E0E0;--rule:#BFCDEE;--hair2:#C6C6C6;--layer:#F4F4F4;--soft:#EDF5FF;--bg:#FFFFFF;
  --serif:'Merriweather',Georgia,'Times New Roman',serif;
  --sans:'IBM Plex Sans',system-ui,-apple-system,'Helvetica Neue',sans-serif;
  --mono:'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --max:1280px;--hdr-h:80px;--pad:20px;--gap:20px;
  /* spacing scale */
  --s1:8px;--s2:16px;--s3:24px;--s4:32px;--s5:48px;--s6:64px;--s7:96px;--s8:128px;
  --sec:clamp(56px,6vw,88px);
  --shadow:0 18px 40px -18px rgba(0,29,108,.32);
  --shadow-s:0 8px 20px -10px rgba(0,29,108,.24);
  --box:rgba(0,45,156,.93);            /* hero and banner text box (~93% band blue) */
  --pnav-h:56px;                       /* the anchor strip's height (tab targets add it to scroll-margin-top) */
  --glass:rgba(0,29,108,.62);          /* the photo banner's translucent box */
  --bx:0px;                            /* banner boxes: extra inset past the wrap edge (v15, below) */
  --t-fast:150ms;--t-mid:300ms;--ease:cubic-bezier(.2,0,.38,.9);--ease-in:cubic-bezier(0,0,.3,1);--ease-out:cubic-bezier(.2,0,1,.9)}
@media(min-width:672px){:root{--pad:24px;--gap:24px}}
/* every banner box (the hero's, the homepage Industries panels', the closing band's, /platforms') stands on one line:
   the wrap edge, but never closer than 104px to the window's left edge from 901px, where the hero's slide markers
   sit in that margin. Boxes inside a .wrap add --bx to the wrap edge; the hero adds it to its own wrap-edge margin. */
@media(min-width:901px){:root{--bx:max(0px,calc(104px - max(var(--pad),(100vw - var(--max))/2 + var(--pad))))}}
@media(min-width:1056px){:root{--pad:32px;--gap:32px}}
@media(max-width:560px){:root{--hdr-h:64px}}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
/* keyboard focus never lands under the sticky header (WCAG 2.2, 2.4.11) */
main :is(a,button,input,select,textarea,summary,[tabindex]):not(.pnav *){scroll-margin-top:calc(var(--hdr-h) + 16px)}
body:has(.pnav) main :is(a,button,input,select,textarea,summary,[tabindex]):not(.pnav *){scroll-margin-top:calc(var(--hdr-h) + var(--pnav-h) + 16px)}
body{font-family:var(--sans);color:var(--ink);background:var(--bg);font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
h1,h2,h3,h4{font-family:inherit;font-weight:400;letter-spacing:normal;color:var(--navy)}
a{color:inherit;text-decoration:none}
img{max-width:100%;height:auto}
button{font-family:inherit}
main{display:block;scroll-margin-top:var(--hdr-h)}
main:focus{outline:none}
.nw{white-space:nowrap}
.wrap{max-width:var(--max);margin:0 auto;padding:0 var(--pad)}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
svg.ar{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
/* on dark grounds the focus ring is white */
:is(.on-dark,.band-dark,.hc,.ctaband,.banner,.mast,.phero,.tk-blue,.ind-panel,.pcard) :focus-visible{outline-color:#fff}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

/* skip link: the first focusable thing on every page; off-canvas until it has focus */
.skip{position:absolute;left:0;top:0;z-index:400;display:inline-flex;align-items:center;height:48px;padding:0 16px;background:var(--navy);color:#fff;font-size:16px;line-height:24px;transform:translateY(-100%)}
.skip:focus{transform:none;outline:2px solid var(--brand);outline-offset:-2px}

/* ---- type ------------------------------------------------------------------
   eyebrow      Plex 600 14/20 uppercase .15em, brand blue (pale blue on dark)
   s-title      Merriweather Light, 26-34px, navy — section titles (.h2 is the same)
   s-title-l    Merriweather Light, 30-40px — page-level section titles, mastheads' intro
   s-title-s    Merriweather Light, 22-28px — banner and card-group titles
   h1           Plex Light, 34-48px — hero and masthead titles (white on navy)
   h3 / c-title Plex 400 20-22px navy — card titles
   lead 18/30 · body 16/26 · small 14/22                                     */
.eyebrow,.label{display:block;font-size:14px;line-height:20px;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--brand);margin:0 0 12px}
.on-dark .eyebrow,.eyebrow.w{color:var(--pale3)}
.s-title,.h2{font-family:var(--serif);font-weight:300;font-size:clamp(26px,2.4vw,34px);line-height:1.34;letter-spacing:0;color:var(--navy);text-wrap:balance}
.s-title-l{font-family:var(--serif);font-weight:300;font-size:clamp(30px,2.9vw,40px);line-height:1.3;color:var(--navy);text-wrap:balance}
.s-title-s{font-family:var(--serif);font-weight:300;font-size:clamp(22px,2vw,28px);line-height:1.38;color:var(--navy)}
.on-dark .s-title,.on-dark .s-title-l,.on-dark .s-title-s,.on-dark .h2{color:#fff}
.h1{font-weight:300;font-size:clamp(34px,3.4vw,48px);line-height:1.18;letter-spacing:-.005em;color:var(--navy)}
.h3,.c-title{font-size:clamp(19px,1.6vw,22px);line-height:1.42;font-weight:400;color:var(--navy)}
.lead{font-size:18px;line-height:30px;color:var(--ink);max-width:760px}
@media(max-width:700px){.lead{font-size:17px;line-height:28px}}
.body{font-size:16px;line-height:26px;color:var(--ink)}
.body+.body{margin-top:16px}
.small{font-size:14px;line-height:22px;color:var(--text2)}
.small a{font-size:inherit}
.measure{max-width:760px}
/* .rec was the Waterline's Mono record label: now a quiet sans caption */
.rec{font-size:13px;line-height:18px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--brand)}
.rec-l{font-size:14px;line-height:20px}

/* ---- links: the two text-link forms --------------------------------------------
   .lnk       "Learn more ——"  semibold navy, a 24px rule after it that runs to 40px on hover
   .lnk-caps  "READ MORE >"    12px uppercase semibold, a small chevron
   .link      the legacy arrow link (inner pages), restyled navy                  */
.lnk{display:inline-flex;align-items:center;gap:14px;font-size:16px;line-height:24px;font-weight:600;color:var(--navy);cursor:pointer}
.lnk::after{content:'';display:block;width:24px;height:1.5px;background:currentColor;transition:width var(--t-mid) var(--ease)}
.lnk:hover,.lnk:focus-visible{color:var(--brand)}
.lnk:hover::after,.lnk:focus-visible::after{width:40px}
.on-dark .lnk,.lnk.w{color:#fff}
.on-dark .lnk:hover,.lnk.w:hover{color:var(--pale3)}
.lnk-caps{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:16px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--navy)}
.lnk-caps::after{content:'';width:6px;height:6px;border-right:1.5px solid currentColor;border-top:1.5px solid currentColor;transform:rotate(45deg);margin-left:2px;transition:transform var(--t-fast) var(--ease)}
.lnk-caps:hover{color:var(--brand)}
.lnk-caps:hover::after{transform:translateX(3px) rotate(45deg)}
.link{color:var(--navy);display:inline-flex;align-items:center;gap:8px;font-size:16px;font-weight:600}
.link .ar{color:var(--brand);transition:transform var(--t-fast) var(--ease)}
.link:hover{color:var(--brand)}
.link:hover .ar{transform:translateX(4px)}
@media(prefers-reduced-motion:reduce){.lnk::after,.lnk-caps::after,.link .ar{transition:none}}

/* ---- buttons: square, 48px, label left, arrow right (decisions 3 and 4) ---- */
.btn{display:inline-flex;align-items:center;justify-content:space-between;gap:32px;min-height:48px;min-width:200px;padding:0 16px 0 20px;font-size:15px;line-height:20px;font-weight:600;letter-spacing:.01em;border:1px solid transparent;border-radius:0;cursor:pointer;transition:background-color var(--t-fast),border-color var(--t-fast),color var(--t-fast);text-align:left;white-space:nowrap;background:var(--band);color:#fff}
.btn-primary{background:var(--band);color:#fff}.btn-primary:hover{background:var(--navy)}
.btn-secondary{background:var(--navy);color:#fff}.btn-secondary:hover{background:#00134A}
.btn-tertiary{background:transparent;color:var(--navy);border-color:var(--navy)}.btn-tertiary:hover{background:var(--navy);color:#fff}
.btn-white{background:#fff;color:var(--navy)}.btn-white:hover{background:var(--pale2)}
.btn-ghost{background:transparent;color:#fff;border-color:#fff}.btn-ghost:hover{background:#fff;color:var(--navy)}
.btn-sm{min-height:40px;min-width:0;gap:16px;font-size:14px}
.btns{display:flex;gap:16px 24px;flex-wrap:wrap;align-items:center}
/* the longest labels (28 characters) plus the arrow fit a 320px phone with a 16px gap */
@media(max-width:360px){.btn{gap:16px}}
/* the square icon button (pause, previous, next): 40px, outlined */
.ibtn{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;flex:0 0 40px;padding:0;border:1.5px solid var(--navy);border-radius:0;background:transparent;color:var(--navy);cursor:pointer;transition:background-color var(--t-fast),color var(--t-fast)}
.ibtn:hover{background:var(--navy);color:#fff}
.ibtn svg{width:16px;height:16px;fill:currentColor}
.ibtn[hidden]{display:none}
.ibtn .i-play{display:none}
.ibtn[aria-pressed="true"] .i-pause{display:none}
.ibtn[aria-pressed="true"] .i-play{display:block}
.on-dark .ibtn,.ibtn.w{border-color:#fff;color:#fff}
.on-dark .ibtn:hover,.ibtn.w:hover{background:#fff;color:var(--navy)}

/* ---- header: the bar — logo, the nav right after it, one square button at right.
   meganav.js rebuilds .lnk2 into the click-open mega menu and adds the burger to .rt2. */
.hdr{position:sticky;top:0;z-index:50;background:#fff;box-shadow:0 1px 0 rgba(0,29,108,.06),0 4px 16px -6px rgba(0,29,108,.14)}
.hdr .bar{max-width:1440px;margin:0 auto;padding:0 var(--pad);height:var(--hdr-h);display:flex;align-items:center;gap:40px}
@media(min-width:1056px){.hdr .bar{padding:0 40px}}
.hdr .lg2{flex-shrink:0;display:block}
.hdr .lg2 img{height:24px;width:auto;display:block}
.hdr .lnk2{display:flex;align-items:center;gap:4px;font-size:15px;color:var(--navy)}
.hdr .lnk2>a{padding:0 14px;line-height:var(--hdr-h)}
.hdr .rt2{display:flex;align-items:center;gap:12px;flex-shrink:0;margin-left:auto}
.hcta{display:inline-flex;align-items:center;gap:16px;height:44px;padding:0 20px 0 24px;border-radius:999px;background:var(--band);color:#fff;font-size:15px;font-weight:600;white-space:nowrap;transition:background-color var(--t-fast)}
.hcta:hover{background:var(--navy)}
@media(max-width:1180px){.hdr .lnk2{display:none}}
/* without JavaScript there is no burger: below 1181px the six links run as a second row under the bar (and the
   header stops being sticky, so the taller bar never covers the page) */
@media(max-width:1180px) and (scripting:none){
  .hdr{position:relative}
  .hdr .bar{flex-wrap:wrap;height:auto;row-gap:0}
  .hdr .lg2,.hdr .rt2{height:var(--hdr-h);display:flex;align-items:center}
  .hdr .lnk2{display:flex;order:3;flex:1 0 100%;gap:0;margin:0 calc(var(--pad)*-1);padding:0 var(--pad);overflow-x:auto;scrollbar-width:none;border-top:1px solid var(--rule)}
  .hdr .lnk2>a{padding:0 12px;line-height:44px;font-size:15px;white-space:nowrap}
  .hdr .lnk2>a:first-child{padding-left:0}
}
@media(max-width:560px){.hdr .bar{gap:12px}.hdr .lg2 img{height:20px}.hcta{height:40px;padding:0 16px;gap:8px;font-size:14px}}
/* "Reinvent with us" is longer than a 375px bar allows with its arrow: phones drop the arrow,
   and below 351px the button yields to the burger menu, whose footer carries the same button */
@media(max-width:400px){.hcta .ar{display:none}}
@media(max-width:350px){.hcta{display:none}}

/* while a menu panel is open, only the open item carries the 3px rule: the current section's rule (aria-current,
   meganav.js) steps back so two labels are never underlined at once */
.hdr .lnk2:has(.mn-item.open) .mn-item:not(.open)>a[aria-current]::after{transform:scaleX(0)}

/* ---- sections ------------------------------------------------------------ */
.sec{padding:var(--sec) 0}
.sec-tight{padding:clamp(48px,5vw,72px) 0}
.sec-s{padding-top:var(--sec)}
.sec-rule{padding:var(--sec) 0}
.sec-rule+.sec-rule{padding-top:0}
.sec-rule+.sec-rule>.wrap:first-child::before{content:'';display:block;border-top:1px solid var(--rule);margin-bottom:var(--sec)}
.pnav+.sec-rule{padding-top:clamp(48px,5vw,72px)}
.layer,.band-pale{background:var(--pale)}
/* section head: eyebrow, serif title, optional lead; .c centres it */
.sechd,.sechead{margin-bottom:clamp(32px,3.6vw,48px);max-width:1120px}
.sechd .lead,.sechead .lead{margin-top:16px}
.sechd.c,.sechead.c{margin-left:auto;margin-right:auto;text-align:center}
.sechd.c .lead,.sechead.c .lead{margin-left:auto;margin-right:auto}
.sechd-row{display:flex;align-items:flex-end;justify-content:space-between;gap:24px 48px;flex-wrap:wrap;margin-bottom:clamp(32px,3.6vw,48px)}
.sechd-row .sechd{margin-bottom:0}
.two{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:32px 64px;align-items:start}
@media(max-width:860px){.two{grid-template-columns:1fr;gap:24px}}
.two .h2{max-width:460px}
.two p:not(.eyebrow){max-width:760px}
.subh{font-size:13px;line-height:20px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--navy);margin:32px 0 14px;padding-top:14px;border-top:1px solid var(--rule)}
.subh:first-child{margin-top:0}
.on-dark{color:#fff}
.on-dark h2,.on-dark h3{color:#fff}

/* ---- the dark band: band blue, white type, pictogram list ---- */
.band-dark{background:var(--band);color:#fff}
.band-dark .eyebrow{color:var(--pale3)}
.band-dark .s-title,.band-dark .s-title-l,.band-dark .h2,.band-dark h3{color:#fff}
.band-dark .lnk{color:#fff}
.band-dark .lnk:hover{color:var(--pale3)}
.dk{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:48px 64px;align-items:center}
.dk-list{list-style:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 32px}
.band-dark.sec{padding:clamp(56px,5vw,72px) 0}
.dk-list a{display:flex;align-items:center;gap:20px;min-height:64px;padding:6px 0;color:#fff;font-size:16px;line-height:22px}
.dk-list a:hover span{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}
.dk-list .pict{width:40px;height:40px;flex:0 0 40px}
@media(max-width:900px){.dk{grid-template-columns:1fr;gap:40px}}
@media(max-width:480px){.dk-list{gap:4px 16px}.dk-list a{gap:14px;font-size:15px;align-items:flex-start}.dk-list .pict{width:34px;height:34px;flex-basis:34px}}

/* pictograms: 48x48 line drawings, 1.5px, currentColor; .pict-f fills at 18% */
.pict{display:block;width:48px;height:48px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;overflow:visible}
.pict *{vector-effect:non-scaling-stroke}
.pict .pf{fill:currentColor;stroke:none}
.pict .pt{fill:currentColor;fill-opacity:.18}
.pict .pd{stroke-dasharray:3 3}

/* ---- icon grid (three columns on white): navy pictogram, 22px title, a "Learn more ——" ---- */
.igrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:48px var(--gap)}
.igrid-i{display:flex;flex-direction:column;align-items:flex-start;max-width:400px}
.igrid-i .pict{color:var(--navy);margin-bottom:24px}
.igrid-i .eyebrow{margin-bottom:8px}
.igrid-i .c-title{margin-bottom:12px}
.igrid-i p:not(.eyebrow){font-size:16px;line-height:26px;color:var(--ink);margin-bottom:20px}
.igrid-i .lnk{margin-top:auto}
@media(max-width:900px){.igrid{grid-template-columns:1fr;gap:40px}.igrid-i{max-width:640px}}

/* ---- cards ----------------------------------------------------------------
   .card-pale  the news card: pale blue, date eyebrow, 22px title; the card is the link
   .card-top   the top-ruled card: white, 6px bright-blue top border, soft shadow, centred */
.card-pale{position:relative;display:flex;flex-direction:column;min-height:300px;padding:32px 32px 28px;background:var(--pale);color:var(--navy);transition:background-color var(--t-mid) var(--ease)}
.card-pale .eyebrow{font-size:13px;letter-spacing:.12em;margin-bottom:16px}
.card-pale .c-title{color:var(--navy)}
.card-pale .c-foot{margin-top:auto;padding-top:24px}
a.card-pale:hover{background:var(--pale2)}
a.card-pale:hover .c-title{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}
.card-top{display:flex;flex-direction:column;align-items:center;text-align:center;padding:32px 28px 36px;background:#fff;border-top:6px solid var(--brand);box-shadow:var(--shadow)}
.card-top .eyebrow{margin-bottom:10px;font-size:12px}
.card-top .c-title{margin-bottom:14px}
.card-top p:not(.eyebrow){font-size:15px;line-height:24px;color:var(--ink)}
.card-top .note{margin-top:12px;font-size:13px;line-height:20px;color:var(--text2)}
.cards{display:grid;grid-template-columns:repeat(var(--cols,3),minmax(0,1fr));gap:var(--gap)}
.cards.c4{--cols:4}.cards.c2{--cols:2}
@media(max-width:1100px){.cards.c4{--cols:2}}
@media(max-width:760px){.cards{--cols:1 !important}}

/* ---- drag row: a native horizontal scroller with a progress control beneath.
   Markup: <div class="drow" data-drow> <div class="drow-rail" tabindex="0" role="region" aria-label="…">
   <ul class="drow-track"><li class="drow-i">…</li>…</ul></div>
   <div class="drow-bar" hidden><input type="range" …></div></div>
   site.js wires it (mouse drag with glide, the range both ways, arrow keys item by item).
   Without JS it is a plain scroll row with a native scrollbar. The first item lines up with
   the container; the row runs off the right edge (full bleed). --dw sets the item width. */
.drow{--dw:410px;--dg:20px;position:relative}
.drow-rail{--dpad:max(var(--pad),calc((100% - var(--max))/2 + var(--pad)));overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scroll-padding-inline:var(--dpad);padding-bottom:4px}
.drow-rail:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
.drow-track{list-style:none;display:flex;gap:var(--dg);width:max-content;padding:0 var(--dpad)}
.drow-i{flex:0 0 var(--dw);width:var(--dw);scroll-snap-align:start;display:flex}
.drow-i>*{flex:1 1 auto;min-width:0}
.drow.dr-js .drow-rail{scrollbar-width:none}
.drow.dr-js .drow-rail::-webkit-scrollbar{display:none}
@media(hover:hover) and (pointer:fine){.drow.dr-js .drow-rail{cursor:grab;-webkit-user-select:none;user-select:none}.drow.dr-js .drow-rail a{cursor:pointer}.drow-rail.dr-grab,.drow-rail.dr-grab *{cursor:grabbing!important}}
@media(hover:none),(pointer:coarse){.drow-rail{scroll-snap-type:x proximity}}
.drow-rail.dr-drag{scroll-snap-type:none}
@media(max-width:560px){.drow{--dw:min(300px,calc(100vw - 72px))}}
/* the progress control: a bright-blue bar on a pale track, as an <input type=range> */
.drow-bar,.prog{max-width:var(--max);margin:40px auto 0;padding:0 var(--pad)}
.drow-bar[hidden]{display:none}
.prog-in,.drow-bar input{display:block;width:100%;height:24px;margin:0;padding:0;background:transparent;border:0;border-radius:0;cursor:pointer;-webkit-appearance:none;appearance:none}
.drow-bar input:focus{outline:none}
.drow-bar input:focus-visible{outline:2px solid var(--brand);outline-offset:4px}
.drow-bar input::-webkit-slider-runnable-track{height:24px;border:0;border-radius:0;background:linear-gradient(var(--pale2),var(--pale2)) center/100% 6px no-repeat}
.drow-bar input::-webkit-slider-thumb{width:var(--th,120px);height:24px;border:0;border-radius:0;background:linear-gradient(var(--brand),var(--brand)) center/100% 6px no-repeat;cursor:grab;-webkit-appearance:none;appearance:none}
.drow-bar input::-moz-range-track{height:6px;border:0;border-radius:0;background:var(--pale2)}
.drow-bar input::-moz-range-thumb{width:var(--th,120px);height:6px;border:0;border-radius:0;background:var(--brand);cursor:grab}
.on-dark .drow-bar input::-webkit-slider-runnable-track{background-image:linear-gradient(rgba(255,255,255,.25),rgba(255,255,255,.25))}
.on-dark .drow-bar input::-webkit-slider-thumb{background-image:linear-gradient(#fff,#fff)}
/* a static progress bar (no control): <div class="prog"><span style="--p:40%"></span></div> */
.prog>span{display:block;height:6px;background:linear-gradient(90deg,var(--brand) var(--p,30%),var(--pale2) var(--p,30%))}

/* ---- portrait cards: tall, square-cornered, image-led. Grounds vary along a row (art.TONES):
   brand / band / navy blues, .pale (navy type on pale blue), a photo (.photo, --img), ink. ---- */
.pcard{position:relative;display:flex;flex-direction:column;justify-content:flex-end;height:var(--ph,560px);overflow:hidden;isolation:isolate;color:#fff;background:var(--c,var(--band));padding:28px 24px 28px}
.pcard::before{content:'';position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(0,17,64,0) 38%,rgba(0,17,64,.55) 100%)}
.pcard .pc-art{position:absolute;z-index:-2;inset:0;width:100%;height:100%}
.pcard .pc-name{font-size:clamp(24px,2vw,28px);line-height:1.2;font-weight:300;color:#fff;margin:0}
.pcard .pc-desc{font-size:15px;line-height:22px;color:rgba(255,255,255,.9);margin-top:10px}
.pcard .pc-more{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--t-mid) var(--ease)}
.pcard .pc-more>div{overflow:hidden;min-height:0}
.pcard .pc-line{font-size:13px;line-height:18px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:#fff;padding-top:16px}
.pcard .pc-go{margin-top:16px}
a.pcard:hover .pc-more,a.pcard:focus-visible .pc-more,.pcard:focus-within .pc-more{grid-template-rows:1fr}
a.pcard:focus-visible{outline:3px solid #fff;outline-offset:-7px}
.pcard.pale{color:var(--navy)}
.pcard.pale::before{background:linear-gradient(180deg,rgba(237,245,255,0) 42%,rgba(208,226,255,.55) 100%)}
.pcard.pale .pc-name{color:var(--navy)}
.pcard.pale .pc-desc{color:var(--ink)}
.pcard.pale .pc-line{color:var(--brand)}
a.pcard.pale:focus-visible{outline-color:var(--navy)}
@media(hover:none){.pcard .pc-more{grid-template-rows:1fr}}
@media(prefers-reduced-motion:reduce){.pcard .pc-more{transition:none}}

/* ---- banners ------------------------------------------------------------------
   .banner        full-bleed photo or art (.bn-media) with a translucent navy box (.bn-box) at left
   .split         the side-by-side: a bordered white card (.split-card) beside a large photo or art (.split-media)
   Media take a photo as --img (set inline), or art (an inline <svg class="art">) — see COMPONENTS.md */
.banner{position:relative;isolation:isolate;overflow:hidden;color:#fff;min-height:400px;display:flex;align-items:center;padding:56px 0}
.bn-media{position:absolute;inset:0;z-index:-1;background:var(--band) var(--img,none) var(--pos,center)/cover no-repeat}
.bn-media.tint::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(0,29,108,.45),rgba(0,29,108,.05) 60%)}
.bn-media>svg{position:absolute;inset:0;width:100%;height:100%}
.banner>.wrap{width:100%}
.bn-box{position:relative;margin-left:var(--bx);max-width:560px;padding:clamp(28px,3.2vw,44px) clamp(24px,3.2vw,44px);background:var(--glass);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.bn-box.solid{background:var(--box);-webkit-backdrop-filter:none;backdrop-filter:none}
.bn-box .eyebrow{color:#fff;margin-bottom:16px}
.bn-box h2,.bn-box .s-title{font-family:var(--serif);font-weight:300;font-size:clamp(26px,2.4vw,34px);line-height:1.34;color:#fff;margin:0 0 16px}
.bn-box p:not(.eyebrow){font-size:16px;line-height:26px;color:rgba(255,255,255,.92);margin:0 0 28px}
.bn-box .btn{margin-top:4px}
@media(max-width:700px){.banner{min-height:0;padding:200px 0 0;align-items:flex-end}.banner>.wrap{padding:0}.bn-box{max-width:none;margin-left:0;padding:32px var(--pad) 40px;background:var(--box)}}
.split{display:grid;grid-template-columns:minmax(0,46fr) minmax(0,54fr);align-items:center}
.split-card{position:relative;z-index:1;border:1px solid var(--navy);background:#fff;padding:clamp(32px,4.2vw,72px) clamp(28px,4.2vw,72px);margin-right:-1px}
.split-card .eyebrow{margin-bottom:16px}
.split-card .s-title{margin-bottom:20px}
.split-card p:not(.eyebrow){font-size:16px;line-height:26px;margin-bottom:20px}
.split-media{position:relative;min-height:480px;align-self:stretch;background:var(--band) var(--img,none) var(--pos,center)/cover no-repeat}
.split-wrap{max-width:1440px;margin:0 auto;padding-left:max(var(--pad),calc((100% - var(--max))/2 + var(--pad)))}
@media(max-width:860px){.split{grid-template-columns:1fr}.split-wrap{padding-right:var(--pad)}.split-media{min-height:240px;order:-1;margin-left:48px;margin-right:calc(var(--pad)*-1)}.split-card{margin:-1px 0 0}}
/* phones: no stagger (a 48px step reads as a misalignment at this width) — the art runs edge to edge */
@media(max-width:600px){.split-wrap .split .split-media,.split-wrap .split.flip .split-media{margin-left:calc(var(--pad)*-1);margin-right:calc(var(--pad)*-1)}}
/* drawn art as a split's media: <div class="split-media art-ground" aria-hidden="true"><svg …></div> */
.split-media.art-ground{background:var(--pale);overflow:hidden}
.split-media.art-ground>svg{position:absolute;inset:0;width:100%;height:100%}
/* photo/text split on pale blue */
.psplit{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,6fr);gap:clamp(32px,5vw,72px);align-items:center}
.psplit-media{position:relative;aspect-ratio:1/1;overflow:hidden;background:var(--band) var(--img,none) var(--pos,center)/cover no-repeat}
.psplit-media>svg{position:absolute;inset:0;width:100%;height:100%}
@media(max-width:860px){.psplit{grid-template-columns:1fr}.psplit-media{aspect-ratio:16/10}}

/* ---- masthead (inner pages): art or photo under a navy tint, centred white Plex Light title ----
   <section class="mast [photo]" style="--img:url(/images/…)">[<div class="mast-art" aria-hidden="true">{svg}</div>]
     <div class="wrap"><p class="crumbs">…</p><p class="eyebrow">…</p><h1 class="h1">…</h1></div></section>
   The default ground is the drawn art (rings, dot grid, floating circles); .photo puts the photo
   under a duotone navy tint. Interim: .phero (the old masthead markup) wears the same coat.    */
.mast,.phero{position:relative;isolation:isolate;overflow:hidden;color:#fff;text-align:center;padding:clamp(56px,6vw,80px) 0;min-height:clamp(220px,18vw,264px);display:flex;align-items:center;
  background-color:var(--band);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 320' preserveAspectRatio='xMidYMid slice'%3E%3Cdefs%3E%3CradialGradient id='g' cx='.78' cy='.42' r='.75'%3E%3Cstop offset='0' stop-color='%23123FB4'/%3E%3Cstop offset='.5' stop-color='%23002D9C'/%3E%3Cstop offset='1' stop-color='%23002484'/%3E%3C/radialGradient%3E%3Cpattern id='d' width='14' height='14' patternUnits='userSpaceOnUse'%3E%3Ccircle cx='2' cy='2' r='1.3' fill='%23A6C8FF' fill-opacity='.42'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='1440' height='320' fill='url(%23g)'/%3E%3Cg fill='none' stroke='%23fff'%3E%3Ccircle cx='1130' cy='150' r='120' stroke-opacity='.22'/%3E%3Ccircle cx='1130' cy='150' r='190' stroke-opacity='.16'/%3E%3Ccircle cx='1130' cy='150' r='270' stroke-opacity='.11' stroke-dasharray='1 9' stroke-linecap='round' stroke-width='3'/%3E%3Ccircle cx='1130' cy='150' r='360' stroke-opacity='.08'/%3E%3Ccircle cx='250' cy='330' r='170' stroke-opacity='.12'/%3E%3Ccircle cx='250' cy='330' r='250' stroke-opacity='.07'/%3E%3C/g%3E%3Crect x='40' y='40' width='182' height='98' fill='url(%23d)'/%3E%3Crect x='1270' y='196' width='140' height='84' fill='url(%23d)'/%3E%3Cg fill='%2378A9FF'%3E%3Ccircle cx='1010' cy='62' r='9' fill-opacity='.5'/%3E%3Ccircle cx='1300' cy='86' r='16' fill-opacity='.28'/%3E%3Ccircle cx='940' cy='262' r='5' fill-opacity='.6'/%3E%3Ccircle cx='372' cy='70' r='6' fill-opacity='.45'/%3E%3Ccircle cx='520' cy='270' r='12' fill-opacity='.22'/%3E%3C/g%3E%3C/svg%3E");
  background-size:cover;background-position:center}
.mast.photo{background-image:none}
/* a masthead with its own drawn ground (art.mast_art: vary the rings' centre and the ghosted drawing per hub).
   The ghosted drawing sits at the far side, which a phone crops away, so art.mast_art also writes it once more as
   <svg class="mast-fig"> (its rings round it): shown only at 600px and below, centred above the crumbs and title. */
.mast-art{position:absolute;inset:0;z-index:-1;overflow:hidden;background:var(--band)}
.mast-art>svg{position:absolute;inset:0;width:100%;height:100%}
.mast-art>svg.mast-fig{display:none}
@media(max-width:600px){
  .mast:has(.mast-fig){padding-top:116px}
  .mast-art>svg.mast-fig{display:block;inset:auto;top:-18px;left:50%;width:320px;height:160px;margin-left:-160px;overflow:visible}
}
/* one recipe for every photo masthead (v15): the photo's greys, their range lifted toward white (contrast .56,
   brightness 1.42) so the darkest area lands near band blue and the lightest at the multiply colour, under ONE blue
   multiply (#2747B4) and ONE navy scrim. Every photo masthead then sits at the drawn mastheads' value, its subject
   still legible, and white type keeps at least 7:1 on its lightest area. Crops (--pos, --size) are the page's. */
.mast.photo::before{content:'';position:absolute;inset:0;z-index:-2;background:var(--img) var(--pos,center)/cover no-repeat;filter:grayscale(1) contrast(.56) brightness(1.42)}
.mast.photo::after{content:'';position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(0,29,108,.16),rgba(0,29,108,.34)),#2747B4;mix-blend-mode:multiply}
.mast>.wrap,.phero>.wrap{width:100%}
.mast .h1,.phero .h1{color:#fff;font-weight:300;max-width:980px;margin:0 auto;text-wrap:balance}
.mast .eyebrow,.phero .eyebrow{color:#fff;opacity:.92;margin-bottom:16px}
.crumbs,.phero .crumbs{font-size:13px;line-height:18px;letter-spacing:.02em;color:rgba(255,255,255,.82);margin-bottom:16px}
.mast .crumbs+.h1{margin-top:4px}
.crumbs a{color:#fff;text-decoration:underline;text-underline-offset:3px;text-decoration-color:rgba(255,255,255,.5)}
.crumbs a:hover{text-decoration-color:#fff}
.phero .lead{color:rgba(255,255,255,.92);margin:24px auto 0;max-width:820px;font-size:17px;line-height:28px}
.phero .recrow{justify-content:center;margin-top:32px!important}
.phero .recrow dt{color:rgba(255,255,255,.75)}
.phero .recrow dd{color:#fff}
.phero .rec{color:var(--pale3)}
.phero .btns{justify-content:center;margin-top:32px}
.phero .btn-primary{background:#fff;color:var(--navy)}.phero .btn-primary:hover{background:var(--pale2)}
.phero .btn-tertiary{color:#fff;border-color:#fff}.phero .btn-tertiary:hover{background:#fff;color:var(--navy)}
/* the centred intro under a masthead (or under its anchor strip), with its CTA: one rule for every page (v14) —
   the same space below the masthead or strip everywhere, the lead on a centred 760px measure; .l is the hubs'
   left-aligned intro (eyebrow, serif title, a full-measure lead). Phones left-align every intro. */
.intro{max-width:880px;margin:0 auto;text-align:center}
.intro p:not(.eyebrow){font-size:17px;line-height:28px}
.intro>p:not(.eyebrow),.intro .lead{max-width:760px;margin-left:auto;margin-right:auto}
.intro .s-title{margin-bottom:16px}
.intro .btns{justify-content:center;margin-top:28px}
.intro .recrow{justify-content:center;margin-top:28px}
.sec.intro-sec{padding:clamp(40px,4vw,56px) 0 clamp(48px,5vw,72px)}
.intro.l{max-width:1120px;margin:0;text-align:left}
.intro.l p:not(.eyebrow){font-size:17px;line-height:28px;max-width:760px;margin-left:0}
.intro.l .btns{justify-content:flex-start}
@media(max-width:600px){.intro{text-align:left}.intro>p:not(.eyebrow),.intro .lead{margin-left:0}.intro .btns,.intro .recrow{justify-content:flex-start}}
.recrow{display:flex;flex-wrap:wrap;gap:16px 40px}
.recrow dt{font-size:12px;line-height:16px;letter-spacing:.1em;text-transform:uppercase;color:var(--text2)}
.recrow dd{font-size:15px;line-height:22px;color:var(--navy);margin-top:4px}

/* ---- anchor strip (OUR DIFFERENCE | RELATED SERVICES | …) — the .pnav/.pill contract
   site.js drives: sticky under the header, uppercase 12px links between thin bars; the tab of
   the section in view turns blue with a 2px rule. From 1024px every anchor shows: the strip
   wraps to centred rows (44px each) instead of scrolling; below it scrolls with a fade.
   Tab targets: scroll-margin-top:calc(var(--hdr-h) + var(--pnav-h)) — --pnav-h follows. */
.pnav{position:sticky;top:var(--hdr-h);z-index:40;background:#fff;box-shadow:inset 0 -1px 0 var(--rule)}
.pnav .row{max-width:var(--max);margin:0 auto;padding:0 var(--pad);display:flex;height:56px;overflow-x:auto;scrollbar-width:none}
.pnav .row::-webkit-scrollbar,.pn-tabs::-webkit-scrollbar{display:none}
.pn-name{display:none}
.pn-tabs{display:flex;flex:1 1 auto;min-width:0;justify-content:safe center;overflow-x:auto;scrollbar-width:none;scroll-behavior:smooth;margin:0 calc(var(--pad)*-1);padding:0 var(--pad)}
.pnav .row:has(.pn-tabs){overflow:visible}
.pnav.of-r .pn-tabs{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 32px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 32px),transparent)}
.pnav.of-l .pn-tabs{-webkit-mask-image:linear-gradient(90deg,transparent,#000 32px);mask-image:linear-gradient(90deg,transparent,#000 32px)}
.pnav.of-l.of-r .pn-tabs{-webkit-mask-image:linear-gradient(90deg,transparent,#000 32px,#000 calc(100% - 32px),transparent);mask-image:linear-gradient(90deg,transparent,#000 32px,#000 calc(100% - 32px),transparent)}
.pill{position:relative;flex:0 0 auto;display:inline-flex;align-items:center;background:none;border:0;border-radius:0;padding:0 14px;height:56px;font-size:12px;line-height:16px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--navy);white-space:nowrap;cursor:pointer}
.pnav .pill+.pill::before{content:'';position:absolute;left:0;top:50%;width:1px;height:16px;margin-top:-8px;background:var(--rule)}
.pnav .pill.row-start::before{content:none}
.pill::after{content:'';position:absolute;left:14px;right:14px;bottom:0;height:2px;background:var(--brand);transform:scaleX(0);transition:transform var(--t-mid) var(--ease)}
.pill:hover{color:var(--brand)}
.pill.active{color:var(--brand)}
.pill.active::after{transform:scaleX(1)}
.pill:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
/* chips (the insights filter): the same uppercase links, ruled beneath */
.chips{display:flex;flex-wrap:wrap;gap:0;border-bottom:1px solid var(--rule);margin-bottom:32px}
.chips .pill{height:48px}
@media(min-width:1024px){
  :root:has(.pnav){--pnav-h:96px}
  .pnav .row{height:auto;overflow:visible}
  .pn-tabs{flex-wrap:wrap;justify-content:center;overflow:visible;margin:0;padding:6px 0;row-gap:0}
  .pnav .pill{height:44px;padding:0 10px;letter-spacing:.06em}
  .pnav .pill::after{left:10px;right:10px}
  .pnav.of-r .pn-tabs,.pnav.of-l .pn-tabs,.pnav.of-l.of-r .pn-tabs{-webkit-mask-image:none;mask-image:none}
}
@media(prefers-reduced-motion:reduce){.pn-tabs{scroll-behavior:auto}.pill::after{transition:none}}
/* the strip sticks only while its page's content scrolls: the builders wrap the strip and the content in
   <div class="pn-scope">, which ends before the closing band, so the strip never rides over the band (v15).
   The sticky reading rail (case pages) starts below the strip. */
body:has(.pnav:not(.side)) .rdg-rail{top:calc(var(--hdr-h) + var(--pnav-h) + 24px)}

/* ---- tabs (pale inactive, white active with a bright-blue top rule) ---- */
.tabs2{display:flex;flex-wrap:nowrap;gap:4px;overflow-x:auto;scrollbar-width:none}
.tabs2::-webkit-scrollbar{display:none}
.tab2{flex:0 0 auto;height:48px;padding:0 22px;border:0;border-top:3px solid transparent;border-radius:0;background:var(--pale);color:var(--navy);font:inherit;font-size:15px;white-space:nowrap;cursor:pointer;transition:background-color var(--t-fast),border-color var(--t-fast)}
.tab2:hover{background:var(--pale2)}
.tab2[aria-selected="true"]{background:#fff;border-top-color:var(--brand);box-shadow:var(--shadow-s)}
.tab2:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}

/* ---- the research list: ruled rows, a thumbnail, a date eyebrow,
   a 22px title, a two-line excerpt and READ MORE > ------------------------------------------ */
.res{list-style:none;border-top:1px solid var(--rule)}
.res>li{border-bottom:1px solid var(--rule)}
.res-i{display:grid;grid-template-columns:200px minmax(0,1fr);gap:20px 40px;align-items:start;padding:28px 20px}
.res-i .thumb{width:200px;height:190px}
.res-i .eyebrow{font-size:12px;letter-spacing:.12em;margin:4px 0 8px}
.res-i .c-title{margin-bottom:10px}
.res-i .c-title a:hover{color:var(--brand)}
.res-i p:not(.eyebrow){font-size:15px;line-height:24px;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-bottom:14px}
@media(max-width:640px){.res-i{grid-template-columns:1fr;padding:24px 0}.res-i .thumb{width:100%;height:auto;aspect-ratio:16/10}.res-i .thumb-lbl{width:120px}}
/* the thumbnail: a photo (--img) or drawn art, with the bright-blue square label in its LOWER-LEFT CORNER (v14: one
   cover everywhere — the homepage's work row, /work, /insights and the related rows). Drawn thumbnails come from
   work_pages.thumb_svg(), which sets the drawing clear of the label (its .tdw group); 'Representative engagement' fits
   the 112px square with room to spare */
.thumb{position:relative;display:block;overflow:hidden;background:var(--pale2) var(--img,none) var(--pos,center)/cover no-repeat}
.thumb>svg{position:absolute;inset:0;width:100%;height:100%}
.thumb .tdw{transform-box:view-box;transform-origin:262px 104px}
.thumb-lbl{position:absolute;left:0;bottom:0;width:112px;aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;padding:10px;background:rgba(13,91,225,.92);color:#fff;font-size:13px;line-height:17px;font-weight:400;letter-spacing:.01em;text-align:center;overflow-wrap:normal;hyphens:none}
@media(max-width:640px){.thumb-lbl{width:100px;padding:8px;font-size:12px;line-height:16px}}
.thumb.photo::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(208,226,255,.12),rgba(0,29,108,.18))}
/* cover card (the research list as a card row): thumbnail on top */
.cover{display:flex;flex-direction:column}
.cover .thumb{aspect-ratio:16/11;margin-bottom:24px}
.cover .eyebrow{font-size:12px;letter-spacing:.12em;margin-bottom:8px}
.cover .c-title{margin-bottom:10px}
.cover p:not(.eyebrow){font-size:15px;line-height:24px;color:var(--ink);margin-bottom:16px}
.cover .lnk-caps{margin-top:auto}
a.cover:hover .c-title{color:var(--brand)}
.thumb>svg,a.cover .thumb img{transition:transform .6s var(--ease)}
a.cover:hover .thumb>svg{transform:scale(1.03)}
@media(prefers-reduced-motion:reduce){.thumb>svg,a.cover .thumb img{transition:none}}
/* from 961px down to 641px a GRID of covers (.cards) becomes a list: the thumbnail at left, the text beside it.
   Scoped to .cards (v15): covers inside a drag row or a .dt-grid keep the stacked card at every width. */
@media(max-width:960px) and (min-width:641px){.cards:has(>.cover){--cols:1 !important;row-gap:40px}
  .cards>.cover{display:grid;grid-template-columns:240px minmax(0,1fr);column-gap:32px;align-items:start}
  .cards>.cover .thumb{grid-row:1/span 5;margin:0;aspect-ratio:auto;height:200px}
  .cards>.cover>:not(.thumb){grid-column:2}}

/* ---- ticker (the strip under the hero): LABEL Title items scrolling right to left,
   a square pause control at right. site.js adds .tk-on to start it (so without JS it is a
   static, scrollable row) and never with reduced motion. The second copy of the items is
   aria-hidden with tabindex=-1 links. .tk-blue is the bright-blue band variant.            */
.tk{position:relative;display:flex;align-items:center;height:60px;background:var(--pale);color:var(--navy);overflow:hidden}
.tk-view{flex:1 1 auto;min-width:0;height:100%;overflow-x:auto;scrollbar-width:none;display:flex;align-items:center;-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 56px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 56px),transparent)}
.tk-view::-webkit-scrollbar{display:none}
.tk-track{display:flex;align-items:center;width:max-content;will-change:transform}
.tk-set{display:flex;align-items:center;list-style:none}
.tk-set li{flex:0 0 auto}
.tk-set a{display:inline-flex;align-items:baseline;gap:10px;padding:0 28px;font-size:16px;line-height:60px;white-space:nowrap;color:inherit}
.tk-set a b{font-size:13px;font-weight:600;letter-spacing:.12em;text-transform:uppercase}
.tk-set a:hover span{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}
.tk-set a:focus-visible{outline-offset:-3px}
.tk-set+.tk-set{display:none}
.tk.tk-on .tk-view{overflow:hidden}
.tk.tk-on .tk-set+.tk-set{display:flex}
.tk.tk-on .tk-track{animation:tkRun var(--tk-dur,60s) linear infinite}
.tk.tk-on:hover .tk-track,.tk.tk-on:focus-within .tk-track,.tk.tk-paused .tk-track{animation-play-state:paused}
@keyframes tkRun{to{transform:translateX(-50%)}}
.tk-ctl{flex:0 0 auto;display:flex;align-items:center;padding:0 var(--pad) 0 8px;height:100%;background:inherit}
.tk-ctl[hidden]{display:none}
.tk-blue{--tk-bg:var(--brand);background:var(--brand);color:#fff}
.tk-blue .ibtn{border-color:#fff;color:#fff}
.tk-blue .ibtn:hover{background:#fff;color:var(--brand)}
@media(prefers-reduced-motion:reduce){.tk.tk-on .tk-track{animation:none}.tk.tk-on .tk-view{overflow-x:auto}.tk.tk-on .tk-set+.tk-set{display:none}}
/* the static row (no JS, or reduced motion): the items wrap onto as many lines as they need, so every one can be
   seen and clicked; .tk-hold (a focused item while the marquee would run) keeps the one scrolling line instead */
.tk:not(.tk-on):not(.tk-hold){height:auto;min-height:60px;padding:6px 0}
.tk:not(.tk-on):not(.tk-hold) .tk-view{height:auto;overflow:visible;-webkit-mask-image:none;mask-image:none}
.tk:not(.tk-on):not(.tk-hold) .tk-track{width:auto}
.tk:not(.tk-on):not(.tk-hold) .tk-set{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:var(--gap);padding:6px max(var(--pad),calc((100vw - var(--max)) / 2 + var(--pad)))}
.tk:not(.tk-on):not(.tk-hold) .tk-set{flex:1 1 auto;min-width:0;align-items:start}
.tk:not(.tk-on):not(.tk-hold) .tk-set+.tk-set{display:none}
.tk:not(.tk-on):not(.tk-hold) .tk-set li{min-width:0}
.tk:not(.tk-on):not(.tk-hold) .tk-set a{display:block;line-height:24px;padding:10px 0;white-space:normal}
.tk:not(.tk-on):not(.tk-hold) .tk-set a b{margin-right:10px;white-space:nowrap}
@media(max-width:899px){.tk:not(.tk-on):not(.tk-hold) .tk-set{grid-template-columns:minmax(0,1fr)}}
/* a focused item: the one line scrolls, and its end clears the 56px fade so the last item can show whole */
.tk.tk-hold .tk-set{padding-right:56px}
/* phones (v15): most items are wider than the view, so a focused item could show only its label — while focus is in
   the ticker the items stand as the wrapping list instead, every one whole */
@media(max-width:600px){
  .tk.tk-hold{height:auto;min-height:60px;padding:6px 0}
  .tk.tk-hold .tk-view{height:auto;overflow:visible;-webkit-mask-image:none;mask-image:none}
  .tk.tk-hold .tk-track{width:auto}
  .tk.tk-hold .tk-set{display:grid;grid-template-columns:minmax(0,1fr);flex:1 1 auto;min-width:0;align-items:start;padding:6px 0 6px var(--pad)}
  .tk.tk-hold .tk-set+.tk-set{display:none}
  .tk.tk-hold .tk-set li{min-width:0}
  .tk.tk-hold .tk-set a{display:block;line-height:24px;padding:10px 0;white-space:normal}
  .tk.tk-hold .tk-set a b{margin-right:10px;white-space:nowrap}
}

/* ---- art: inline SVG line drawings and fields, coloured by tokens -----------------------
   .art sets --ai (ink: the line colour), --af (a translucent fill) and --ak (knockout: the
   ground colour). Classes inside: a-l line · a-w wide · a-d dashed · a-f filled shape ·
   a-f2 stronger fill · a-s solid · a-b bar (45%) · a-g faint · a-h hairline · a-k knockout.
   The drawings (art.py in the redesign tools) are written with these classes.             */
.art{--ai:#fff;--af:rgba(255,255,255,.14);--ak:var(--band);display:block;overflow:visible}
.art.on-pale{--ai:var(--brand);--af:rgba(13,91,225,.1);--ak:var(--pale)}
.art *{vector-effect:non-scaling-stroke}
.art .a-l{fill:none;stroke:var(--ai);stroke-width:1.5}
.art .a-w{stroke-width:2.5}
.art .a-d{stroke-dasharray:6 6}
.art .a-f{fill:var(--af);stroke:var(--ai);stroke-width:1.5}
.art .a-f2{fill:var(--af);fill-opacity:1;stroke:var(--ai);stroke-width:2.5}
.art .a-s{fill:var(--ai)}
.art .a-b{fill:var(--ai);fill-opacity:.45}
.art .a-g{fill:var(--ai);fill-opacity:.14}
.art .a-h{fill:none;stroke:var(--ai);stroke-opacity:.55;stroke-width:1}
.art .a-k{fill:var(--ak)}
.art .a-kt{fill:none;stroke:var(--ak);stroke-width:2;stroke-linecap:square}


/* ---- a drag row that is a grid on wide screens (homepage stages and covers): .drow.dt-grid, --cols.
   From 861px the items stand in a grid (no bar, no drag); below, it is the usual drag row. ---- */
@media(min-width:861px){
  .drow.dt-grid .drow-rail{overflow:visible;cursor:auto!important;-webkit-user-select:auto!important;user-select:auto!important}
  .drow.dt-grid .drow-track{display:grid;grid-template-columns:repeat(var(--cols,3),minmax(0,1fr));gap:var(--gap);width:auto;max-width:var(--max);margin:0 auto;padding:0 var(--pad)}
  .drow.dt-grid .drow-i{width:auto}
  .drow.dt-grid .drow-bar{display:none!important}
}
@media(min-width:861px) and (max-width:1100px){.drow.dt-grid.c4{--cols:2}}

/* ---- the hub: a left filter column beside groups under serif titles (services, industries) ----------
   <div class="hub"><nav class="pnav side" aria-label="…"><div class="row"><p class="pn-cap">Label</p>
     <div class="pn-tabs"><button class="pill" type="button" data-t="engineering">Product Engineering</button>…</div></div></nav>
   <div class="hub-main"><section class="grp" id="engineering">…</section>…</div></div>
   The .pnav is the same contract site.js drives. From 1024px it is a sticky column of rows with a chevron,
   the row in view on pale blue with a blue edge; below 1024px it is the usual sticky strip across the top.
   (.dense is retired: both hubs share one row size since v15.) Groups are ruled apart; each opens with an eyebrow and a
   serif title. --pnav-h is small in the column layout (nothing sits above a section but the header). */
.hub{max-width:var(--max);margin:0 auto;padding:0 var(--pad) var(--sec)}
.hub-main{min-width:0}
.pnav.side{margin:0 calc(var(--pad)*-1)}
.pn-cap{display:none}
@media(min-width:1024px){
  :root:has(.pnav.side){--pnav-h:24px}
  .hub{display:grid;grid-template-columns:248px minmax(0,1fr);column-gap:clamp(48px,5vw,80px);align-items:start}
  .pnav.side{margin:0;top:calc(var(--hdr-h) + 32px);z-index:5;background:none;box-shadow:none;max-height:calc(100vh - var(--hdr-h) - 56px);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--pale3) transparent}
  .pnav.side .row{display:block;height:auto;padding:0;max-width:none;overflow:visible}
  .pnav.side .pn-cap{display:block;font-size:13px;line-height:18px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--brand);padding:0 0 14px}
  .pnav.side .pn-tabs{flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;margin:0;padding:0;overflow:visible;border-top:1px solid var(--rule);-webkit-mask-image:none!important;mask-image:none!important}
  .pnav.side .pill{height:auto;min-height:40px;padding:8px 40px 8px 16px;justify-content:flex-start;text-align:left;white-space:normal;text-transform:none;letter-spacing:0;font-size:15px;line-height:22px;font-weight:400;color:var(--navy);border-bottom:1px solid var(--rule)}
  .pnav.side .pill::before{content:none}
  .pnav.side .pill::after{left:auto;right:14px;bottom:auto;top:50%;width:8px;height:8px;margin-top:-4px;background:none;border-right:1.5px solid currentColor;border-top:1.5px solid currentColor;transform:rotate(45deg);transition:transform var(--t-fast) var(--ease)}
  .pnav.side .pill:hover{background:var(--pale);color:var(--navy)}
  .pnav.side .pill:hover::after{transform:translateX(3px) rotate(45deg)}
  .pnav.side .pill.active{background:var(--pale);color:var(--navy);font-weight:600;box-shadow:inset 3px 0 0 var(--brand)}
  .pnav.side .pill.sub{padding-left:32px;font-size:14px;color:var(--text2)}
  .pnav.side .pill.sub.active,.pnav.side .pill.sub:hover{color:var(--navy)}
  /* (v15: one row size on both hubs — 40px rows, 15px type — for nine studios and eighteen industries alike) */
}
/* shorter windows: both hubs' rows tighten together, so the nineteen rows of /industries still fit beside the panel */
@media(min-width:1024px) and (max-height:860px){.pnav.side .pill,.pnav.side .pill.sub{min-height:32px;padding-top:5px;padding-bottom:5px;font-size:14px;line-height:21px}}
.grp{position:relative;padding:clamp(48px,4.4vw,64px) 0;border-top:1px solid var(--rule);scroll-margin-top:calc(var(--hdr-h) + var(--pnav-h))}
.grp:last-child{padding-bottom:0}
@media(max-width:1023px){.grp:first-child{border-top:0}}
.grp-hd{margin-bottom:28px}
.grp-hd .eyebrow{margin-bottom:10px}
.grp-hd .s-title{font-size:clamp(28px,2.6vw,36px)}
.grp-sub{font-size:15px;line-height:22px;color:var(--text2);margin-top:10px;max-width:720px}
.grp-t{font-family:var(--serif);font-weight:300;font-size:clamp(22px,1.9vw,26px);line-height:1.36;color:var(--navy);margin:clamp(36px,3.6vw,48px) 0 20px}
.grp-t.c{text-align:center}
/* a split inside a group: the studio's drawing (or his photo) beside the lead and the call to action */
.grp-split{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(28px,3.5vw,48px);align-items:center}
.grp-split.flip{grid-template-columns:minmax(0,7fr) minmax(0,5fr)}
.grp-split.flip>.grp-media{order:2}
@media(max-width:700px){.grp-split.flip>.grp-media{order:0}}
.grp-split .lead{max-width:none}
.grp-split .btn{margin-top:28px}
.grp-media{position:relative;aspect-ratio:1/1;overflow:hidden;background:var(--pale) var(--img,none) var(--pos,center)/cover no-repeat}
.grp-media>svg{position:absolute;inset:0;width:100%;height:100%}
/* .duo: a photo (--img) in its greys under a blue multiply — for a photo whose own colour fights the palette (the cloud).
   Works on any element whose background is the photo; the masthead photos use their own ::before/::after pair. */
.duo{background-color:#fff!important;background-image:linear-gradient(170deg,#B9D1FF 0%,#6C98F4 45%,#2A5CD8 100%),var(--img)!important;background-size:auto,cover!important;background-position:0 0,var(--pos,center)!important;background-repeat:no-repeat!important;background-blend-mode:multiply,luminosity}
.duo::after{content:none!important}
.grp-media.photo::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,45,156,.12),rgba(0,29,108,.38));mix-blend-mode:multiply}
@media(max-width:700px){.grp-split,.grp-split.flip{grid-template-columns:1fr}.grp-media{aspect-ratio:16/10}}
/* the pale box (How we help): a serif title and the list in two columns */
.grp-box{background:var(--pale);padding:clamp(28px,3vw,40px);margin-top:clamp(32px,3.4vw,48px)}
.grp-box .grp-t{margin:0 0 20px}
.checks.c2{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 40px}
@media(max-width:760px){.checks.c2{grid-template-columns:1fr}}
/* expect cards: a check badge, one sentence, centred, on the top-ruled white card */
.expect{list-style:none}
.expect .card-top{padding:26px 22px 28px;justify-content:flex-start}
.expect .card-top .ok{width:32px;height:32px;margin-bottom:14px;flex-shrink:0}
.expect .card-top p{font-size:16px;line-height:24px;color:var(--navy)}
/* phones: the cards become compact rows (badge left, sentence right) so four of them do not take a screen and a half */
@media(max-width:760px){.expect.cards{gap:12px}.expect .card-top{flex-direction:row;align-items:flex-start;text-align:left;gap:14px;padding:16px 16px 18px;border-top-width:4px}.expect .card-top .ok{width:26px;height:26px;margin:0}.expect .card-top p{font-size:15px;line-height:23px;padding-top:2px}}

/* ---- the hub panel (services, industries — v14): one studio or sector as a banner, a pale help box and white
   cards lifted over the box's lower edge. Shared so the two hubs cannot drift; each page keeps only its own content
   rules and its one-at-a-time / accordion behaviour.
   <div class="hb"><div class="hb-card"><div class="hb-hd">{pict}<div class="hb-hn"><p class="eyebrow">…</p>
       <h2 class="hb-t">Name</h2><p class="hb-sub">Descriptor</p></div></div>[more]</div>
     <div class="hb-media" aria-hidden="true">{svg, or a photo}</div></div>
   <div class="hbox lift-under"><h3 class="hbox-t">How we help</h3><ul class="checks c2">…</ul></div>
   <div class="lifted"><h3 class="hbox-t">…</h3><ul class="lift-cards"><li class="lift-card">…</li>…</ul></div>
   From 1280px the banner's picture runs to the window's right edge (wrap the hub in .hub-clip); 1024–1279 the
   picture sits above with the card over its lower edge; below 1024 the card's head becomes a row (pictogram, name,
   descriptor) with the picture under it. --lift sets how far the cards rise (default 80px), --lc their columns. */
.hub-clip{overflow-x:clip}
.hb-hd .pict{color:var(--navy);flex-shrink:0}
.hb-hd .eyebrow{font-size:12px;line-height:16px;letter-spacing:.14em;margin:0 0 8px}
.hb-t{font-family:var(--serif);font-weight:300;color:var(--navy);text-wrap:balance}
.hb-sub{font-size:15px;line-height:22px;color:var(--text2);text-wrap:pretty}
.hb-media{position:relative;overflow:hidden;background:var(--pale)}
.hb-media>svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.hbox{background:var(--pale);padding:clamp(28px,3vw,40px)}
.hbox-t{font-family:var(--serif);font-weight:300;font-size:clamp(22px,1.9vw,26px);line-height:1.36;color:var(--navy);margin:0 0 20px}
.lift-cards{list-style:none;display:grid;grid-template-columns:repeat(var(--lc,2),minmax(0,1fr));gap:20px}
.lift-card{background:#fff;border-top:6px solid var(--brand);box-shadow:var(--shadow)}
/* the studio's or sector's lead and its call to action, inside the banner card under a hairline (v15: both hubs) */
.hb-more p{font-size:16px;line-height:26px;color:var(--ink);text-wrap:pretty}
.hb-more .btn{margin-top:28px}
@media(min-width:1024px){
  .hb{display:grid;grid-template-columns:minmax(0,52fr) minmax(0,48fr);align-items:stretch}
  .hb-card{position:relative;z-index:1;align-self:center;margin:40px -1px 40px 0;padding:clamp(32px,3vw,44px);background:#fff;border:1px solid var(--navy)}
  .hb-hd .pict{width:48px;height:48px;margin-bottom:22px}
  .hb-t{font-size:clamp(28px,2.5vw,36px);line-height:1.3}
  .hb-sub{margin-top:8px}
  .hb-more{margin-top:22px;padding-top:22px;border-top:1px solid var(--rule)}
  .hb-media{min-height:440px}
  .hbox-t{text-align:center;margin-bottom:24px}
  .hbox.lift-under{padding-bottom:calc(clamp(28px,3vw,40px) + var(--lift,80px))}
  .lifted{position:relative;margin-top:calc(-1 * var(--lift,80px));padding:0 clamp(28px,3vw,40px)}
  .lifted>.eyebrow{text-align:center}
}
@media(min-width:1280px){.hb .hb-media{margin-right:calc(-1 * max(var(--pad),(100vw - var(--max)) / 2 + var(--pad)))}}
@media(min-width:1024px) and (max-width:1279px){
  .hb{grid-template-columns:minmax(0,1fr)}
  .hb-media{order:-1;min-height:0;aspect-ratio:16/9}
  .hb-card{margin:-56px 40px 0 0;align-self:auto}
}
@media(max-width:1023px){
  .hb{display:flex;flex-direction:column}
  .hb-card{display:contents}
  .hb-hd{order:1;position:relative;display:flex;align-items:center;gap:16px;padding:18px 0}
  .hb-hd .pict{width:40px;height:40px;margin:0}
  .hb-hn{min-width:0;flex:1 1 auto}
  .hb-t{font-size:21px;line-height:1.3}
  .hb-sub{font-size:14px;line-height:20px;margin-top:3px}
  .hb-media{order:2;aspect-ratio:16/10;margin:4px 0 0}
  .hb-card>:not(.hb-hd){order:3}
  .hb-more{margin-top:24px}
  .hb-more .btn{margin-top:24px}
  .hbox{padding:24px 20px 28px}
  .lifted{margin-top:28px}
  .lift-cards{gap:10px}
  .lift-card{border-top-width:4px;box-shadow:var(--shadow-s)}
}
@media(min-width:600px) and (max-width:1023px){.hb-media{aspect-ratio:2/1}}
@media(max-width:599px){.lift-cards{grid-template-columns:minmax(0,1fr)}.hbox .checks.c2{grid-template-columns:minmax(0,1fr)}}

/* ---- "difference": a pale band with a centred head, the top-ruled cards lifted over its lower edge ----
   <section class="diff"><div class="wrap"><div class="sechd c">…</div></div></section>
   <div class="lift"><div class="wrap"><div class="cards c4">…card-top…</div></div></div> */
.diff{background:var(--pale);padding:var(--sec) 0 calc(var(--sec) + 80px)}
.diff .sechd{margin-bottom:0}
.lift{margin-top:-80px;padding-bottom:var(--sec);position:relative}
.lift .card-top h3{font-size:20px;line-height:28px;margin-bottom:12px}

/* ---- the filter bar (insights, work): a pale strip with a label, the filters and a note at right ---- */
.fbar{background:var(--pale)}
.fbar-in{display:flex;align-items:center;flex-wrap:wrap;gap:4px 24px;min-height:60px}
.fbar-l{font-size:12px;line-height:16px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.fbar .chips{border:0;margin:0}
.fbar .chips .pill{height:60px;padding:0 14px}
.fbar .chips .pill+.pill::before{content:'';position:absolute;left:0;top:50%;width:1px;height:16px;margin-top:-8px;background:var(--pale3)}
.fbar-r{margin-left:auto;font-size:13px;line-height:18px;color:var(--text2)}
@media(max-width:700px){.fbar-in{padding-top:8px;padding-bottom:8px}.fbar .chips .pill{height:44px}.fbar-r{margin-left:0;flex-basis:100%;padding-bottom:6px}}
.res-w{max-width:1040px;margin-left:auto;margin-right:auto}

/* ---- the studio list (About): a pictogram, the name and his long blurb, two columns of ruled rows ---- */
.slist{list-style:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:clamp(32px,4vw,64px);border-top:1px solid var(--rule)}
.slist li{border-bottom:1px solid var(--rule)}
.slist a{display:grid;grid-template-columns:48px minmax(0,1fr) 20px;gap:22px;padding:28px 0;align-items:start}
.slist .pict{color:var(--navy)}
.slist b{display:block;font-size:20px;line-height:28px;font-weight:400;color:var(--navy);margin-bottom:6px}
.slist span{display:block;font-size:15px;line-height:24px;color:var(--ink)}
.slist .ar{color:var(--brand);margin-top:4px;transition:transform var(--t-fast) var(--ease)}
.slist a:hover b{color:var(--brand)}
.slist a:hover .ar{transform:translateX(4px)}
@media(max-width:860px){.slist{grid-template-columns:1fr}}
@media(max-width:480px){.slist a{grid-template-columns:36px minmax(0,1fr);gap:16px}.slist .pict{width:36px;height:36px}.slist .ar{display:none}}

/* ---- related links with pictograms (industries: the studios behind a sector) ---- */
.rel{list-style:none;border-top:1px solid var(--rule)}
.rel li{border-bottom:1px solid var(--rule)}
.rel a{display:flex;align-items:center;gap:16px;min-height:56px;padding:8px 0;font-size:16px;line-height:22px;color:var(--navy)}
.rel .pict{width:32px;height:32px;flex:0 0 32px;color:var(--navy)}
.rel a::after{content:'';margin-left:auto;width:7px;height:7px;border-right:1.5px solid var(--brand);border-top:1.5px solid var(--brand);transform:rotate(45deg);margin-right:6px;transition:transform var(--t-fast) var(--ease)}
.rel a:hover{color:var(--brand)}
.rel a:hover::after{transform:translateX(3px) rotate(45deg)}

/* ---- legacy content forms, restyled to the system (inner pages until rebuilt) ---------- */
.tiles{display:grid;grid-template-columns:repeat(var(--cols,4),minmax(0,1fr));gap:var(--gap)}
.tiles.t5{--cols:5}.tiles.t4{--cols:4}.tiles.t3{--cols:3}.tiles.t2{--cols:2}
@media(max-width:1100px){.tiles.t5,.tiles.t4{--cols:3}}
@media(max-width:760px){.tiles.t5,.tiles.t4,.tiles.t3{--cols:2}}
@media(max-width:560px){.tiles{--cols:1 !important}}
.tile{display:flex;flex-direction:column;min-height:260px;padding:28px 28px 24px;background:var(--pale);color:var(--navy);transition:background-color var(--t-mid) var(--ease)}
a.tile:hover{background:var(--pale2)}
.tile .lbl{display:block;font-size:12px;line-height:16px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--brand);margin-bottom:16px}
.tile h3{font-size:21px;line-height:29px;font-weight:400;color:var(--navy);margin-bottom:10px}
.tile p:not(.eyebrow){font-size:15px;line-height:23px;color:var(--ink);flex:1}
.tile .ar{margin-top:20px;color:var(--brand);align-self:flex-start}
.rlist{list-style:none;border-top:1px solid var(--rule)}
.rlist li{border-bottom:1px solid var(--rule)}
.rlist a,.rlist .row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:16px;align-items:center;padding:18px 0}
.rlist a:hover b{color:var(--brand)}
.rlist b{display:block;font-weight:400;font-size:18px;line-height:26px;color:var(--navy)}
.rlist span{display:block;font-size:14px;line-height:21px;color:var(--text2);margin-top:2px}
.rlist .ar{color:var(--brand)}
.checks{list-style:none;display:grid;gap:12px}
.checks li{position:relative;padding-left:26px;font-size:16px;line-height:25px}
.checks li::before{content:'';position:absolute;left:2px;top:7px;width:7px;height:12px;border-right:2px solid var(--brand);border-bottom:2px solid var(--brand);transform:rotate(45deg)}
.steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--gap);counter-reset:st}
.step{counter-increment:st;background:#fff;border-top:6px solid var(--brand);box-shadow:var(--shadow);padding:24px}
.step::before{content:counter(st,decimal-leading-zero);display:block;font-size:13px;line-height:16px;font-weight:600;letter-spacing:.12em;color:var(--brand);margin-bottom:16px}
.step h3{font-size:20px;line-height:28px;font-weight:400;margin-bottom:8px}
.step p:not(.eyebrow){font-size:15px;line-height:23px;color:var(--ink)}
@media(max-width:900px){.steps{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:560px){.steps{grid-template-columns:1fr}}
.tags{display:flex;flex-wrap:wrap;gap:4px 8px}
.tag{display:inline-flex;align-items:center;font-size:14px;line-height:20px;color:var(--ink)}
.tag:not(:last-child)::after{content:'·';margin-left:8px;color:var(--text2)}
/* the plate: a drawing on the pale field */
.plate{background:var(--pale);padding:clamp(16px,2.5vw,32px)}
.plate svg{display:block;width:100%;height:auto}
.plate text{font-family:var(--sans);font-size:14px;fill:var(--navy)}
.more-row{margin-top:clamp(56px,6vw,80px)}
.more-row>.label{margin-bottom:20px}
/* the reading column (article and case pages): text 760 · rail 300 */
.rdg{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:48px clamp(40px,6vw,96px);align-items:start}
.rdg-text{font-size:18px;line-height:31px;color:var(--ink);max-width:760px}
.rdg-text>*+*{margin-top:22px}
.rdg-text h2{font-family:var(--serif);font-size:clamp(24px,2.2vw,30px);line-height:1.34;font-weight:300;color:var(--navy);margin-top:48px}
.rdg-text h2:first-child{margin-top:0}
.rdg-text h3{font-size:20px;line-height:30px;font-weight:600;color:var(--navy);margin-top:32px}
.rdg-text ol{padding-left:24px}
.rdg-text ul{list-style:none}
.rdg-text ul>li{position:relative;padding-left:24px}
.rdg-text ul>li::before{content:'';position:absolute;left:0;top:12px;width:8px;height:8px;background:var(--brand)}
.rdg-text li+li{margin-top:8px}
.rdg-text a{color:var(--brand);text-decoration:underline;text-underline-offset:3px}
.rdg-text .callout{background:var(--pale);border-top:6px solid var(--brand);padding:24px 28px;margin-top:40px}
.rdg-notes{font-size:14px;line-height:22px;color:var(--text2);border-top:1px solid var(--rule);padding-top:16px;margin-top:48px}
.rdg-rail{font-size:16px;line-height:24px;background:var(--pale);padding:28px;position:sticky;top:calc(var(--hdr-h) + 32px)}
.rdg-rail .label{padding-bottom:10px;border-bottom:1px solid var(--rule);margin-bottom:14px;font-size:12px}
.rdg-rail .label~.label{margin-top:32px}
.rdg-rail .btn{margin-top:24px}
@media(max-width:1000px){.rdg{grid-template-columns:1fr}.rdg-rail{position:static;max-width:760px}}
@media(max-width:700px){.rdg-text{font-size:17px;line-height:29px}}
/* a section that collapses: <details open data-fold="phone|all"> (site.js) */
.fold{border-bottom:1px solid var(--rule)}
.fold:first-of-type{border-top:1px solid var(--rule)}
.fold>summary{display:block;list-style:none;cursor:pointer;padding:20px 40px 20px 0;position:relative}
.fold>summary::-webkit-details-marker{display:none}
.fold>summary::after{content:'';position:absolute;right:8px;top:50%;width:9px;height:9px;margin-top:-8px;border-right:1.6px solid var(--navy);border-bottom:1.6px solid var(--navy);transform:rotate(45deg);transition:transform var(--t-fast) var(--ease)}
.fold[open]>summary::after{transform:translateY(4px) rotate(225deg)}
@media(prefers-reduced-motion:reduce){.fold>summary::after{transition:none}}

/* ---- reveal: transitions only; base state visible ------------------------ */
.rv{transition:opacity .7s var(--ease-in),transform .7s var(--ease-in)}
.anim .rv:not(.in){opacity:0;transform:translateY(16px)}
@media(prefers-reduced-motion:reduce){.rv{transition:none}.anim .rv:not(.in){opacity:1;transform:none}}

/* ---- the closing band: a full-bleed photo banner with a translucent navy box ----
   Chrome: identical on every page that carries it (<div class="ctawrap"><section class="ctaband">). */
.ctaband{position:relative;isolation:isolate;overflow:hidden;display:flex;align-items:center;min-height:440px;padding:72px 0;color:#fff;background:var(--navy)}
.cb-media{position:absolute;inset:0;z-index:-1;background:#0A2A6B url(/images/industry-retail.jpg) 62% 38%/cover no-repeat}
.cb-media::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(0,29,108,.55) 0%,rgba(0,29,108,.18) 46%,rgba(0,29,108,0) 70%)}
.ctaband>.wrap{width:100%}
.cb-box{max-width:560px;margin-left:var(--bx);padding:clamp(32px,3.4vw,48px);background:var(--glass);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}
.cb-box .eyebrow{color:#fff;margin-bottom:16px}
.cb-box h2{font-family:var(--serif);font-weight:300;font-size:clamp(28px,2.6vw,36px);line-height:1.3;color:#fff;margin-bottom:16px}
.cb-box p:not(.eyebrow){font-size:16px;line-height:26px;color:rgba(255,255,255,.94);margin-bottom:28px}
/* phones: the photo is a 320px strip at the top, cropped on her face and phone (she stands at about 49% across and
   her face at 37% down the frame), fading into the navy under the box, which overlaps its lower 100px */
@media(max-width:700px){.ctaband{min-height:0;padding:220px 0 0;align-items:flex-end}.ctaband>.wrap{padding:0}
  .cb-media{bottom:auto;height:320px;background-position:49% 30%}
  .cb-media::after{background:linear-gradient(180deg,rgba(0,29,108,0) 0%,rgba(0,29,108,0) 52%,rgba(0,29,108,.6) 78%,#001D6C 100%)}
  .cb-box{max-width:none;margin-left:0;background:rgba(0,29,108,.8);padding:36px var(--pad) 44px}}

/* ---- forms ----------------------------------------------------------------- */
.fld{margin-bottom:24px}
.fld label{display:block;font-size:12px;line-height:16px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--navy);margin-bottom:8px}
.fld input:not([type=checkbox]):not([type=radio]),.fld select,.fld textarea{width:100%;font-family:inherit;font-size:15px;line-height:22px;padding:11px 14px;border:0;border-bottom:1.5px solid var(--navy);background:var(--pale);color:var(--ink);outline:none;border-radius:0;-webkit-appearance:none;appearance:none}
.fld select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23001D6C' stroke-width='1.6'%3E%3Cpath d='M3.5 6l4.5 4.5L12.5 6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;background-size:14px;padding-right:40px}
.fld textarea{min-height:128px;resize:vertical}
.fld input:not([type=checkbox]):not([type=radio]):focus,.fld select:focus,.fld textarea:focus{outline:2px solid var(--brand);outline-offset:-2px}
.fld2{display:grid;grid-template-columns:1fr 1fr;gap:24px}
@media(max-width:560px){.fld2{grid-template-columns:1fr}}
.consent,.fld label.consent{display:flex;gap:12px;align-items:flex-start;font-size:14px;line-height:20px;font-weight:400;letter-spacing:0;text-transform:none;color:var(--ink);margin-bottom:0;cursor:pointer}
.consent input[type=checkbox]{-webkit-appearance:none;appearance:none;flex:0 0 20px;width:20px;height:20px;margin:0;padding:0;border:1.5px solid var(--navy);border-radius:0;background:#fff;cursor:pointer}
.consent input[type=checkbox]:checked{border-color:var(--brand);background:var(--brand) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='square'%3E%3Cpath d='M5 10.5l3.5 3.5L15 7'/%3E%3C/svg%3E") center/18px 18px no-repeat}
.consent input[type=checkbox]:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.consent a{color:var(--brand);text-decoration:underline;text-underline-offset:2px}


/* ---- footer: the short footer — logo and the main links, a hairline, the legal row and
   the entity, then the data-nosnippet disclosures in small type. Phones: centred and stacked. */
footer{background:#fff;color:var(--navy);font-size:14px;line-height:20px}
.ft-top{display:flex;align-items:center;gap:24px 56px;flex-wrap:wrap;padding:40px 0 36px}
.ft-logo{flex-shrink:0;display:block}
.ft-logo img{height:28px;width:auto;display:block}
.ft-nav{display:flex;flex-wrap:wrap;align-items:center;gap:8px 32px}
.ft-nav a{font-size:16px;line-height:24px;font-weight:600;color:var(--navy);white-space:nowrap}
.ft-nav a:hover{color:var(--brand);text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}
.ft-rule{border:0;border-top:1px solid var(--rule);margin:0}
.ft-legal{display:flex;align-items:center;justify-content:space-between;gap:12px 32px;flex-wrap:wrap;padding:20px 0 8px}
.ft-legal nav{display:flex;flex-wrap:wrap;gap:6px 28px}
.ft-legal a,.ft-copy{font-size:13px;line-height:20px;color:var(--navy)}
.ft-legal a:hover{color:var(--brand);text-decoration:underline;text-underline-offset:3px}
.ft-disc{font-size:12px;line-height:18px;color:var(--text2);padding:4px 0 0;max-width:1216px}
.ft-disc+.ft-disc{padding-top:8px}
.ft-disc:last-child{padding-bottom:32px}
@media(max-width:860px){
  footer{text-align:center}
  .ft-top{flex-direction:column;gap:28px;padding:40px 0 32px}
  .ft-nav{flex-direction:column;gap:0}
  .ft-nav a{display:inline-flex;align-items:center;min-height:44px;font-size:17px}
  .ft-legal{flex-direction:column;gap:12px;padding:24px 0 8px}
  .ft-legal nav{justify-content:center;gap:0 24px}
  .ft-legal a{display:inline-flex;align-items:center;min-height:44px}
  .ft-copy{margin-top:8px}
  .ft-disc{margin:0 auto;padding:12px 0 0}
  .ft-disc:last-child{padding-bottom:36px}
}
