/* ==========================================================================
   Self-hosted web fonts
   Served from our own origin rather than fonts.gstatic.com, which is blocked
   in mainland China. Same typefaces, subset to Latin, variable so a single
   file covers every weight. font-display:swap means text is readable
   immediately and never blocks paint.
   ========================================================================== */
@font-face{
  font-family:'Libre Franklin';
  src:url('fonts/LibreFranklin-latin.woff2') format('woff2-variations'),
      url('fonts/LibreFranklin-latin.woff2') format('woff2');
  font-weight:100 900;
  font-style:normal;
  font-display:swap;
}
@font-face{
  font-family:'Source Sans 3';
  src:url('fonts/SourceSans3-latin.woff2') format('woff2-variations'),
      url('fonts/SourceSans3-latin.woff2') format('woff2');
  font-weight:200 900;
  font-style:normal;
  font-display:swap;
}

/* ==========================================================================
   Causeway International — shared stylesheet
   Brand palette locked to #394367 (navy-700) and derived tints.
   ========================================================================== */

:root{
  --navy-900:#2b354c;
  --navy-800:#313b58;
  --navy-700:#394367;   /* brand */
  --navy-600:#4d577a;
  --navy-500:#747b9a;
  --paper:#f4f5f8;
  --paper-dim:#e7e9f0;
  --white:#ffffff;
  --accent:#aeb5d4;
  --accent-bright:#c7cce4;
  --ink:#1b2036;
  --ink-soft:#5c6480;
  --line:rgba(27,32,54,0.12);
  --line-strong:rgba(27,32,54,0.2);
  --line-on-navy:rgba(255,255,255,0.18);
  --shadow-sm:0 2px 10px -4px rgba(27,32,54,0.16);
  --shadow:0 18px 48px -24px rgba(27,32,54,0.34);

  --font-display:'Libre Franklin', -apple-system, BlinkMacSystemFont, sans-serif;
  --font-body:'Source Sans 3', -apple-system, BlinkMacSystemFont, sans-serif;

  --container:1320px;
  --edge:clamp(20px, 5vw, 64px);
  --nav-h:72px;
}

/* Chinese typography ------------------------------------------------------ */
html[lang="zh"] {
  --font-display:'Libre Franklin','PingFang SC','HarmonyOS Sans SC','Microsoft YaHei',
                 'Hiragino Sans GB','Source Han Sans SC','Noto Sans SC','Heiti SC',sans-serif;
  --font-body:'Source Sans 3','PingFang SC','HarmonyOS Sans SC','Microsoft YaHei',
              'Hiragino Sans GB','Source Han Sans SC','Noto Sans SC','Heiti SC',sans-serif;
}
html[lang="zh"] body{ letter-spacing:0.01em; }
html[lang="zh"] h1,html[lang="zh"] h2,html[lang="zh"] h3{ letter-spacing:0; line-height:1.25; }
html[lang="zh"] .eyebrow{ letter-spacing:0.08em; }

*{ margin:0; padding:0; box-sizing:border-box; }
/* No overflow clamp on <html> or <body>. Both were tried and both caused worse
   bugs than they solved: overflow-x:hidden turned body into a scroll container
   and killed the sticky header; overflow-x:clip clipped the fixed mobile menu
   and, on the root, risks overflow-y computing to clip and stopping the page
   scrolling altogether. Sideways overflow is instead prevented at source --
   images are capped, and the mobile drawer is no longer parked off-screen. */
html{ scroll-behavior:smooth; -webkit-text-size-adjust:100%; }
body{
  font-family:var(--font-body);
  background:var(--white);
  color:var(--ink);
  -webkit-font-smoothing:antialiased;
  line-height:1.6;
}
img,svg{ display:block; max-width:100%; height:auto; }
a{ color:inherit; text-decoration:none; }
button{ font:inherit; cursor:pointer; border:none; background:none; color:inherit; }
ul{ list-style:none; }
::selection{ background:var(--navy-700); color:#fff; }
:focus-visible{ outline:2px solid var(--navy-700); outline-offset:3px; border-radius:2px; }

@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important; animation-iteration-count:1 !important;
    transition-duration:.001ms !important; scroll-behavior:auto !important;
  }
}

/* Layout ------------------------------------------------------------------ */
/* Horizontal-overflow guard, scoped to page content only.
   Deliberately NOT on <html> or <body>: putting it there either kills the
   sticky header (overflow-x:hidden makes body a scroll container) or clips the
   fixed mobile menu (overflow-x:clip). <main> contains no sticky or fixed
   elements, so clipping here is side-effect free -- the header, the mobile
   drawer and normal page scrolling are all unaffected. */
main{ overflow-x:hidden; }
.site-footer{ overflow-x:hidden; }

.wrap{ max-width:var(--container); margin:0 auto;
       padding-left:var(--edge); padding-right:var(--edge);
       padding-inline:var(--edge); }
.section{ padding:clamp(64px,8vw,116px) 0; }
.section--tight{ padding:clamp(48px,6vw,80px) 0; }
.section--paper{ background:var(--paper); }
.section--navy{ background:var(--navy-700); color:#fff; }
.section--navy h1,.section--navy h2,.section--navy h3{ color:#fff; }

h1,h2,h3,h4{ font-family:var(--font-display); font-weight:700; line-height:1.12; letter-spacing:-0.015em; color:var(--ink); }
h1{ font-size:clamp(2.1rem,4.6vw,3.5rem); }
h2{ font-size:clamp(1.7rem,3.2vw,2.5rem); }
h3{ font-size:clamp(1.05rem,1.6vw,1.25rem); }
p{ color:var(--ink-soft); }
.section--navy p{ color:rgba(255,255,255,.76); }

.eyebrow{
  display:inline-flex; align-items:center; gap:10px;
  font-size:.76rem; font-weight:700; letter-spacing:.15em; text-transform:uppercase;
  color:var(--navy-700); margin-bottom:16px;
}
.eyebrow::before{ content:''; width:22px; height:1px; background:currentColor; }
.section--navy .eyebrow{ color:var(--accent-bright); }

.section-head{ max-width:720px; margin-bottom:clamp(36px,5vw,56px); }
.section-head p{ font-size:1.05rem; margin-top:14px; }
.lead{ font-size:clamp(1rem,1.5vw,1.16rem); line-height:1.7; }

/* Buttons ----------------------------------------------------------------- */
.btn{
  display:inline-flex; align-items:center; gap:9px;
  padding:14px 26px; border-radius:3px;
  font-family:var(--font-display); font-weight:600; font-size:.93rem;
  transition:transform .2s ease, background .2s ease, color .2s ease, border-color .2s ease, box-shadow .2s ease;
  white-space:nowrap; border:1px solid transparent;
}
.btn svg{ width:15px; height:15px; flex:none; }
.btn--primary{ background:var(--navy-700); color:#fff; }
.btn--primary:hover{ background:var(--navy-800); transform:translateY(-2px); box-shadow:var(--shadow-sm); }
.btn--light{ background:#fff; color:var(--navy-700); }
.btn--light:hover{ background:var(--paper-dim); transform:translateY(-2px); }
.btn--ghost{ border-color:var(--line-strong); color:var(--ink); }
.btn--ghost:hover{ border-color:var(--navy-700); color:var(--navy-700); transform:translateY(-2px); }
.btn--ghost-light{ border-color:var(--line-on-navy); color:#fff; }
.btn--ghost-light:hover{ border-color:#fff; background:rgba(255,255,255,.08); transform:translateY(-2px); }

.link-arrow{
  display:inline-flex; align-items:center; gap:7px;
  font-family:var(--font-display); font-weight:600; font-size:.92rem; color:var(--navy-700);
}
.link-arrow svg{ width:14px; height:14px; transition:transform .22s ease; }
.link-arrow:hover svg{ transform:translateX(4px); }
.section--navy .link-arrow{ color:var(--accent-bright); }

/* Header ------------------------------------------------------------------ */
.site-header{
  position:sticky; top:0; z-index:100;
  background:rgba(255,255,255,.92);
  backdrop-filter:saturate(180%) blur(12px);
  -webkit-backdrop-filter:saturate(180%) blur(12px);
  border-bottom:1px solid var(--line);
  transition:box-shadow .3s ease;
}
.site-header.is-stuck{ box-shadow:0 6px 24px -16px rgba(27,32,54,.4); }
.header-inner{
  position:relative; z-index:2; background:inherit;
  height:var(--nav-h); display:flex; align-items:center; justify-content:space-between;
  gap:24px; max-width:var(--container); margin:0 auto;
  padding-left:var(--edge); padding-right:var(--edge); padding-inline:var(--edge);
}
.brand{ display:flex; align-items:center; gap:11px; flex:none; }
.brand img{ height:30px; width:auto; }
/* Matches the logo artwork exactly (#394367). It previously used --ink
   (#1b2036), a much darker near-black, so the wordmark read as a different
   colour to the mark sitting beside it. */
.brand-name{ font-family:var(--font-display); font-weight:700; font-size:1rem; color:var(--navy-700); letter-spacing:.01em; line-height:1.1; }
html[lang="zh"] .brand-name{ font-size:.95rem; }

.nav{ display:flex; align-items:center; gap:34px; margin-left:auto; }
.nav a{
  font-size:.92rem; font-weight:500; color:var(--ink-soft); position:relative; padding-block:6px;
  transition:color .2s ease;
}
.nav a::after{
  content:''; position:absolute; left:0; right:100%; bottom:0; height:2px;
  background:var(--navy-700); transition:right .25s ease;
}
.nav a:hover{ color:var(--ink); }
.nav a:hover::after{ right:0; }
.nav a.is-active{ color:var(--navy-700); font-weight:600; }
.nav a.is-active::after{ right:0; }

.header-tools{ display:flex; align-items:center; gap:16px; flex:none; }

/* Language toggle */
.lang-switch{
  display:inline-flex; align-items:center; border:1px solid var(--line-strong);
  border-radius:999px; overflow:hidden; background:var(--white);
}
.lang-switch button{
  padding:6px 13px; font-size:.78rem; font-weight:600; font-family:var(--font-display);
  color:var(--ink-soft); transition:background .2s ease, color .2s ease; line-height:1.4;
}
.lang-switch button.is-active{ background:var(--navy-700); color:#fff; }
.lang-switch button:not(.is-active):hover{ background:var(--paper-dim); color:var(--ink); }

.nav-toggle{ display:none; flex-direction:column; gap:5px; width:24px; padding:4px 0; }
.nav-toggle span{ height:2px; width:100%; background:var(--ink); border-radius:2px; transition:transform .3s ease, opacity .3s ease; }
.nav-toggle.is-open span:nth-child(1){ transform:translateY(7px) rotate(45deg); }
.nav-toggle.is-open span:nth-child(2){ opacity:0; }
.nav-toggle.is-open span:nth-child(3){ transform:translateY(-7px) rotate(-45deg); }

@media (max-width:1360px){
  .header-tools .btn{ display:none; }
  .nav{
    /* explicit offsets rather than the `inset` shorthand: if a browser does
       not understand `inset`, every offset falls back to `auto` and the
       panel is laid out at its static position with its natural width,
       sticking out past the right edge and creating a sideways scroll. */
    position:fixed; top:var(--nav-h); right:0; left:0;
    width:100%; max-width:100%;
    /* Height stated explicitly. Relying on top+bottom with height:auto left the
       panel collapsed to a single row on some engines. dvh accounts for the
       mobile address bar; vh is the fallback for browsers without it. */
    height:calc(100vh - var(--nav-h));
    height:calc(100dvh - var(--nav-h));
    background:#fff;                 /* opaque: the page must not show through */
    z-index:1;                       /* under .header-inner, over the page      */
    overflow-y:auto;                 /* never hide links on a short screen      */
    -webkit-overflow-scrolling:touch;
    flex-direction:column; justify-content:center; gap:30px;
    padding:24px 0;
    margin:0; border-top:1px solid var(--line);
    opacity:0; visibility:hidden; pointer-events:none;
    transform:translateY(-10px);
    transition:opacity .28s ease, transform .28s cubic-bezier(.4,0,.2,1), visibility 0s linear .28s;
  }
  .nav.is-open{
    opacity:1; visibility:visible; pointer-events:auto;
    transform:translateY(0);
    transition:opacity .28s ease, transform .28s cubic-bezier(.4,0,.2,1), visibility 0s;
  }
  .nav a{ font-size:1.25rem; font-weight:600; color:var(--ink); }
  .nav-toggle{ display:flex; }
}

/* Hero -------------------------------------------------------------------- */
.hero{
  position:relative; background:var(--navy-700); color:#fff; overflow:hidden;
  padding-block:clamp(72px,10vw,132px);
}
/* Sized so the whole hero -- headline, copy, buttons and all six highlights --
   clears a standard laptop viewport without scrolling. The cap is on the block
   as a whole (padding included); type sizes are unchanged. */
.hero--home{ min-height:min(84vh,760px); display:flex; align-items:center; }
/* Roomier again once the viewport can afford it. */
.hero__bg{ position:absolute; inset:0; z-index:0; opacity:.5; overflow:hidden; }
/* canvas is absolutely positioned rather than height:100% so it can never
   feed back into the hero's own height calculation */
.hero__bg canvas{ position:absolute; inset:0; display:block; width:100%; height:100%; }
/* Every interior page shares one hero height so What We Do, Our Products,
   For Suppliers and For Manufacturers read as siblings. Stepped media queries
   rather than clamp(): the value must exceed the tallest hero's own content
   (Suppliers, which carries CTA buttons) or that page would grow past the
   others -- and stepped values are supported everywhere. */
.hero--page{ min-height:560px; display:flex; align-items:center; }
@media (max-width:1100px){ .hero--page{ min-height:480px; } }
@media (max-width:820px){  .hero--page{ min-height:430px; } }
@media (max-width:600px){  .hero--page{ min-height:380px; } }
.hero__photo{
  position:absolute; inset:0; z-index:0;
  background-size:cover; background-position:center;
  opacity:.16; filter:grayscale(40%);
}
.hero__inner{ position:relative; z-index:2; }
.hero h1{ color:#fff; max-width:15ch; }
.hero h1 em{ font-style:normal; color:var(--accent-bright); }
.hero__sub{ font-size:clamp(1rem,1.6vw,1.2rem); color:rgba(255,255,255,.78); max-width:60ch; margin-top:22px; line-height:1.68; }
.hero__cta{ display:flex; flex-wrap:wrap; gap:14px; margin-top:36px; }
.hero--page h1{ max-width:20ch; }
.hero__crumb{ font-size:.8rem; letter-spacing:.14em; text-transform:uppercase; color:var(--accent); font-weight:600; margin-bottom:14px; }

/* Stat strip -------------------------------------------------------------- */
/* Stat rows always divide evenly: the hero's six highlights sit 3 x 2, and
   .stats--4 is used where a section has exactly four figures. */
.stats{ display:grid; grid-template-columns:repeat(3,1fr); gap:30px 24px; }
.stats--hero{ grid-template-columns:repeat(3,1fr); max-width:840px; }
.stats--4{ grid-template-columns:repeat(4,1fr); }
@media (max-width:1000px){ .stats--4{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:820px){ .stats,.stats--hero{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:560px){ .stats,.stats--hero,.stats--4{ grid-template-columns:repeat(2,1fr); } }
.stat__num{ font-family:var(--font-display); font-weight:700; font-size:clamp(1.9rem,3.4vw,2.7rem); color:var(--navy-700); line-height:1; }
.section--navy .stat__num{ color:#fff; }
.hero .stat__num{ color:#fff; }
.stat__label{ display:block; margin-top:9px; font-size:.87rem; color:var(--ink-soft); max-width:24ch; }
.section--navy .stat__label,.hero .stat__label{ color:rgba(255,255,255,.62); }
.stats--hero{ margin-top:52px; padding-top:32px; border-top:1px solid var(--line-on-navy); }

/* Cards ------------------------------------------------------------------- */
/* Explicit column counts, not auto-fit: auto-fit was silently fitting 4 cards
   into a .grid--3 row (and 7 badges into a row of 8), producing lopsided
   4+2 / 7+1 layouts. Fixed counts with deliberate breakpoints keep every row
   balanced at every width. */
.grid{ display:grid; gap:22px; }
.grid--2{ grid-template-columns:repeat(2,1fr); }
.grid--3{ grid-template-columns:repeat(3,1fr); }
.grid--4{ grid-template-columns:repeat(4,1fr); }
@media (max-width:1000px){
  .grid--3,.grid--4{ grid-template-columns:repeat(2,1fr); }
}
@media (max-width:640px){
  .grid--2,.grid--3,.grid--4{ grid-template-columns:1fr; }
}

.card{
  background:#fff; border:1px solid var(--line); border-radius:5px;
  padding:30px 26px; transition:transform .28s ease, box-shadow .28s ease, border-color .28s ease;
}
.card:hover{ transform:translateY(-4px); box-shadow:var(--shadow); border-color:var(--line-strong); }
/* Icon wrappers: these are sometimes <span>, which is inline by default — so
   width/height would be ignored and the inline <svg> (viewBox, no intrinsic
   size) would balloon and wreck the surrounding layout. Force block display and
   size the SVG explicitly. */
.card__icon,.ilist__ico,.contact-row__ico{ display:block; flex:none; }
.card__icon > svg,
.ilist__ico > svg,
.contact-row__ico > svg{ width:100%; height:100%; display:block; }

.card__icon{ width:40px; height:40px; margin-bottom:20px; color:var(--navy-700); }
.card h3{ margin-bottom:9px; }
.card p{ font-size:.94rem; line-height:1.62; }
.card--navy{ background:var(--navy-800); border-color:transparent; color:#fff; }
.card--navy h3{ color:#fff; }
.card--navy p{ color:rgba(255,255,255,.74); }
.card--navy .card__icon{ color:var(--accent-bright); }
.card--flat:hover{ transform:none; box-shadow:none; }

/* Audience split cards (home) */
/* The two cards carry different amounts of copy. Bottom-aligning the whole
   block (justify-content:flex-end) therefore pushed the headings to different
   heights. Instead the heading pins to the top, the paragraph grows to fill,
   and the link sits at the bottom -- so headings AND links line up across both
   cards regardless of copy length, viewport or language. */
.path-card{
  position:relative; display:flex; flex-direction:column; justify-content:flex-start;
  min-height:290px; padding:34px 30px; border-radius:6px; overflow:hidden;
  background:var(--navy-700); color:#fff; isolation:isolate;
}
.path-card p{ flex:1 1 auto; }
.path-card__bg{
  position:absolute; inset:0; z-index:-2; background-size:cover; background-position:center;
  transform:scale(1.02); transition:transform .6s cubic-bezier(.2,.6,.2,1);
}
.path-card::after{
  content:''; position:absolute; inset:0; z-index:-1;
  background:linear-gradient(160deg,rgba(43,53,76,.82),rgba(57,67,103,.94));
}
.path-card:hover .path-card__bg{ transform:scale(1.09); }
.path-card h3{ color:#fff; font-size:clamp(1.25rem,2vw,1.6rem); margin-bottom:10px; }
.path-card p{ color:rgba(255,255,255,.78); font-size:.96rem; margin-bottom:20px; max-width:38ch; }
.path-card .link-arrow{ color:#fff; }

/* Icon list --------------------------------------------------------------- */
.ilist{ display:grid; gap:26px; }
.ilist__item{ display:grid; grid-template-columns:44px 1fr; gap:18px; align-items:start; }
.ilist__ico{ width:44px; height:44px; color:var(--navy-700); }
.section--navy .ilist__ico{ color:var(--accent-bright); }
.ilist__item h3{ margin-bottom:6px; }
.ilist__item p{ font-size:.94rem; }

/* Numbered steps ---------------------------------------------------------- */
.steps{ counter-reset:step; display:grid; gap:0; }
.step{
  counter-increment:step; position:relative;
  display:grid; grid-template-columns:64px 1fr; gap:22px;
  padding:26px 0; border-top:1px solid var(--line);
}
.steps .step:last-child{ border-bottom:1px solid var(--line); }
.section--navy .step{ border-color:var(--line-on-navy); }
.step__n{
  font-family:var(--font-display); font-weight:700; font-size:1.5rem;
  color:var(--navy-500); line-height:1;
}
.section--navy .step__n{ color:var(--accent); }
.step__n::before{ content:'0' counter(step); }
.step h3{ margin-bottom:6px; }
.step p{ font-size:.95rem; max-width:62ch; }

/* Product list ------------------------------------------------------------- */
.acc{ border:1px solid var(--line); border-radius:6px; overflow:hidden; background:#fff; }
.acc__item + .acc__item{ border-top:1px solid var(--line); }
.acc__item.is-open{ background:var(--paper); }
.acc__head{
  width:100%; display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:20px 26px; text-align:start; position:relative;
  transition:background .2s ease;
}
.acc__head::before{
  content:''; position:absolute; left:0; top:0; bottom:0; width:3px;
  background:var(--navy-700); transform:scaleY(0); transform-origin:top;
  transition:transform .3s cubic-bezier(.2,.7,.2,1);
}
.acc__item.is-open .acc__head::before{ transform:scaleY(1); }
.acc__head:hover{ background:var(--paper); }
.acc__title{ display:flex; align-items:center; gap:14px; min-width:0; }
.acc__name{
  font-family:var(--font-display); font-weight:700;
  font-size:1.12rem; color:var(--ink); letter-spacing:-.01em;
}
.acc__count{
  font-size:.78rem; font-weight:700; color:var(--navy-700);
  background:var(--paper-dim); padding:4px 11px; border-radius:20px; flex:none;
}
.acc__item.is-open .acc__count{ background:var(--navy-700); color:#fff; }
.acc__chev{
  width:28px; height:28px; flex:none; border:1px solid var(--line); border-radius:50%;
  display:grid; place-items:center;
  transition:transform .3s ease, background .3s ease, border-color .3s ease;
}
.acc__chev svg{ width:12px; height:12px; color:var(--ink-soft); transition:color .3s ease; }
.acc__item.is-open .acc__chev{ transform:rotate(135deg); background:var(--navy-700); border-color:var(--navy-700); }
.acc__item.is-open .acc__chev svg{ color:#fff; }
.acc__body{ max-height:0; overflow:hidden; transition:max-height .4s cubic-bezier(.4,0,.2,1); }
.acc__inner{
  padding:4px 26px 26px;
  display:grid; grid-template-columns:repeat(auto-fill,minmax(230px,1fr));
  gap:2px 26px;
}
.mol{
  display:flex; align-items:baseline; gap:9px;
  font-size:1rem; color:var(--ink); padding:7px 0;
  border-bottom:1px solid rgba(27,32,54,.06);
}
.mol::before{
  content:''; width:5px; height:5px; border-radius:50%;
  background:var(--navy-500); flex:none; transform:translateY(-3px);
}
/* The name lives in ONE element: .mol is a flex row with a gap, so emitting
   search fragments as separate children would open that gap mid-word. */
.mol__t{ min-width:0; }
.mol mark{
  background:rgba(174,181,212,.5); color:var(--ink);
  padding:0; border-radius:2px; font-weight:600;
}

.acc-tools{ display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap; margin-bottom:14px; }
.acc-tools .hint{ font-size:.86rem; color:var(--ink-soft); }
.btn-mini{
  font-family:var(--font-display); font-weight:600; font-size:.83rem;
  color:var(--navy-700); border:1px solid var(--line-strong);
  padding:8px 15px; border-radius:3px; background:#fff;
  transition:all .2s ease; white-space:nowrap;
}
.btn-mini:hover{ border-color:var(--navy-700); background:var(--paper-dim); }

/* Media band -------------------------------------------------------------- */
.media{ position:relative; border-radius:6px; overflow:hidden;
        height:300px;                      /* fallback: must not rely on clamp */
        height:clamp(230px,32vw,400px);
        background:var(--navy-800); }
.media img{ width:100%; max-width:100%; height:100%; object-fit:cover; }
.media__cap{
  position:absolute; inset:auto 0 0 0; padding:34px clamp(20px,3vw,36px) 20px; color:#fff;
  background:linear-gradient(0deg,rgba(27,32,54,.85),transparent);
  font-size:.93rem; max-width:60ch;
}

/* Split (text + visual) --------------------------------------------------- */
.split{ display:grid; grid-template-columns:1.05fr .95fr; gap:clamp(32px,5vw,72px); align-items:center; }
.split--reverse .split__media{ order:-1; }
@media (max-width:860px){ .split{ grid-template-columns:1fr; } .split--reverse .split__media{ order:0; } }

/* Badges ------------------------------------------------------------------ */
.badges{ display:grid; grid-template-columns:repeat(4,1fr); gap:30px 18px; }
@media (max-width:820px){ .badges{ grid-template-columns:repeat(3,1fr); } }
@media (max-width:560px){ .badges{ grid-template-columns:repeat(2,1fr); } }
.badge{ text-align:center; }
.badge__ring{
  width:86px; height:86px; margin:0 auto 12px; border-radius:50%;
  border:1.5px solid var(--navy-700); display:grid; place-items:center; position:relative;
  transition:transform .3s ease;
}
.badge:hover .badge__ring{ transform:translateY(-4px); }
.badge__ring::after{
  content:''; position:absolute; inset:6px; border-radius:50%;
  border:1px solid var(--accent);
}
.badge__code{ font-family:var(--font-display); font-weight:700; font-size:.92rem; color:var(--navy-700); }
.badge__where{ font-size:.76rem; color:var(--ink-soft); }
.section--navy .badge__ring{ border-color:rgba(255,255,255,.7); }
.section--navy .badge__ring::after{ border-color:rgba(255,255,255,.32); }
.section--navy .badge__code{ color:#fff; }
.section--navy .badge__where{ color:rgba(255,255,255,.6); }

/* Sourcing network map ------------------------------------------------------ */
.netmap{
  position:relative; border-radius:8px; overflow:hidden;
  background:#2b354c; box-shadow:inset 0 0 0 1px rgba(199,204,228,.14);
}
.netmap__img{ width:100%; height:auto; display:block; opacity:.92; }
.netmap__svg{ position:absolute; inset:0; width:100%; height:100%; }
.netmap::after{      /* soft vignette so labels near the edge stay readable */
  content:''; position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(120% 80% at 60% 45%,transparent 40%,rgba(27,32,54,.45) 100%);
}

.netmap__label{
  font-family:var(--font-display); font-size:20px; font-weight:600;
  fill:#e7e9f5; letter-spacing:.02em;
  paint-order:stroke; stroke:rgba(27,32,54,.75); stroke-width:4px; stroke-linejoin:round;
}
.netmap__hublabel{
  font-family:var(--font-display); font-size:24px; font-weight:800;
  fill:#ffffff; letter-spacing:.10em;
  paint-order:stroke; stroke:rgba(27,32,54,.8); stroke-width:5px; stroke-linejoin:round;
}
.netmap__dot{ fill:#c7cce4; stroke:#2b354c; stroke-width:2; }
.netmap__ring{ fill:none; stroke:#c7cce4; stroke-width:1.6; opacity:0; transform-origin:center; }
.netmap__hubdot{ stroke:#2b354c; stroke-width:2.5; }
.netmap__hubring{ fill:none; stroke:#ffffff; stroke-width:2; opacity:0; transform-origin:center; }

/* Animation only runs once the section scrolls into view (.is-in), so the
   page does not burn frames on a map nobody is looking at. */
.netmap__arc{ stroke-dasharray:1400; stroke-dashoffset:1400; }
.netmap__spark{ opacity:0; }

.netmap.is-in .netmap__arc{
  animation:arcDraw 1.5s cubic-bezier(.3,.7,.3,1) forwards;
  animation-delay:calc(var(--i) * .11s);
}
.netmap.is-in .netmap__node{
  opacity:0; animation:nodeIn .5s ease forwards;
  animation-delay:calc(.55s + var(--i) * .11s);
}
.netmap.is-in .netmap__ring{
  animation:ringPulse 3s ease-out infinite;
  animation-delay:calc(1.1s + var(--i) * .25s);
}
.netmap.is-in .netmap__hubring{ animation:ringPulse 3s ease-out infinite; }
.netmap.is-in .netmap__hubring--2{ animation-delay:1.5s; }

@keyframes arcDraw{ to{ stroke-dashoffset:0; } }
@keyframes nodeIn{ from{ opacity:0; transform:translateY(6px); } to{ opacity:1; transform:none; } }
@keyframes ringPulse{
  0%{ opacity:.85; transform:scale(.6); }
  70%{ opacity:0; transform:scale(2.6); }
  100%{ opacity:0; transform:scale(2.6); }
}

@media (prefers-reduced-motion: reduce){
  .netmap__arc{ stroke-dashoffset:0 !important; animation:none !important; }
  .netmap__node{ opacity:1 !important; animation:none !important; }
  .netmap__ring,.netmap__hubring{ display:none; }
  .netmap__spark{ display:none; }
}
@media (max-width:720px){
  .netmap__label{ font-size:30px; stroke-width:6px; }
  .netmap__hublabel{ font-size:34px; stroke-width:7px; }
  .netmap__dot{ r:9; }
}

/* Contact ----------------------------------------------------------------- */
.contact-list{ display:grid; gap:0; }
.contact-row{
  display:grid; grid-template-columns:42px 1fr; gap:16px; align-items:start;
  padding:22px 0; border-top:1px solid var(--line);
}
.contact-list .contact-row:last-child{ border-bottom:1px solid var(--line); }
.section--navy .contact-row{ border-color:var(--line-on-navy); }
.contact-row__ico{ width:30px; height:30px; color:var(--navy-700); margin-top:2px; }
.section--navy .contact-row__ico{ color:var(--accent-bright); }
.contact-row__k{ font-size:.74rem; font-weight:700; letter-spacing:.12em; text-transform:uppercase; color:var(--ink-soft); }
.section--navy .contact-row__k{ color:var(--accent); }
.contact-row__v{ font-family:var(--font-display); font-weight:600; font-size:1.06rem; color:var(--ink); margin-top:3px; }
.section--navy .contact-row__v{ color:#fff; }
a.contact-row:hover .contact-row__v{ color:var(--navy-700); }
.section--navy a.contact-row:hover .contact-row__v{ color:var(--accent-bright); }

/* CTA band ---------------------------------------------------------------- */
.cta{ background:var(--navy-700); color:#fff; padding:clamp(52px,7vw,86px) 0; }
.cta__inner{ display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:28px; }
.cta h2{ color:#fff; max-width:20ch; }
.cta p{ color:rgba(255,255,255,.76); margin-top:12px; max-width:52ch; }

/* Footer ------------------------------------------------------------------ */
.site-footer{ background:var(--navy-900); color:rgba(255,255,255,.62); padding:56px 0 30px; }
.footer-top{ display:grid; grid-template-columns:1.4fr 1fr 1fr; gap:40px; padding-bottom:36px; border-bottom:1px solid rgba(255,255,255,.12); }
@media (max-width:760px){ .footer-top{ grid-template-columns:1fr; gap:30px; } }
.footer-brand{ display:flex; align-items:center; gap:11px; margin-bottom:16px; }
.footer-brand img{ height:26px; }
.footer-brand span{ font-family:var(--font-display); font-weight:700; font-size:.95rem; color:#fff; }
.footer-blurb{ font-size:.9rem; max-width:40ch; color:rgba(255,255,255,.58); }
.footer-col h4{ font-size:.76rem; letter-spacing:.13em; text-transform:uppercase; color:rgba(255,255,255,.5); margin-bottom:15px; font-weight:700; }
.footer-col li + li{ margin-top:10px; }
.footer-col a{ font-size:.9rem; transition:color .2s ease; }
.footer-col a:hover{ color:#fff; }
.footer-bottom{ display:flex; flex-wrap:wrap; justify-content:space-between; gap:14px; padding-top:24px; font-size:.82rem; }

/* Reveal animation ---------------------------------------------------------
   Progressive enhancement: content is visible by default. The hidden start
   state is only applied once JS has confirmed it can run (html.js), so a
   JS failure or a non-executing crawler still sees a fully readable page
   instead of a blank one. */
.reveal{ opacity:1; transform:none; }
.js .reveal{
  opacity:0; transform:translateY(22px);
  transition:opacity .75s cubic-bezier(.2,.6,.2,1), transform .75s cubic-bezier(.2,.6,.2,1);
}
.js .reveal.is-in{ opacity:1; transform:none; }
.js .reveal[data-delay="1"]{ transition-delay:.09s; }
.js .reveal[data-delay="2"]{ transition-delay:.18s; }
.js .reveal[data-delay="3"]{ transition-delay:.27s; }
.js .reveal[data-delay="4"]{ transition-delay:.36s; }

/* Language fade */
body.lang-swapping .i18n-fade{ opacity:.25; transition:opacity .12s ease; }
.i18n-fade{ transition:opacity .28s ease; }

/* Utilities --------------------------------------------------------------- */
.center{ text-align:center; }
.mt-s{ margin-top:14px; } .mt-m{ margin-top:26px; } .mt-l{ margin-top:44px; }
.divider{ height:1px; background:var(--line); border:0; margin:0; }
.section--navy .divider{ background:var(--line-on-navy); }
.skip{
  position:absolute; left:-9999px; top:0; background:var(--navy-700); color:#fff;
  padding:12px 18px; z-index:200;
}
.skip:focus{ left:8px; top:8px; }


/* Portfolio search --------------------------------------------------------- */
.search{ position:relative; max-width:460px; margin-bottom:26px; }
.search input{
  width:100%; padding:14px 44px 14px 44px; font:inherit; font-size:.96rem;
  color:var(--ink); background:#fff; border:1px solid var(--line-strong);
  border-radius:4px; transition:border-color .2s ease, box-shadow .2s ease;
}
.search input::placeholder{ color:var(--ink-soft); opacity:.75; }
.search input:focus{ outline:none; border-color:var(--navy-700); box-shadow:0 0 0 3px rgba(57,67,103,.12); }
.search__ico{
  position:absolute; left:14px; top:50%; transform:translateY(-50%);
  width:17px; height:17px; color:var(--ink-soft); pointer-events:none;
}
.search__ico svg{ width:100%; height:100%; display:block; }
.search__clear{
  position:absolute; right:8px; top:50%; transform:translateY(-50%);
  width:28px; height:28px; border-radius:50%; display:grid; place-items:center;
  color:var(--ink-soft); font-size:1.05rem; line-height:1;
}
.search__clear:hover{ background:var(--paper-dim); color:var(--ink); }
.search-status{ font-size:.86rem; color:var(--ink-soft); margin-bottom:18px; min-height:1.2em; }
.mol mark{ background:rgba(174,181,212,.45); color:var(--ink); padding:0 1px; border-radius:2px; }


/* Regulatory badges --------------------------------------------------------- */
.badge__ring{
  position:relative; overflow:visible;
  background:rgba(255,255,255,.03);
}
.badge__ring::before{           /* sweeping accent ring, drawn on scroll-in */
  content:''; position:absolute; inset:-1.5px; border-radius:50%;
  border:1.5px solid transparent; border-top-color:var(--accent-bright);
  opacity:0;
}
.js .reveal.is-in .badge__ring::before,
.badge.is-in .badge__ring::before{
  opacity:1; animation:badgeSpin 1.15s cubic-bezier(.3,.7,.3,1) forwards;
}
@keyframes badgeSpin{
  0%{ transform:rotate(0deg); opacity:0; }
  15%{ opacity:1; }
  100%{ transform:rotate(360deg); opacity:0; }
}
.badge__ring::after{
  transition:transform .45s cubic-bezier(.3,.7,.3,1), opacity .45s ease;
}
.badge:hover .badge__ring::after{ transform:scale(1.12); opacity:.6; }
.badge__code{ transition:transform .3s ease; }
.badge:hover .badge__code{ transform:scale(1.06); }
.badge__tick{
  position:absolute; right:2px; bottom:2px; width:22px; height:22px;
  border-radius:50%; background:var(--accent-bright); color:var(--navy-900);
  display:grid; place-items:center; opacity:0; transform:scale(.4);
  transition:opacity .35s ease .15s, transform .35s cubic-bezier(.3,1.4,.5,1) .15s;
}
.badge__tick svg{ width:12px; height:12px; }
.js .reveal.is-in .badge__tick,
.badge:hover .badge__tick{ opacity:1; transform:scale(1); }
@media (prefers-reduced-motion: reduce){
  .badge__ring::before{ display:none; }
  .badge__tick{ opacity:1; transform:none; }
}


/* Contact: company-profile band --------------------------------------------- */
.deck-band{
  display:flex; align-items:center; justify-content:space-between; gap:28px;
  flex-wrap:wrap; background:#fff; border:1px solid var(--line);
  border-radius:6px; padding:clamp(26px,4vw,44px);
}
.deck-band h2{ font-size:clamp(1.4rem,2.4vw,1.9rem); }
.deck-band p{ max-width:52ch; }


/* Mobile header fit ---------------------------------------------------------
   The brand lock-up ("Causeway International" at 1rem) needs ~241px, which
   overflowed the row below ~430px and pushed the menu button off-screen.
   The brand now shrinks and is allowed to truncate as a last resort, and the
   controls are pinned so they can never be clipped. */
/* Six nav items plus the brand lock-up and controls no longer fit one row on
   mid-size laptops. Rather than cramming, the header's "Get in touch" button
   is dropped below 1260px -- Contact already sits in the nav, so nothing is
   lost -- and the link gap steps down gradually. */
.header-inner{ gap:30px; }
.nav{ gap:28px; }

.brand{ min-width:0; flex:0 1 auto; }
.brand img{ flex:none; }
.brand-name{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.header-tools{ flex:none; }
.lang-switch{ flex:none; }

@media (max-width:560px){
  .header-inner{ gap:10px; }
  .brand{ gap:8px; }
  .brand img{ height:26px; }
  .brand-name{ font-size:.86rem; }
  .header-tools{ gap:10px; }
  .lang-switch button{ padding:5px 9px; font-size:.72rem; }
}
/* Logo and wordmark stay together on one line at every width. At .86rem the
   wordmark measures ~183px, which pushed the language pill and menu button
   past the right edge on phones, so the type steps down on small screens only.
   Nothing is hidden, wrapped or truncated. */
@media (max-width:620px){
  .brand-name{ white-space:nowrap; font-size:.78rem; }
  .lang-switch button{ padding:5px 9px; font-size:.72rem; }
}
@media (max-width:430px){
  .brand-name{ font-size:.72rem; }
  .brand{ gap:7px; }
  .lang-switch button{ padding:5px 8px; font-size:.7rem; }
}
@media (max-width:360px){
  .brand-name{ font-size:.68rem; }
  .brand img{ height:24px; }
  .lang-switch button{ padding:4px 7px; font-size:.66rem; }
  .header-inner{ gap:8px; }
  .header-tools{ gap:8px; }
}

.hero h1,.hero__sub,h1,h2,h3{ overflow-wrap:break-word; }




/* Phone: "Accelerating access to" must sit on one line so the headline reads
   as two lines rather than three. Sized to fit 22 characters in the narrowest
   common viewport. */
@media (max-width:560px){
  .hero--home h1{ font-size:1.72rem; line-height:1.16; }
}
@media (max-width:380px){
  .hero--home h1{ font-size:1.58rem; }
}
