/* ============================================================
   MASQINOX STEELS TRADING FZE — Editorial Industrial
   Design system: Fraunces (display serif) + Hanken Grotesk (body)
                + JetBrains Mono (technical specs)
   Palette: Masqinox navy · brand blue · cool steel paper
   ============================================================ */

/* ------------------------------------------------------------
   Self-hosted webfonts — no runtime request to Google.
   These are the exact .woff2 binaries Google's font CDN was serving
   (Fraunces v38, Hanken Grotesk, JetBrains Mono), downloaded once and
   committed, so the rendering is identical to before rather than merely
   similar. The @font-face descriptors below — including every
   unicode-range subset — are Google's own, unchanged.

   Fraunces is kept as the FULL variable font: the design depends on its
   opsz (9-144), SOFT (0-100) and WONK (0-1) axes via font-variation-settings,
   and a static instance would not carry them.

   File names contain a content hash, so they are safe to cache forever.
   Regenerate with scripts/fetch_fonts.py if a family is ever updated; it
   prints a replacement for everything between the two markers below.
   ------------------------------------------------------------ */
/* BEGIN self-hosted webfonts */
@font-face {
  font-family: 'Fraunces';
  font-style: italic;
  font-weight: 300 900;
  font-display: swap;
  src: url('../fonts/fraunces-italic-vietnamese.52cd2d19be.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'Fraunces';
  font-style: italic;
  font-weight: 300 900;
  font-display: swap;
  src: url('../fonts/fraunces-italic-latin-ext.356dfdbe2d.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Fraunces';
  font-style: italic;
  font-weight: 300 900;
  font-display: swap;
  src: url('../fonts/fraunces-italic-latin.04a14ea380.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('../fonts/fraunces-normal-vietnamese.5847b622f5.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('../fonts/fraunces-normal-latin-ext.e9521563d0.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('../fonts/fraunces-normal-latin.7e74484902.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-italic-cyrillic-ext.39b6cc87d1.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-italic-vietnamese.9cc0e526c3.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-italic-latin-ext.8f7c62f4f3.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-italic-latin.bb432642d7.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-normal-cyrillic-ext.7ba47c7827.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-normal-vietnamese.992b5d147e.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-normal-latin-ext.768af2923e.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/hanken-grotesk-normal-latin.e9201eddf1.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-cyrillic-ext.62213be8a7.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-cyrillic.e17cfd15fb.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-greek.0a557721b1.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-vietnamese.c89b9cc0bc.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-latin-ext.db5ff4db83.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-latin.83c005d49d.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-cyrillic-ext.62213be8a7.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-cyrillic.e17cfd15fb.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-greek.0a557721b1.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-vietnamese.c89b9cc0bc.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-latin-ext.db5ff4db83.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-latin.83c005d49d.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-cyrillic-ext.62213be8a7.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-cyrillic.e17cfd15fb.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-greek.0a557721b1.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-vietnamese.c89b9cc0bc.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-latin-ext.db5ff4db83.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/jetbrains-mono-normal-latin.83c005d49d.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* END self-hosted webfonts */

:root {
  /* Palette — pulled from company logo */
  --ink: #0b2447;          /* Masqinox navy (logo wordmark) */
  --ink-soft: #173a6b;
  --ink-fade: #5b6b80;
  --paper: #f5f7fa;        /* cool steel white */
  --paper-deep: #e6ebf2;
  /* The brand blue from the logo's M. It was called --blue, and aliased as
     --blue for rules written against an older palette: three names, none of
     them the colour. --blue was the most used token on the site, 49 times,
     rendering blue. A name that contradicts its value is a trap for whoever
     picks the next colour, and an alias that contradicts BOTH is worse. */
  --blue: #0c488a;
  --blue-bright: #1f66b8;
  --blue-deep: #083566;
  /* The brand blue is for the paper ground. On the ink ground it is only
     2.69:1 -- under the 3:1 WCAG AA asks even of large text. This is the
     same hue lightened until it clears 4.5:1 (4.58:1), so it stays valid if
     the text it carries ever shrinks. (axe-core, 2026-09-19) */
  --accent-on-ink: #4a8ede;
  /* WhatsApp brand green. Not a Masqinox colour -- it belongs to WhatsApp and
     is used only on controls that open WhatsApp, so the button reads as the
     thing it launches. The footer's inline call icons already used the same
     value hardcoded; this is now the only place it is written down. */
  --whatsapp: #25d366;
  /* WeChat brand green, same reasoning as --whatsapp above: not a Masqinox
     colour, used only on the control that opens the WeChat panel. Its hover
     step, --wechat-deep, sits beside --whatsapp-deep below. */
  --wechat: #07c160;

  /* Palette completed 2026-09-19. These nine hues were in use as raw literals
     with no token; #fff alone appeared nine times. The colour gate below now
     refuses any hue that is not declared here, and refuses an rgba() whose RGB
     triplet does not match one of them -- which is what keeps the alpha
     variants in step with their base colour, since CSS cannot express that
     relationship without relative-colour syntax this site does not rely on. */
  --white:     #ffffff;
  --black:     #000000;
  --ink-deep:  #081428;   /* deeper than --ink; scrims over photography */
  --char:      #1a1d1f;   /* neutral charcoal, one scrim */
  --danger:    #b3261e;   /* form validation */
  --success:   #1d7a46;   /* form success */
  --sky:       #b9d3f2;   /* light blue on dark ink */
  --map-1:     #e9edf2;   /* coverage map choropleth, lightest */
  --map-2:     #dbe3ed;
  --map-3:     #c7d7ea;
  --map-4:     #b9cde6;   /* darkest */

  /* Elevation and rings. Seven jobs, named for the job. Before this there were
     nine box-shadow literals and no two elements shared one -- every shadow on
     the site was bespoke, which is not a design decision, it is nine of them. */
  /* Four elevations. There were seven, each used EXACTLY ONCE -- a token per
     element is a naming convention, not a system, and it cannot be reused
     because nothing else is allowed to look like it.

     The three merged into --shadow-raised were "panel", "form" and "drawer":
     navy shadows in one visual family (.35/.4/.45 at three geometries) lifting
     a card, a form and a drawer -- the same idea three times. The two merged
     into --ring were "focus" and "beacon": identical geometry at two alphas.

     Both merges take an EXISTING value rather than a new average, so every
     shadow on the site is one that already shipped somewhere. */
  --shadow-float:  0 10px 30px -10px rgba(0,0,0,0.3);      /* the floating WhatsApp button */
  --shadow-raised: 0 24px 60px -36px rgba(11,36,71,.35);   /* anything lifted off the page */
  --ring:          0 0 0 3px rgba(12,72,138,.12);          /* focus, and the map beacon */
  --ring-error:    0 0 0 3px rgba(179,38,30,.12);          /* invalid input -- a different hue, so it stays */
  /* A hairline that separates a DARK control from a DARK backdrop. The floating
     stack is fixed over whatever happens to scroll under it, and the navy mail
     and phone buttons disappear into the hero photograph and any dark section.
     The two green buttons carry their own contrast and do not get this -- the
     asymmetry is the point, not an oversight.

     0.5px: 1.5px was read as heavy, halved to 0.75, then taken down again.
     This is the practical floor -- below it the line stops resolving on a 1x
     display at all. A sub-pixel width behaves differently per display: on a
     phone at 2x or 3x it lands on 1-1.5 DEVICE pixels and stays crisp,
     which is the case that prompted this; on a 1x desktop monitor it
     antialiases to a fainter-than-1px line. That is acceptable, because the
     problem being solved is a dark PHOTO behind the stack, and photos go
     full-bleed on phones. It is invisible over the light page ground, which
     is correct -- there is nothing there to separate from. */
  --ring-hairline: 0 0 0 .5px rgba(255,255,255,.92);
  --whatsapp-deep: #1da851;
  --wechat-deep: #06a552;

  --rule: rgba(11, 36, 71, 0.12);
  --rule-strong: rgba(11, 36, 71, 0.25);

  /* Type */

  /* Spacing */
  --gutter: clamp(20px, 4vw, 56px);
  --max-w: 1440px;

  /* Motion */
  --ease: cubic-bezier(0.4, 0, 0.2, 1);
  --ease-out-strong: cubic-bezier(0.16, 1, 0.3, 1);
}

/* ==========================================================================
   TYPE SYSTEM -- the single source of truth for typography.
   Specification: TYPOGRAPHY-AUDIT.md (16 roles, approved 2026-09-18).

   Three layers; components consume only the third.
     primitive tokens  --font-* / --size-*   reusable raw values
     semantic tokens   --type-*              a primitive bound to a role
     role classes      .t-*                  the only place a component's
                                             typography may be declared

   A role block carries its component selectors alongside the role class, so
   one declaration block serves both the markup class and the existing
   component selector -- and no container rule can outrank a role.
   Responsive scaling belongs to the TOKEN layer (see the media block below),
   never to a component font-size. Adding a font-size anywhere outside this
   block or the documented exceptions is a build failure (Gate B).
   ========================================================================== */
:root{
  /* ---- primitive: families ---- */
  --font-display: 'Fraunces', 'Times New Roman', serif;
  --font-body:    'Hanken Grotesk', system-ui, sans-serif;
  --font-mono:    'JetBrains Mono', ui-monospace, monospace;

  /* ---- primitive: sizes ---- */
  --size-hero:    clamp(2.6rem, 8vw, 7.5rem);
  --size-page:    clamp(2.8rem, 6.4vw, 6rem);
  --size-cta:     clamp(2.2rem, 5.5vw, 5rem);
  --size-section: clamp(1.8rem, 4vw, 3.2rem);
  --size-sub:     clamp(1.8rem, 3.2vw, 2.6rem);
  --size-row:     clamp(1.3rem, 2.5vw, 2rem);
  --size-card:    clamp(1.25rem, 1.8vw, 1.5rem);
  --size-lead:    clamp(1.25rem, 2vw, 1.65rem);
  --size-numeral: clamp(2.2rem, 4.4vw, 3.8rem);
  --size-body-lg: clamp(1rem, 1.3vw, 1.15rem);
  --size-body:    1rem;
  --size-body-sm: 0.9rem;
  --size-caption: 0.82rem;
  --size-eyebrow: 0.7rem;
  --size-index:   0.85rem;
  --size-meta:    0.64rem;

  /* ---- semantic: role -> primitive ---- */
  --type-hero-display: var(--size-hero);
  --type-page-title:   var(--size-page);
  --type-cta-display:  var(--size-cta);
  --type-section:      var(--size-section);
  --type-subsection:   var(--size-sub);
  --type-row-title:    var(--size-row);
  --type-card-title:   var(--size-card);
  --type-lead:         var(--size-lead);
  --type-numeral:      var(--size-numeral);
  --type-body-lg:      var(--size-body-lg);
  --type-body:         var(--size-body);
  --type-body-sm:      var(--size-body-sm);
  --type-caption:      var(--size-caption);
  --type-eyebrow:      var(--size-eyebrow);
  --type-index:        var(--size-index);
  --type-meta:         var(--size-meta);
}

/* On a screen tall enough to have a real hero, the two hero-scale roles are
   budgeted against viewport HEIGHT so the opening fits one screen on a short
   laptop. No width-only clamp can express that. Redefining the token keeps
   the rule in the type system rather than scattering a font-size into a
   component media query. */
@media (min-width: 901px){
  :root{
    --size-hero:    clamp(2.6rem, min(7.2vw, 11.5vh), 7.5rem);
    --size-numeral: clamp(1.9rem, min(3.6vw, 6.4vh), 3.6rem);
  }
}

/* -------- HOW A ROLE WINS -------------------------------------------------
   The role class sits at specificity (0,1,0). Every component selector beside
   it is wrapped in :where(), which contributes ZERO specificity -- so a
   component selector acts as a default that any explicit role class on the
   element overrides.

   This is load-bearing, not tidiness. Before it, `.footer-col p` (0,1,1) beat
   `.footer-tagline` (0,1,0) and the tagline rendered at 14.72px instead of the
   11.52px it declared; the same collision hit `.footer-note`, `.coverage-line`
   and the `.eyebrow` inside `.pvd-intro`. Four elements had never once
   displayed at their own declared size.
   ------------------------------------------------------------------------ */

/* NOTE: .split-lead and .contact-card-note are NOT listed beside their roles
   below. Each sits inside a container another role owns (.split-text p,
   .contact-card p); inside :where() both are (0,0,0), so the later block would
   always win regardless of which is more specific. They carry their role class
   in the markup instead, at (0,1,0), which is unambiguous.  */

/* -------- DISPLAY -- Fraunces ------------------------------------------- */

/* The brand statement. Line-height stays 0.92 rather than the 0.95 of the
   other display roles: inside the height budget above, 0.95 adds ~4px of
   leading per line and can push the hero past one screen. */
.t-hero-display,
:where(.hero-headline){
  font-family: var(--font-display);
  font-size: var(--type-hero-display);
  font-weight: 300;
  font-variation-settings: 'opsz' 144, 'SOFT' 30, 'WONK' 0;
  line-height: 0.92;
  letter-spacing: -0.035em;
}

/* Identifies an internal page. */
.t-page-title,
:where(.page-hero h1){
  font-family: var(--font-display);
  font-size: var(--type-page-title);
  font-weight: 300;
  font-variation-settings: 'opsz' 144, 'SOFT' 30;
  line-height: 0.95;
  letter-spacing: -0.035em;
}

/* Closes the page. Deliberately distinct from the page title. */
.t-cta-display,
:where(.cta-block h2){
  font-family: var(--font-display);
  font-size: var(--type-cta-display);
  font-weight: 300;
  font-variation-settings: 'opsz' 144, 'SOFT' 30;
  line-height: 0.95;
  letter-spacing: -0.035em;
}

.t-section,
:where(.section-title){
  font-family: var(--font-display);
  font-size: var(--type-section);
  font-weight: 300;
  font-variation-settings: 'opsz' 144, 'SOFT' 30;
  line-height: 1;
  letter-spacing: -0.025em;
}

.t-subsection,
:where(.coverage-intro h3, .usecase-title, .pvd-title, .gallery-banner-line){
  font-family: var(--font-display);
  font-size: var(--type-subsection);
  font-weight: 300;
  font-variation-settings: 'opsz' 144, 'SOFT' 30;
  line-height: 1.05;
  letter-spacing: -0.025em;
}

.t-row-title,
:where(.industries-list .ind-name){
  font-family: var(--font-display);
  font-size: var(--type-row-title);
  font-weight: 400;
  font-variation-settings: 'opsz' 144, 'SOFT' 30;
  line-height: 1.1;
  letter-spacing: -0.02em;
}

.t-card-title,
:where(.product-card-name, .pillar h2, .why-grid h3, .services-list li,
       .legal h2, .nav-panel li a){
  font-family: var(--font-display);
  font-size: var(--type-card-title);
  font-weight: 400;
  font-variation-settings: 'opsz' 144, 'SOFT' 40;
  line-height: 1.1;
  letter-spacing: -0.015em;
}

.t-lead,
:where(.hero-h1){
  font-family: var(--font-display);
  font-size: var(--type-lead);
  font-weight: 300;
  font-variation-settings: 'opsz' 30, 'SOFT' 50;
  line-height: 1.35;
  letter-spacing: -0.01em;
}

.t-numeral,
:where(.hero-stat-num) {
  font-family: var(--font-display);
  font-size: var(--type-numeral);
  font-weight: 300;
  font-variation-settings: "opsz" 144, "SOFT" 30;
  line-height: 1;
  letter-spacing: -0.035em;
}

/* -------- BODY -- Hanken Grotesk ---------------------------------------- */

.t-body-lg,
:where(.page-hero-lead, .cta-block-side p, .services-intro p, .enquiry-side p,
       .coverage-intro-body p){
  font-family: var(--font-body);
  font-size: var(--type-body-lg);
  font-weight: 400;
  line-height: 1.6;
  letter-spacing: 0;
}

/* Form controls sit here deliberately: under 16px, iOS Safari zooms the
   viewport on focus -- which the enquiry form did on every field. */
.t-body,
:where(.split-text p, .pvd-intro p, .contact-card a, .contact-card p,
       .legal p, .legal li, .enquiry-points li, .gcc-group li,
       .field input, .field select, .field textarea){
  font-family: var(--font-body);
  font-size: var(--type-body);
  font-weight: 400;
  line-height: 1.65;
  letter-spacing: 0;
}

.t-body-sm,
:where(.wechat-panel-title, .nav-links a, .nav-cta, .btn, .accordion-caption, .footer-col a,
       .footer-col p, .footer-note, .enquiry-fallback, .enquiry-status,
       .pillar p, .why-grid p, .product-card-desc, .gcc-note){
  font-family: var(--font-body);
  font-size: var(--type-body-sm);
  font-weight: 400;
  line-height: 1.5;
  letter-spacing: 0;
}

.t-caption,
:where(.wechat-panel-id, .services-list li small, .field-error, .enquiry-wa-note){
  font-family: var(--font-body);
  font-size: var(--type-caption);
  font-weight: 400;
  line-height: 1.45;
  letter-spacing: 0;
}

/* -------- UTILITY -- JetBrains Mono -------------------------------------- */

/* Short, tertiary, uppercase labels ONLY. Never instructions, legal copy,
   form controls, error messages, task-critical navigation or substantive
   prose -- Gate B rejects those. Body copy and controls stay at 16px. */
.t-eyebrow,
:where(.eyebrow, .manifesto-marker, .product-card-link, .product-card-num,
       .pillar-num, .why-num, .pvd-swatch-label, .contact-card h3,
       .gcc-group h3, .gcc-stage, .gcc-replay, .usecase-kicker,
       .gallery-banner-kicker, .gallery-tile figcaption, .hero-image-caption,
       .hero-stat-label, .footer-tagline, .industries-list .ind-num,
       .legal-meta, .field label, .services-list li span){
  font-family: var(--font-mono);
  font-size: var(--type-eyebrow);
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: 0.15em;
  text-transform: uppercase;
}

.t-index,
:where(.section-num){
  font-family: var(--font-mono);
  font-size: var(--type-index);
  font-weight: 600;
  line-height: 1;
  letter-spacing: 0.06em;
  text-transform: none;
}

.t-meta,
:where(.footer-bottom, .usecase-note, .uc-tile figcaption, .nav-brand-meta,
       .accordion-label em, .gcc-group li i, .footer-note .lbl,
       .footer-warehouse span, .quick-contact > :is(a, button)::after){
  font-family: var(--font-mono);
  font-size: var(--type-meta);
  font-weight: 500;
  line-height: 1.5;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* -------- DOCUMENTED EXCEPTIONS ------------------------------------------
   Outside the scale because of a property of the ELEMENT, not a preference.
   Gate B reads this list; adding to it without a matching entry in
   TYPOGRAPHY-AUDIT.md section 6 fails the build.

     .hero-subline        height-budgeted with the hero it belongs to
     .accordion-label     fixed-width tile under white-space: nowrap
     .usecase-num         outlined numeral -- a graphic made of type
     .coverage-line       the one deliberate Fraunces italic accent
     .cta-block::before   decorative oversized watermark glyph
     *-num small          relative superscript on a statistic
     .nav-cta @720        a control in a width-constrained nav bar
     figcaption @520      caption overlay inside a fixed photo tile
     .gcc-* @560          absolutely-positioned chips over the map
   ------------------------------------------------------------------------ */
.coverage-line {
  line-height: 1.55;
}

/* ===================== end TYPE SYSTEM =================================== */

* { box-sizing: border-box; margin: 0; padding: 0; }

html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }

body {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.5;
  color: var(--ink);
  background: var(--paper);
  font-feature-settings: "ss01", "cv11", "ss03";
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  position: relative;
}

/* Paper grain texture overlay */
body::before {
  content: '';
  position: fixed; inset: 0;
  background-image:
    radial-gradient(circle at 30% 40%, rgba(12, 72, 138, 0.025) 0%, transparent 50%),
    radial-gradient(circle at 80% 70%, rgba(11, 36, 71, 0.025) 0%, transparent 50%);
  pointer-events: none;
  z-index: 1;
}

img { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font: inherit; background: none; border: none; cursor: pointer; color: inherit; }

/* ============================================================
   Typography utilities
   ============================================================ */


.eyebrow {
  color: var(--ink-fade);
  display: inline-flex;
  align-items: center;
  gap: 0.6em;
}
.eyebrow::before {
  content: '';
  display: inline-block;
  width: 24px;
  height: 1px;
  background: var(--ink-fade);
}


/* ============================================================
   Layout primitives
   ============================================================ */

.container {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 var(--gutter);
  position: relative;
  z-index: 2;
}

.section { padding: clamp(48px, 6vw, 96px) 0; position: relative; z-index: 2; }
.section-tight { padding: clamp(32px, 4vw, 64px) 0; }

/* ============================================================
   Navigation
   ============================================================ */

/* The <header> landmark wrapping .nav is the STICKY element, not .nav itself.
   A sticky box only travels inside its containing block, and <header> is
   exactly as tall as .nav — so leaving the sticky on .nav gave it zero room
   and the bar scrolled away with the page (regression caught 2026-09-18). */
header {
  top: 0;
  z-index: 100;
}
.nav {
  background: rgba(245, 247, 250, 0.92);
  backdrop-filter: saturate(140%) blur(12px);
  -webkit-backdrop-filter: saturate(140%) blur(12px);
  z-index: 100;
  border-bottom: 1px solid var(--rule);
}
.nav-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 14px var(--gutter);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 32px;
}
.nav-brand {
  display: flex;
  align-items: center;
  gap: 12px;
  text-decoration: none;
  color: var(--ink);
}
.nav-brand img {
  width: auto;
  display: block;
}
@media (min-width: 1081px) {
  .nav-brand img { height: 46px; }
}
.nav-brand-meta {
  color: var(--ink-fade);
  display: none;
  padding-left: 12px;
  border-left: 1px solid var(--rule);
}
@media (min-width: 901px) { .nav-brand-meta { display: inline-block; } }

.footer-brand-logo {
  display: block;
  height: auto;
}

.nav-links {
  display: flex;
  gap: clamp(16px, 2.4vw, 36px);
  list-style: none;
  align-items: center;
}
.nav-links a {
  color: var(--ink);
  position: relative;
  padding: 4px 2px;
  transition: color 200ms var(--ease);
}
.nav-links a::after {
  content: '';
  position: absolute;
  left: 0; right: 100%; bottom: 0;
  height: 1px;
  background: var(--blue);
  transition: right 300ms var(--ease-out-strong);
}
.nav-links a:hover { color: var(--blue); }
.nav-links a:hover::after,
.nav-links a.active::after { right: 0; }

.nav-cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 16px;
  background: var(--ink);
  color: var(--paper);
  transition: background 200ms var(--ease), transform 200ms var(--ease);
}
.nav-cta:hover { background: var(--blue); transform: translateY(-1px); }
.nav-cta svg { width: 14px; height: 14px; transition: transform 200ms var(--ease); }
.nav-cta:hover svg { transform: translateX(3px); }

@media (max-width: 720px) {
  .nav-links li:nth-child(2), .nav-links li:nth-child(3) { display: none; }
  .nav-cta { padding: 8px 12px; font-size: 0.75rem; }
}

/* ============================================================
   Hero (homepage)
   ============================================================ */

.hero {
  padding: clamp(40px, 5vw, 70px) 0 clamp(32px, 4vw, 60px);
  position: relative;
  overflow: hidden;
}
.hero-grid {
  display: grid;
  gap: clamp(24px, 5vw, 80px);
}
@media (max-width: 900px) { .hero-grid { grid-template-columns: 1fr; } }



/* Homepage H1 — states what the business is and where. Sits above the brand
   tagline, which is now a <p>. Deliberately readable, not an eyebrow. */
.hero-h1 {
  color: var(--ink);
  max-width: 30ch;
  /* balance the two lines rather than breaking after the ampersand */
  text-wrap: balance;
}

.hero-headline em {
  font-style: italic;
  color: var(--blue);
  font-variation-settings: 'opsz' 144, 'SOFT' 60, 'WONK' 1;
  font-weight: 400;
}
.hero-subline {
  font-family: var(--font-body);
  font-size: clamp(0.95rem, 1.1vw, 1.05rem);
  max-width: 460px;
  color: var(--ink-soft);
  line-height: 1.55;
}
.hero-actions { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
.hero-image-wrap {
  position: relative;
  overflow: hidden;
}
.hero-image-wrap img {
  object-fit: cover;
  filter: contrast(1.05) saturate(0.9);
  transform: scale(1.02);
}
.hero-image-caption {
  position: absolute;
  bottom: 16px; left: 16px; right: 16px;
  color: rgba(245, 247, 250, 0.9);
  text-shadow: 0 1px 3px rgba(0,0,0,0.6);
  display: flex;
  justify-content: space-between;
}

/* Button styles */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 16px 24px;
  transition: all 250ms var(--ease);
  position: relative;
  border: 1px solid currentColor;
}
.btn-ink { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.btn-ink:hover { background: var(--blue); border-color: var(--blue); transform: translateY(-2px); }
.btn-paper { background: transparent; color: var(--ink); }
.btn-paper:hover { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.btn svg { width: 16px; height: 16px; transition: transform 250ms var(--ease); }
.btn:hover svg { transform: translateX(4px); }

/* ============================================================
   Stats strip
   ============================================================ */

.stats {
  border-top: 1px solid var(--rule-strong);
  border-bottom: 1px solid var(--rule-strong);
  padding: clamp(40px, 6vw, 80px) 0;
  background: var(--paper);
}
.stats-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(20px, 3vw, 60px);
}
@media (max-width: 720px) { .stats-inner { grid-template-columns: repeat(2, 1fr); gap: 32px; } }

/* ============================================================
   Section headers (numbered)
   ============================================================ */

.section-header {
  display: grid;
  gap: clamp(20px, 3vw, 50px);
  align-items: baseline;
  margin-bottom: clamp(30px, 5vw, 70px);
  border-top: 1px solid var(--rule-strong);
  padding-top: 32px;
}
.section-num {
  color: var(--blue);
}
.section-title {
  /* typography supplied by its role class */
}
.section-title em { font-style: italic; color: var(--blue); font-variation-settings: 'opsz' 144, 'SOFT' 60, 'WONK' 1; }

/* ============================================================
   Manifesto / About content
   ============================================================ */

.manifesto {
  display: grid;
  grid-template-columns: 100px 1fr 1fr;
  gap: clamp(20px, 3vw, 50px);
  align-items: start;
}
@media (max-width: 820px) { .manifesto { grid-template-columns: 1fr; } }
.manifesto-marker {
  color: var(--ink-fade);
}
.manifesto-marker strong { color: var(--ink); font-weight: 600; display: block; }
.manifesto-body p {
  margin-bottom: 1.2em;
  color: var(--ink-soft);
}
.manifesto-body p:first-child {
  color: var(--ink);
}
.manifesto-body p:first-child em { font-style: italic; color: var(--blue); }

/* ============================================================
   Product grid (Home)
   ============================================================ */

.product-grid {
  display: grid;
  gap: 0;
  border-top: 1px solid var(--rule);
  border-left: 1px solid var(--rule);
}
.product-card {
  border-right: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  padding: 24px 24px 24px;
  display: flex;
  flex-direction: column;
  background: var(--paper);
  transition: background 350ms var(--ease);
  cursor: pointer;
  position: relative;
}
.product-card:hover { background: var(--paper-deep); }
.product-card-num {
  color: var(--ink-fade);
  margin-bottom: 16px;
}
.product-card-img {
  margin-bottom: 20px;
  overflow: hidden;
  position: relative;
}
.product-card-img img {
  width: 100%;
  height: 100%;
  transition: transform 600ms var(--ease-out-strong);
}
.product-card:hover .product-card-img img { transform: scale(1.05) rotate(-2deg); }
.product-card-name {
  margin-bottom: 8px;
}
.product-card-desc {
  color: var(--ink-fade);
  margin-bottom: 16px;
  flex: 1;
}
.product-card-link {
  color: var(--ink);
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.product-card-link::after { content: '→'; transition: transform 250ms var(--ease); }
.product-card:hover .product-card-link { color: var(--blue); }
.product-card:hover .product-card-link::after { transform: translateX(4px); }

/* ============================================================
   Editorial photo block
   ============================================================ */



/* ============================================================
   Industries list
   ============================================================ */

.industries-list { list-style: none; }
.industries-list li {
  border-top: 1px solid var(--rule);
  padding: clamp(20px, 3vw, 36px) 0;
  display: grid;
  grid-template-columns: 80px 1fr;
  gap: clamp(20px, 3vw, 50px);
  align-items: center;
  transition: padding-left 300ms var(--ease), color 300ms var(--ease);
  cursor: default;
}
.industries-list li:last-child { border-bottom: 1px solid var(--rule); }
.industries-list li:hover { padding-left: 16px; color: var(--blue); }
.industries-list .ind-num {
  color: var(--ink-fade);
}
.industries-list .ind-name {
  /* typography supplied by its role class */
}

/* ============================================================
   CTA Block
   ============================================================ */

.cta-block {
  background: var(--ink);
  color: var(--paper);
  padding: clamp(60px, 9vw, 130px) var(--gutter);
  position: relative;
  overflow: hidden;
}
.cta-block-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(24px, 5vw, 80px);
  align-items: end;
}
@media (max-width: 820px) { .cta-block-inner { grid-template-columns: 1fr; } }
.cta-block h2 {
  /* typography supplied by its role class */
}
.cta-block h2 em {
  font-style: italic;
  color: var(--accent-on-ink);
  font-variation-settings: 'opsz' 144, 'SOFT' 60, 'WONK' 1;
}
.cta-block-side p {
  color: rgba(245, 247, 250, 0.75);
  margin-bottom: 32px;
}
.cta-block .btn-ink {
  background: var(--paper);
  color: var(--ink);
  border-color: var(--paper);
}
.cta-block .btn-ink:hover { background: var(--blue); color: var(--paper); border-color: var(--blue); }

/* Decorative oversized number behind CTA */
.cta-block::before {
  content: none;
  position: absolute;
  font-family: var(--font-display);
  font-style: italic;
  font-variation-settings: 'opsz' 144, 'SOFT' 90, 'WONK' 1;
  font-size: 35vw;
  font-weight: 300;
  color: rgba(12, 72, 138, 0.05);
  bottom: -15vw;
  right: -5vw;
  line-height: 0.85;
  pointer-events: none;
  user-select: none;
}

/* ============================================================
   Footer
   ============================================================ */

.footer {
  background: var(--paper-deep);
  border-top: 1px solid var(--rule);
}
.footer-grid {
  display: grid;
}



/* second sub-heading inside a footer column (e.g. Follow, under Email) */
.footer-col ul { list-style: none; }
.footer-col a {
  color: var(--ink);
  transition: color 200ms var(--ease);
  display: inline-flex;
}
.footer-col a:hover { color: var(--blue); }

.footer-bottom {
  border-top: 1px solid var(--rule);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 20px;
  flex-wrap: wrap;
  color: var(--ink-fade);
}

/* ============================================================
   Page hero (about/products/contact)
   ============================================================ */

.page-hero {
  border-bottom: 1px solid var(--rule);
}
.page-hero-grid {
  display: grid;
  gap: clamp(24px, 5vw, 80px);
}
.page-hero h1 {
  /* typography supplied by its role class */
}
.page-hero h1 em { font-style: italic; color: var(--blue); font-variation-settings: 'opsz' 144, 'SOFT' 60, 'WONK' 1; }

/* ============================================================
   Products page — Bento grid + PVD swatches
   ============================================================ */



/* Hover-reveal subtitle (tagline only — product name is baked into image plate) */


 /* product name is in the image plate */


/* Bento sizing classes */
/* PVD finish swatches */
.pvd-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
}
@media (max-width: 720px) { .pvd-grid { grid-template-columns: repeat(2, 1fr); } }
.pvd-swatch {
  aspect-ratio: 1;
  position: relative;
  overflow: hidden;
  border-right: 1px solid var(--paper);
  border-bottom: 1px solid var(--paper);
}
.pvd-swatch img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform 800ms var(--ease-out-strong);
}
.pvd-swatch:hover img { transform: scale(1.08); }
.pvd-swatch-label {
  position: absolute;
  bottom: 0; left: 0; right: 0;
  padding: 16px;
  background: linear-gradient(to top, rgba(0,0,0,0.85), transparent);
  color: var(--paper);
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
}

/* ============================================================
   Contact page specifics
   ============================================================ */



/* ============================================================
   About page — Timeline / numbered chapters
   ============================================================ */


/* ============================================================
   Quick-contact floating stack
   ============================================================ */

/* The <nav class="quick-contact"> landmark already wrapped the WhatsApp
   button (added for axe "region", 2026-09-19) and was unstyled. It is now the
   stack itself, so adding a channel is one anchor in the markup and one colour
   rule here -- there is no second wrapper and nothing is positioned
   individually.

   Order, top to bottom: WhatsApp, email, phone. WhatsApp sits furthest from
   the thumb because it is the only one that carries a pre-filled message and
   is the channel the site pushes everywhere else; the two new ones are the
   fallbacks for someone who does not use it. WeChat is deferred and will
   append at the bottom. */
.quick-contact {
  position: fixed;
  bottom: 24px; right: 24px;
  z-index: 50;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.quick-contact > :is(a, button) {
  position: relative;
  width: 56px; height: 56px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--white);
  transition: transform 250ms var(--ease), background 250ms var(--ease);
  /* Two things here are load-bearing and neither is obvious.

     ONE DECLARATION. box-shadow does not cascade per-layer: a separate rule
     adding only the hairline would DISCARD the float shadow rather than add to
     it. Both layers must ride in this single declaration, hairline first so it
     draws on top of the drop shadow.

     ALL FOUR BUTTONS. This started as a mail/tel-only override and had to
     out-specify `.quick-contact a` to survive -- `.tel-float` alone is (0,1,0)
     and loses to (0,1,1), so the first attempt never applied at all and failed
     INVISIBLY: the button kept its drop shadow and simply looked unchanged.
     Declaring it on the shared rule removes that trap entirely -- there is now
     nothing to out-specify, so the ring cannot be silently lost again. */
  box-shadow: var(--ring-hairline), var(--shadow-float);
}
.quick-contact > :is(a, button):hover { transform: scale(1.08); }
.quick-contact > :is(a, button) svg { width: 26px; height: 26px; }

/* One hue per channel. WhatsApp keeps its brand green because the button reads
   as the thing it launches; the other two take Masqinox colours rather than
   importing a third-party red, and are told apart by icon and by the mid-blue
   / deep-navy step, not by hue alone. Hover darkens in every case. */
.whatsapp-float { background: var(--whatsapp); }
.whatsapp-float:hover { background: var(--whatsapp-deep); }
.mail-float { background: var(--blue); }
.mail-float:hover { background: var(--blue-deep); }
.tel-float { background: var(--ink); }
.tel-float:hover { background: var(--ink-deep); }
.wechat-float { background: var(--wechat); }

.wechat-float:hover { background: var(--wechat-deep); }
/* The WeChat control is a <button>, not a link: it opens a panel, it does not
   navigate. These undo the UA button chrome so it matches its three <a>
   neighbours, which share every other rule through `> :is(a, button)`. */
.quick-contact > button { border: 0; padding: 0; cursor: pointer; }

/* Anchored to the fixed stack, opening to its left and bottom-aligned, so it
   never covers the button that closes it. The panel is frosted, not opaque;
   the QR keeps its own solid white ground inside the SVG, so its quiet zone
   does not depend on what shows through. */
.wechat-panel {
  position: absolute;
  right: calc(100% + 12px);
  bottom: 0;
  width: 208px;
  padding: 16px;
  border-radius: 12px;
  background: color-mix(in srgb, var(--white) 82%, transparent);
  backdrop-filter: blur(10px);
  color: var(--ink);
  box-shadow: var(--shadow-float);
  text-align: center;
}
.wechat-panel svg { display: block; width: 100%; height: auto; }
.wechat-panel-title { margin: 0 0 8px; }
.wechat-panel-id { margin: 8px 0 0; user-select: all; }
.wechat-panel-close {
  position: absolute;
  top: 0; right: 0;
  width: 44px; height: 44px;
  border: 0;
  background: none;
  color: inherit;
  cursor: pointer;
}
.wechat-panel-close svg { width: 14px; height: 14px; margin: auto; }
/* Smaller on phones only. 56px is fixed while the screen is not, so a button
   occupies 4.1% of a 1366px desktop and 14.4% of a 390px phone -- measured on
   the live site, not estimated. 48px brings that to 12.3%, and the stack of
   three to 168px tall rather than 192px.

   48 and not less: it is Material's touch target and clears WCAG 2.5.5 Target
   Size (44x44). Going below 44 would trade a real accessibility floor for a few
   pixels of tidiness, on the controls the site has for starting a
   conversation. Desktop is untouched. */
@media (max-width: 640px) {
  .quick-contact > :is(a, button) { width: 48px; height: 48px; }
  .quick-contact > :is(a, button) svg { width: 22px; height: 22px; }
}
.quick-contact > :is(a, button)::after {
  position: absolute;
  right: calc(100% + 12px);
  color: var(--ink);
  white-space: nowrap;
  opacity: 0;
  transition: opacity 200ms var(--ease);
}
.whatsapp-float::after { content: 'WhatsApp →'; }
.mail-float::after { content: 'Email →'; }
.tel-float::after { content: 'Call →'; }
.wechat-float::after { content: 'WeChat →'; }
.quick-contact > :is(a, button):hover::after { opacity: 1; }

/* ============================================================
   Demo banner (top of every page — keep from v1)
   ============================================================ */


/* ============================================================
   Page-load reveal animations
   ============================================================ */

@keyframes rise {
  from { opacity: 0; transform: translateY(24px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes fade {
  from { opacity: 0; }
  to { opacity: 1; }
}
@keyframes draw-line {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}

.reveal { opacity: 0; transform: translateY(24px); animation: rise 900ms var(--ease-out-strong) forwards; }
.reveal-1 { animation-delay: 100ms; }
.reveal-2 { animation-delay: 220ms; }
.reveal-3 { animation-delay: 340ms; }
.reveal-4 { animation-delay: 460ms; }
.reveal-5 { animation-delay: 580ms; }
.reveal-6 { animation-delay: 700ms; }
.reveal-7 { animation-delay: 820ms; }
.reveal-img { opacity: 0; animation: fade 1400ms 250ms var(--ease-out-strong) forwards; }

/* Scroll-triggered reveal — only kicks in when JS confirms support via .has-js on <html> */
.has-js [data-reveal] { opacity: 0; transform: translateY(40px); transition: opacity 900ms var(--ease-out-strong), transform 900ms var(--ease-out-strong); }
.has-js [data-reveal].in { opacity: 1; transform: translateY(0); }
/* Failsafe: anything still hidden after 2s gets revealed regardless */
@keyframes reveal-failsafe { to { opacity: 1; transform: translateY(0); } }
.has-js [data-reveal] { animation: reveal-failsafe 600ms 2.5s var(--ease-out-strong) forwards; }

/* ============================================================
   Print + reduced motion
   ============================================================ */

@media (prefers-reduced-motion: reduce) {
  *, ::before, ::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}

/* Masqinox: customer portal link in nav */

/* ============================================================
   Home refresh (2026-09-15): pillars, why-choose-us, PVD intro,
   coverage map, footer alignment
   ============================================================ */

/* Four pillars strip (replaces the numeric stats) */
.pillars { align-items: start; }
.pillar { position: relative; }
.pillar:not(:last-child)::after {
  content: ''; position: absolute; top: 4%; bottom: 4%;
  right: calc(-1 * clamp(10px, 1.5vw, 30px)); width: 1px; background: var(--rule);
}
@media (max-width: 720px) { .pillar:nth-child(2n)::after { display: none; } }
.pillar-num { color: var(--blue); display: block; margin-bottom: 12px; }
.pillar p { color: var(--ink-fade); max-width: 26ch; }

/* Plain body paragraph inside the manifesto second column */
.manifesto-body p.body-copy { font-style: normal; color: var(--ink-soft);
}
.manifesto-body .btn { margin-top: 8px; }

/* Product photos: photographic crop instead of padded contain */
.product-card-photo { aspect-ratio: 1024 / 600; background: var(--ink); }
.product-card-photo img { object-fit: cover; padding: 0; filter: contrast(1.04) saturate(0.92); }
.product-card:hover .product-card-photo img { transform: scale(1.04) rotate(0); }

/* PVD intro row above the swatches */
.pvd-intro {
  display: grid; grid-template-columns: 1.2fr 1fr; gap: clamp(20px, 4vw, 60px); align-items: end;
  margin-top: clamp(40px, 6vw, 80px); padding-top: 24px; border-top: 1px solid var(--rule-strong);
}
@media (max-width: 820px) { .pvd-intro { grid-template-columns: 1fr; } }
.pvd-title { margin-top: 12px;
}
.pvd-intro p { color: var(--ink-soft); }
.pvd-grid { margin-top: 24px; }

/* Why choose us — five equal columns */
.why-grid {
  list-style: none; display: grid; grid-template-columns: repeat(5, 1fr); gap: 0;
  border-top: 1px solid var(--rule); border-left: 1px solid var(--rule);
}
@media (max-width: 1080px) { .why-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 720px) { .why-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 480px) { .why-grid { grid-template-columns: 1fr; } }
.why-grid li { padding: 24px 20px 32px; border-right: 1px solid var(--rule); border-bottom: 1px solid var(--rule); transition: background 300ms var(--ease); }
.why-grid li:hover { background: var(--paper-deep); }
.why-num { color: var(--blue); display: block; margin-bottom: 16px; }
.why-grid h3 { margin-bottom: 8px;
}
.why-grid p { color: var(--ink-fade); }

/* Coverage: dotted world map instead of a photo */
.coverage-line { font-family: var(--font-display); font-style: italic; font-size: 1.15rem; }

/* Footer: brand column aligned with the other columns' top line */
.footer-tagline { max-width: 34ch; }
/* ============================================================
   Light & motion layer (2026-09-15) — light falls on the metal
   ============================================================ */

/* Shared sheen band: 130deg soft highlight, parked off-canvas left */
.sheen { position: absolute; inset: 0; pointer-events: none; overflow: hidden; z-index: 2; }
.sheen::before {
  content: ''; position: absolute; top: -20%; bottom: -20%; left: 0; width: 40%;
  background: linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.15) 35%, rgba(255,255,255,.6) 50%, rgba(255,255,255,.15) 65%, rgba(255,255,255,0) 100%);
  transform: translateX(-120%) skewX(-18deg);
  will-change: transform;
}
@keyframes sheen-pass {
  from { transform: translateX(-120%) skewX(-18deg); }
  to   { transform: translateX(290%) skewX(-18deg); }
}

/* 1. Hero coil sheen — driven by JS (.run), repeats every 9s while visible */
.hero-sheen { mix-blend-mode: screen; }
.hero-sheen::before { width: 6.5%; background: linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.025) 30%, rgba(255,255,255,.14) 50%, rgba(255,255,255,.025) 70%, rgba(255,255,255,0) 100%); }
.hero-sheen.run::before { animation: hero-sheen-pass 4200ms cubic-bezier(.45,.05,.35,1) both; }
@keyframes hero-sheen-pass {
  from { transform: translateX(-160%) skewX(-18deg); }
  to   { transform: translateX(1700%) skewX(-18deg); }
}

/* 2. PVD swatch sheen — staggered once on entry, again on hover */
.pvd-swatch { isolation: isolate; }
.pvd-sheen { mix-blend-mode: screen; opacity: .6; }
.pvd-hairline .pvd-sheen { opacity: .32; }
.pvd-sheen.run::before { animation: sheen-pass 1100ms cubic-bezier(.22,1,.36,1) both; animation-delay: var(--sheen-delay, 0ms); }
.pvd-swatch-label { z-index: 3; }

/* 4. Cursor spotlight on PVD tiles (desktop, fine pointer only) */
.pvd-spot {
  position: absolute; inset: 0; pointer-events: none; z-index: 2; opacity: 0;
  mix-blend-mode: soft-light;
  background: radial-gradient(220px circle at var(--mx, 50%) var(--my, 50%), rgba(255,255,255,.9), rgba(255,255,255,0) 70%);
  transition: opacity 400ms var(--ease);
}
.pvd-hairline .pvd-spot { background: radial-gradient(220px circle at var(--mx, 50%) var(--my, 50%), rgba(255,255,255,.5), rgba(255,255,255,0) 70%); }
@media (hover: hover) and (pointer: fine) { .pvd-swatch:hover .pvd-spot { opacity: 1; } }

/* 3. Section rule draws left to right in brand blue after the header reveals */
.section-header { position: relative; }
.section-header::after {
  content: ''; position: absolute; left: 0; right: 0; top: -1px; height: 2px;
  background: linear-gradient(90deg, var(--ink) 0%, var(--blue) 55%, rgba(12,72,138,.35) 100%);
  transform: scaleX(0); transform-origin: left;
  transition: transform 1600ms cubic-bezier(.65,0,.35,1) 200ms;
}
.section-header.in::after { transform: scaleX(1); }
/* Glowing tip that rides the front of the drawing line, then fades */
.section-header::before {
  content: ''; position: absolute; top: -4px; left: 0; width: 90px; height: 8px; margin-left: -90px;
  background: radial-gradient(ellipse at right center, rgba(31,102,184,.9) 0%, rgba(31,102,184,.35) 35%, rgba(31,102,184,0) 70%);
  filter: blur(1px); opacity: 0; pointer-events: none;
}
.section-header.in::before { animation: rule-tip 1600ms cubic-bezier(.65,0,.35,1) 200ms both; }
@keyframes rule-tip {
  0%   { left: 0%;   opacity: 0; }
  10%  { opacity: 1; }
  85%  { opacity: 1; }
  100% { left: 100%; opacity: 0; }
}
html:not(.has-js) .section-header::after { transform: scaleX(1); }

/* 5. Navy button light sweep — once per hover */
.btn-ink, .nav-cta { position: relative; overflow: hidden; }
.btn-ink::after, .nav-cta::after {
  content: ''; position: absolute; top: -10%; bottom: -10%; left: 0; width: 30%;
  background: linear-gradient(45deg, transparent, rgba(255,255,255,.22) 50%, transparent);
  transform: translateX(-160%) skewX(-20deg); transition: none; pointer-events: none;
}
.btn-ink:hover::after, .nav-cta:hover::after { transform: translateX(460%) skewX(-20deg); transition: transform 600ms ease-out; }

/* 6. Map — UAE beacon pulse */
/* Reduced motion: switch these effects off outright (no flicker) */
@media (prefers-reduced-motion: reduce) {
  .sheen, .pvd-spot { display: none !important; }
  .section-header::after { transform: scaleX(1); transition: none; }
  .section-header::before { display: none; }
  .btn-ink::after, .nav-cta::after { display: none; }
}

/* ============================================================
   Motion layer 2 (2026-09-15) — effects carried over from
   the previous site, restyled for the light Masqinox design
   ============================================================ */

/* Hero: animated dot matrix behind the content (canvas) */
.hero { isolation: isolate; }
.hero-matrix { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; }
.hero .container { position: relative; z-index: 2; }

/* Hero: count-up stats */
.hero-stats {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 0;
  margin-top: clamp(32px, 5vw, 64px);
  background: rgba(255,255,255,.72); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  border: 1px solid var(--rule); box-shadow: var(--shadow-raised);
}
.hero-stat { padding: clamp(18px, 2.4vw, 30px) clamp(16px, 2.4vw, 36px); position: relative; }
.hero-stat + .hero-stat::before { content: ''; position: absolute; left: 0; top: 22%; bottom: 22%; width: 1px; background: var(--rule-strong); }
.hero-stat-num { color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.hero-stat-num small { font-size: .55em; color: var(--blue); margin-left: 2px; vertical-align: super; }
.hero-stat-label { color: var(--ink-fade); margin-top: 8px; }
@media (max-width: 560px) {
  .hero-stats { grid-template-columns: 1fr; }
  .hero-stat + .hero-stat::before { left: 16px; right: 16px; top: 0; bottom: auto; width: auto; height: 1px; }
}

/* Pillar icons grow on hover */
.pillar-icon { width: 38px; height: 38px; fill: none; stroke: var(--blue); stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; display: block; margin-bottom: 16px; transform-origin: left center; transition: transform 400ms var(--ease-out-strong), stroke 300ms var(--ease); }
.pillar:hover .pillar-icon { transform: scale(1.18); stroke: var(--ink); }

/* Image accordion — panels widen on hover/focus */
.accordion { display: flex; gap: 8px; height: clamp(320px, 38vw, 480px); margin-bottom: clamp(48px, 7vw, 90px); }
.accordion-item {
  position: relative; flex: 1 1 0; min-width: 0; overflow: hidden; display: block; color: var(--white);
  background-color: var(--ink); background-position: center; background-size: cover; background-repeat: no-repeat;
  transition: flex-grow 900ms cubic-bezier(.65,0,.35,1);
}
.accordion-item::after { content: ''; position: absolute; inset: 0; background: linear-gradient(to top, rgba(8,20,40,.78) 0%, rgba(8,20,40,.15) 45%, rgba(8,20,40,.05) 100%); transition: background 600ms var(--ease); }
.accordion-item.is-open { flex-grow: 3.2; }
.accordion-label {
  position: absolute; left: 22px; bottom: 22px; z-index: 2; display: flex; align-items: baseline; gap: 12px;
  font-family: var(--font-display); font-weight: 400; font-variation-settings: 'opsz' 144, 'SOFT' 40;
  font-size: clamp(1.1rem, 1.8vw, 1.7rem); line-height: 1.05; letter-spacing: -0.015em; white-space: nowrap;
}
.accordion-label em { font-style: normal; opacity: .75; }
.accordion-caption {
  position: absolute; left: 22px; right: 22px; bottom: 60px; z-index: 2; max-width: 34ch;
  opacity: 0; transform: translateY(10px); transition: opacity 500ms var(--ease), transform 500ms var(--ease);
}
.accordion-item.is-open .accordion-caption { opacity: .9; transform: none; transition-delay: 350ms; }
.accordion-item:not(.is-open) .accordion-label { writing-mode: vertical-rl; transform: rotate(180deg); left: 50%; bottom: 24px; margin-left: -.6em; }
.accordion-item:not(.is-open) .accordion-label em { display: none; }
@media (max-width: 720px) {
  /* Touch: no open/closed state at all. The four tiles are links; every one sits
     at the same height with its caption showing, and a tap follows the link.
     Scroll-driven and tap-to-expand state both fed on the panels' own layout
     shifts (owner ruling 2026-09-18). Desktop hover above 720px is untouched. */
  .accordion { flex-direction: column; height: auto; }
  .accordion-item, .accordion-item.is-open { flex: none; height: clamp(160px, 46vw, 220px); transition: none; }
  .accordion-item:not(.is-open) .accordion-label { writing-mode: horizontal-tb; transform: none; left: 22px; margin-left: 0; }
  .accordion-item:not(.is-open) .accordion-label em { display: inline; }
  .accordion-item .accordion-caption { opacity: .9; transform: none; transition: none; }
}

/* Product carousel — auto-advancing, loops, pauses on hover */
.carousel-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
.carousel-controls { display: flex; gap: 8px; }
.carousel-btn { width: 44px; height: 44px; display: grid; place-items: center; border: 1px solid var(--rule-strong); color: var(--ink); transition: background 250ms var(--ease), color 250ms var(--ease), border-color 250ms var(--ease); }
.carousel-btn:hover, .carousel-btn:focus-visible { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.carousel-btn svg { width: 16px; height: 16px; }
.carousel { overflow: hidden; border-left: 1px solid var(--rule); touch-action: pan-y; }
.carousel .carousel-track {
  display: flex; grid-template-columns: none; border-left: 0; will-change: transform;
  transition: transform 1400ms cubic-bezier(.65,0,.35,1);
}
.carousel .product-card { flex: 0 0 calc(100% / 4); min-width: 0; }
@media (max-width: 1080px) { .carousel .product-card { flex-basis: calc(100% / 3); } }
@media (max-width: 820px)  { .carousel .product-card { flex-basis: calc(100% / 2); } }
@media (max-width: 520px)  { .carousel .product-card { flex-basis: 85%; } }
.carousel.dragging .carousel-track { transition: none; }
.carousel-dots { display: flex; justify-content: center; gap: 8px; margin-top: 20px; }
.carousel-dots span { width: 22px; height: 2px; background: var(--rule-strong); transition: background 300ms var(--ease), width 300ms var(--ease); }
.carousel-dots span.on { background: var(--blue); width: 40px; }

/* WhatsApp button: gentle float + soft ring */
.whatsapp-float { animation: wa-float 3s ease-in-out infinite; }
.whatsapp-float::before { content: ''; position: absolute; inset: 0; border-radius: 50%; border: 2px solid var(--whatsapp); opacity: 0; animation: wa-ring 3s ease-out infinite; }
@keyframes wa-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
@keyframes wa-ring { 0% { transform: scale(1); opacity: .5; } 70%, 100% { transform: scale(1.6); opacity: 0; } }
.whatsapp-float:hover { animation-play-state: paused; }

/* Nav logo: subtle shrink on hover */
.nav-brand img { transition: transform 350ms var(--ease-out-strong); }
.nav-brand:hover img { transform: scale(.96); }

@media (prefers-reduced-motion: reduce) {
  .whatsapp-float, .whatsapp-float::before { animation: none !important; }
  .carousel .carousel-track, .accordion-item, .accordion-caption { transition: none !important; }
}

/* ============================================================
   Inner pages (2026-09-15): about, products, contact
   ============================================================ */

/* Page hero: title left, lead right, both bottom-aligned */
.page-hero { padding: clamp(28px, 3.6vw, 56px) 0 clamp(36px, 4.4vw, 64px); }
.page-hero .eyebrow { margin-bottom: clamp(20px, 3vw, 32px); }
.page-hero-grid { grid-template-columns: 1.15fr 1fr; align-items: start; }
.page-hero h1 {
  /* typography supplied by its role class */
}
.page-hero-lead { color: var(--ink-soft); max-width: 52ch; }

/* Split: image + text, equal height */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(28px, 5vw, 80px); align-items: stretch; }
.split-media { position: relative; overflow: hidden; min-height: 420px; }
.split-media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: contrast(1.04) saturate(.85); }
.split-text { display: flex; flex-direction: column; justify-content: center; gap: 16px; }
.split-text p { color: var(--ink-soft); }
.split-text .split-lead { color: var(--ink); }
.split-lead em { color: var(--blue); font-style: italic; }
.split-text .btn { align-self: flex-start; margin-top: 8px; }
@media (max-width: 900px) { .split { grid-template-columns: 1fr; } .split-media { min-height: 0; aspect-ratio: 16 / 10; } }

/* Services list */
.services { display: grid; grid-template-columns: 1fr 1.4fr; gap: clamp(28px, 5vw, 80px); align-items: start; }
.services-intro p { color: var(--ink-soft); margin-bottom: 24px; max-width: 44ch; }
.services-list { list-style: none; display: grid; grid-template-columns: 1fr 1fr; border-top: 1px solid var(--rule); border-left: 1px solid var(--rule); }
.services-list li {
  padding: 20px 20px 24px; border-right: 1px solid var(--rule); border-bottom: 1px solid var(--rule); transition: background 300ms var(--ease);
}
.services-list li:hover { background: var(--paper-deep); }
.services-list li span { display: block; color: var(--blue); margin-bottom: 12px; }
.services-list li small { display: block; color: var(--ink-fade); margin-top: 4px; }
@media (max-width: 900px) { .services { grid-template-columns: 1fr; } }
@media (max-width: 480px) { .services-list { grid-template-columns: 1fr; } }

/* Products page: three-column product grid */
.product-grid-3 { grid-template-columns: repeat(3, 1fr); }
@media (max-width: 900px) { .product-grid-3 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .product-grid-3 { grid-template-columns: 1fr; } }
.pvd-intro-plain { margin-top: 0; padding-top: 0; border-top: 0; }

/* Applications */


/* Contact cards */
.contact-cards { display: grid; grid-template-columns: repeat(4, 1fr); border-top: 1px solid var(--rule); border-left: 1px solid var(--rule); }
@media (max-width: 1080px) { .contact-cards { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .contact-cards { grid-template-columns: 1fr; } }
.contact-card { padding: clamp(24px, 2.6vw, 36px); border-right: 1px solid var(--rule); border-bottom: 1px solid var(--rule); transition: background 300ms var(--ease); }
.contact-card:hover { background: var(--paper-deep); }
.contact-card-icon { width: 36px; height: 36px; fill: none; stroke: var(--blue); stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; margin-bottom: 20px; transition: transform 400ms var(--ease-out-strong); transform-origin: left center; }
.contact-card:hover .contact-card-icon { transform: scale(1.15); }
.contact-card h3 { color: var(--ink-fade); margin-bottom: 12px; }
.contact-card ul { list-style: none; }
.contact-card li { margin-bottom: 4px; }
.contact-card a, .contact-card p { color: var(--ink); }
.contact-card a { overflow-wrap: anywhere; border-bottom: 1px solid transparent; transition: color 200ms var(--ease), border-color 200ms var(--ease); }
.contact-card a:hover { color: var(--blue); border-bottom-color: var(--blue); }
.contact-card .contact-card-note { color: var(--ink-fade); margin-top: 12px; }

/* Enquiry */
.enquiry { display: grid; grid-template-columns: 1fr 1.6fr; gap: clamp(28px, 5vw, 80px); align-items: start; }
@media (max-width: 900px) { .enquiry { grid-template-columns: 1fr; } }
.enquiry-side p { color: var(--ink-soft); margin-bottom: 20px; max-width: 42ch; }
.enquiry-points { list-style: none; margin-bottom: 32px; border-top: 1px solid var(--rule); }
.enquiry-points li { padding: 12px 0 12px 20px; border-bottom: 1px solid var(--rule); position: relative; }
.enquiry-points li::before { content: ''; position: absolute; left: 0; top: 50%; width: 10px; height: 1px; background: var(--blue); }
.enquiry-form { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 20px; background: var(--white); border: 1px solid var(--rule); padding: clamp(22px, 3vw, 40px); box-shadow: var(--shadow-raised); }
@media (max-width: 560px) { .enquiry-form { grid-template-columns: 1fr; } }
.field { display: flex; flex-direction: column; gap: 8px; }
.field-full { grid-column: 1 / -1; }
.field label { color: var(--ink-fade); }
.field input, .field select, .field textarea { color: var(--ink); background: var(--paper); border: 1px solid var(--rule-strong);
  padding: 12px 12px; border-radius: 0; transition: border-color 200ms var(--ease), box-shadow 200ms var(--ease), background 200ms var(--ease);
}
.field textarea { resize: vertical; min-height: 120px; }
.field input:focus, .field select:focus, .field textarea:focus { outline: none; border-color: var(--blue); background: var(--white); box-shadow: var(--ring); }
.enquiry-actions { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 4px; }
.enquiry-actions .btn { cursor: pointer; }
.enquiry-status { color: var(--blue); }

/* Section number column wide enough to keep labels on one or two lines */
.section-header { grid-template-columns: 180px 1fr; }
@media (max-width: 640px) { .section-header { grid-template-columns: 1fr; gap: 8px; } }
@media (max-width: 820px) {
  .page-hero-grid { grid-template-columns: 1fr; gap: 20px; }
  .page-hero-lead { max-width: none; }
}
.nav-cta { white-space: nowrap; }

/* ============================================================
   Rule draw for every divider line (2026-09-15)
   Same look as the section-header rule: navy → brand blue,
   drawn left to right with a glowing tip, 1600ms.
   ============================================================ */
.stats, .pvd-intro, .page-hero, .footer, .footer-bottom, .industries-list li, .nav { position: relative; }
header { position: sticky; }
.rule-draw {
  position: absolute; left: 0; right: 0; height: 2px; pointer-events: none; z-index: 3;
  background: linear-gradient(90deg, var(--ink) 0%, var(--blue) 55%, rgba(12,72,138,.35) 100%);
  transform: scaleX(0); transform-origin: left;
  transition: transform 1600ms cubic-bezier(.65,0,.35,1);
  transition-delay: var(--rule-delay, 200ms);
}
.rule-draw.at-top { top: -1px; }
.rule-draw.at-bottom { bottom: -1px; }
.rule-draw::before {
  content: ''; position: absolute; top: -3px; left: 0; width: 90px; height: 8px; margin-left: -90px;
  background: radial-gradient(ellipse at right center, rgba(31,102,184,.9) 0%, rgba(31,102,184,.35) 35%, rgba(31,102,184,0) 70%);
  filter: blur(1px); opacity: 0;
}
.rule-draw.in { transform: scaleX(1); }
/* the tip rides counter to the parent's scale, so animate it on a sibling timeline */
.rule-draw.in::before { animation: rule-tip-inner 1600ms cubic-bezier(.65,0,.35,1) both; animation-delay: var(--rule-delay, 200ms); }
@keyframes rule-tip-inner {
  0%   { left: 0%;   opacity: 0; }
  10%  { opacity: 1; }
  85%  { opacity: 1; }
  100% { left: 100%; opacity: 0; }
}
/* Lighter, thinner variant for list rows and the footer so they stay quiet */
.rule-draw.rule-soft { height: 1px; background: linear-gradient(90deg, var(--ink-soft) 0%, var(--blue) 60%, rgba(12,72,138,.2) 100%); }
.rule-draw.rule-soft::before { display: none; }

/* TEST — top of the home page: nav underline draws on load */
.rule-draw.rule-nav { transition-duration: 2200ms; }
.rule-draw.rule-nav.in::before { animation-duration: 2200ms; }

@media (prefers-reduced-motion: reduce) {
  .rule-draw { transition: none; transform: scaleX(1); }
  .rule-draw::before { display: none; }
}

/* Home hero alignment (2026-09-15): tighter top gap; text column and photo share the same top and bottom edge */
.hero { padding-top: clamp(28px, 3vw, 44px); }
.hero-grid { align-items: stretch; }
.hero-grid > div:first-child { display: flex; flex-direction: column; justify-content: space-between; }
.hero-grid .hero-h1 { margin-top: 0; }
.hero-headline { margin: 16px 0 20px; }
.hero-subline { margin-bottom: 24px; }
.hero-actions { margin-top: auto; }
.hero-image-wrap { aspect-ratio: auto; }
.hero-image-wrap img { position: absolute; inset: 0; width: 100%; height: 100%; }
@media (max-width: 900px) {
  .hero-image-wrap { aspect-ratio: 4 / 5; min-height: 0; }
}
@media (min-width: 521px) and (max-width: 900px) { .hero-image-wrap { aspect-ratio: 16 / 11; } }

/* Home hero fits the first screen (2026-09-15): nav + hero + stats = one viewport on desktop */
@media (min-width: 901px) {
  .hero {
    height: calc(100svh - var(--nav-h, 75px));
    min-height: 500px; max-height: 1000px;
    padding: clamp(16px, 3vh, 40px) 0 clamp(20px, 3.6vh, 44px);
    display: flex;
  }
  .hero > .container { display: flex; flex-direction: column; flex: 1; width: 100%; min-height: 0; }
  .hero-grid { flex: 1; min-height: 0; grid-template-columns: 1.25fr 1fr; }
  .hero-headline { margin: clamp(6px, 1.2vh, 16px) 0 clamp(14px, 2.6vh, 32px); }
  .hero-subline { font-size: clamp(.9rem, min(1.1vw, 1.9vh), 1.05rem); margin-bottom: clamp(14px, 2.4vh, 28px); max-width: 520px; }
  .hero .btn { padding: clamp(11px, 1.7vh, 16px) clamp(20px, 2vw, 28px); }
  .hero-image-wrap { min-height: 0; height: 100%; }
  .hero-stats { margin-top: clamp(16px, 3vh, 36px); flex: none; }
  .hero-stat { padding: clamp(12px, 2vh, 26px) clamp(16px, 2.4vw, 36px); }
  .hero-stat-num {
  /* typography supplied by its role class */
}
  .hero-stat-label { margin-top: clamp(4px, 1vh, 10px); }
}

/* Footer products column (2026-09-15): same list as the old site's footer */
/* ============================================================
   About: "Inside the operation" gallery (2026-09-15)
   ============================================================ */
.gallery {
  display: grid; gap: clamp(10px, 1.2vw, 18px);
  grid-template-columns: 1.35fr 1fr 0.8fr;
  grid-template-rows: repeat(2, clamp(200px, 21vw, 320px));
  grid-template-areas: "a b b" "a c d";
}
.g-a { grid-area: a; } .g-b { grid-area: b; } .g-c { grid-area: c; } .g-d { grid-area: d; }
.gallery-tile, .gallery-banner { position: relative; margin: 0; overflow: hidden; background: var(--paper-deep); }
.gallery-tile img, .gallery-banner img {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  filter: contrast(1.04) saturate(.82);
  transition: transform 1200ms var(--ease-out-strong), filter 600ms var(--ease);
}
.gallery-tile::after, .gallery-banner::after {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(180deg, rgba(11,36,71,0) 45%, rgba(11,36,71,.72) 100%);
}
.gallery-tile:hover img { transform: scale(1.06); filter: contrast(1.06) saturate(.95); }
.gallery-tile figcaption {
  position: absolute; left: clamp(14px, 1.6vw, 24px); right: 14px; bottom: clamp(12px, 1.4vw, 20px); z-index: 2;
  color: var(--white);
  display: flex; align-items: center; gap: 12px;
}
.gallery-tile figcaption span { display: inline-flex; align-items: center; gap: 8px; opacity: .75; }
.gallery-tile figcaption span::after { content: ''; width: 22px; height: 1px; background: currentColor; }

/* Tiles wipe in one after another when the gallery reveals */
.has-js .gallery .gallery-tile { clip-path: inset(0 0 100% 0); transition: clip-path 1100ms var(--ease-out-strong); }
.has-js .gallery.in .gallery-tile { clip-path: inset(0 0 0 0); }
.has-js .gallery.in .g-b { transition-delay: 120ms; }
.has-js .gallery.in .g-c { transition-delay: 240ms; }
.has-js .gallery.in .g-d { transition-delay: 360ms; }
.has-js .gallery .gallery-tile img { transform: scale(1.15); }
.has-js .gallery.in .gallery-tile img { transform: scale(1); }
.has-js .gallery.in .gallery-tile:hover img { transform: scale(1.06); }

.gallery-banner { margin-top: clamp(10px, 1.2vw, 18px); aspect-ratio: 21 / 8; }
.gallery-banner::after { background: linear-gradient(90deg, rgba(11,36,71,.82) 0%, rgba(11,36,71,.45) 45%, rgba(11,36,71,0) 75%); }
.gallery-banner figcaption {
  position: absolute; z-index: 2; left: clamp(20px, 4vw, 64px); top: 50%; transform: translateY(-50%);
  max-width: min(560px, 60%); color: var(--white); display: flex; flex-direction: column; gap: 16px;
}
.gallery-banner-kicker { opacity: .8; }
.gallery-banner-line {
  /* typography supplied by its role class */
}
.gallery-banner-line em { font-style: italic; color: var(--sky); }
.has-js .gallery-banner img { transform: scale(1.12); transition: transform 2400ms var(--ease-out-strong); }
.has-js .gallery-banner.in img { transform: scale(1); }

@media (max-width: 900px) {
  .gallery { grid-template-columns: 1fr 1fr; grid-template-rows: clamp(220px, 44vw, 360px) clamp(180px, 34vw, 280px) clamp(180px, 34vw, 280px); grid-template-areas: "a a" "b b" "c d"; }
  .gallery-banner { aspect-ratio: 16 / 9; }
  .gallery-banner figcaption { max-width: 80%; }
}
@media (max-width: 520px) {
  .gallery { grid-template-rows: 240px 200px 200px; }
  .gallery-banner { aspect-ratio: 4 / 5; }
  .gallery-banner::after { background: linear-gradient(0deg, rgba(11,36,71,.85) 0%, rgba(11,36,71,.35) 55%, rgba(11,36,71,0) 80%); }
  .gallery-banner figcaption { top: auto; bottom: 22px; transform: none; max-width: none; right: 20px; }
  .gallery-tile figcaption { font-size: .62rem; letter-spacing: .1em; }
}
@media (prefers-reduced-motion: reduce) {
  .has-js .gallery .gallery-tile { clip-path: none; transition: none; }
  .has-js .gallery .gallery-tile img, .has-js .gallery-banner img { transform: none; transition: none; }
}

/* ============================================================
   Mobile nav (2026-09-15): logo never squashes; links move into a menu panel
   ============================================================ */
.nav-brand { flex-shrink: 0; min-width: 0; }
.nav-brand img { max-width: none; flex-shrink: 0; }
.nav-toggle { display: none; }
.nav-panel { display: none; }
@media (max-width: 1080px) {
  .nav-inner { gap: 16px; padding-top: 12px; padding-bottom: 12px; }
  .nav-brand img { height: clamp(34px, 4.6vw, 40px); }
  .nav-links, .nav-cta { display: none; }
  .nav-toggle {
    display: inline-flex; align-items: center; justify-content: center; flex-direction: column; gap: 4px;
    width: 44px; height: 44px; margin-right: -8px; background: none; border: 0; cursor: pointer; color: var(--ink);
  }
  .nav-toggle span { display: block; width: 22px; height: 1.5px; background: currentColor; transition: transform 300ms var(--ease-out-strong), opacity 200ms var(--ease); }
  .nav.nav-open .nav-toggle span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
  .nav.nav-open .nav-toggle span:nth-child(2) { opacity: 0; }
  .nav.nav-open .nav-toggle span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }
  .nav-panel {
    display: block; position: absolute; left: 0; right: 0; top: 100%;
    background: var(--paper);
    border-bottom: 1px solid var(--rule); box-shadow: var(--shadow-raised);
    padding: 8px var(--gutter) 24px;
    opacity: 0; transform: translateY(-8px); pointer-events: none; visibility: hidden;
    transition: opacity 250ms var(--ease), transform 300ms var(--ease-out-strong), visibility 0s 300ms;
  }
  .nav.nav-open .nav-panel { opacity: 1; transform: none; pointer-events: auto; visibility: visible; transition-delay: 0s; }
  .nav-panel ul { list-style: none; margin: 0 0 16px; padding: 0; }
  .nav-panel li a {
    display: flex; justify-content: space-between; align-items: center; padding: 16px 0; border-bottom: 1px solid var(--rule); color: var(--ink);
  }
  .nav-panel li a.active { color: var(--blue); }
  .nav-panel li a::after { content: '→'; font-family: var(--font-body); font-size: 1rem; color: var(--ink-fade); }
  .nav-panel-actions { display: flex; gap: 8px; flex-wrap: wrap; }
  .nav-panel-actions .nav-cta { display: inline-flex; margin: 0; padding: 12px 16px; font-size: .8rem; }
}


/* ============================================================
   GCC coverage map (2026-09-15): replaces the world map
   ============================================================ */
.coverage-intro { display: grid; grid-template-columns: 1fr 1.1fr; gap: clamp(20px, 4vw, 64px); align-items: start; margin-bottom: clamp(24px, 3.4vw, 44px); }
.coverage-intro h3 { margin-bottom: 20px; }
.coverage-intro h3 em { font-style: italic; color: var(--blue); }
.coverage-intro-body p { color: var(--ink-soft); margin-bottom: 12px; }
.coverage-intro-body .coverage-line { color: var(--blue); margin-bottom: 0; }
@media (max-width: 820px) { .coverage-intro { grid-template-columns: 1fr; gap: 8px; } }
.gcc { display: grid; grid-template-columns: 1fr 320px; gap: clamp(20px, 3vw, 44px); align-items: stretch; }
/* max-width caps the aspect-ratio box. Without it the map takes its WIDTH
   from the row height (align-items: stretch on .gcc), so the sidebar beside
   it drives how wide it is -- it rendered 1007px inside an 813px track, and
   scrolled the page sideways once a reader enlarged text. */
.gcc-map { position: relative; aspect-ratio: 4 / 3; max-width: 100%; background: var(--paper); border: 1px solid var(--rule); overflow: hidden; }
.gcc-svg { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
.land { fill: var(--map-1); stroke: rgba(11,36,71,.14); stroke-width: 1; vector-effect: non-scaling-stroke; transition: fill 900ms ease; }
.land-focus { fill: var(--map-2); stroke: rgba(11,36,71,.32); }
.land.lit { fill: var(--map-3); }
.land[data-iso="ARE"] { fill: var(--map-4); stroke: rgba(11,36,71,.5); }
.gcc-route { fill: none; stroke: var(--blue-bright); stroke-linecap: round; }
.gcc-route-glow { fill: none; stroke: var(--blue-bright); stroke-linecap: round; opacity: .12; }
.gcc-head { fill: var(--ink); }
.gcc-spark { fill: var(--white); stroke: var(--blue-bright); vector-effect: non-scaling-stroke; stroke-width: 2.5; }
.gcc-pt { fill: var(--ink); transition: opacity 300ms ease; }
.gcc-pt-ring { fill: none; stroke: var(--blue-bright); vector-effect: non-scaling-stroke; stroke-width: 1.5; opacity: 0; transform-box: fill-box; transform-origin: center; }
.gcc-pt-ring.ping { animation: gcc-ping 1400ms ease-out; }
@keyframes gcc-ping { 0% { opacity: .9; transform: scale(.4); } 100% { opacity: 0; transform: scale(2.6); } }
.gcc-hq-ring { fill: none; stroke: var(--blue-bright); vector-effect: non-scaling-stroke; stroke-width: 1.5; transform-box: fill-box; transform-origin: center; animation: gcc-hq 2200ms ease-out infinite; }
.gcc-hq-ring.late { animation-delay: 1100ms; }
@keyframes gcc-hq { 0% { opacity: .8; transform: scale(.5); } 100% { opacity: 0; transform: scale(3.2); } }
.gcc-label { font-family: var(--font-body); font-weight: 600; fill: var(--ink); paint-order: stroke; stroke: rgba(245,247,250,.95); stroke-linejoin: round; opacity: 0; transition: opacity 500ms ease; }
.gcc-label.hq { font-family: var(--font-mono); letter-spacing: .08em; fill: var(--blue-bright); }
.gcc-label.on { opacity: 1; }
.gcc-uae-tag { font-family: var(--font-mono); font-weight: 600; letter-spacing: .12em; fill: var(--ink); paint-order: stroke; stroke: rgba(245,247,250,.95); opacity: 0; transition: opacity 600ms ease; }
.gcc-uae-tag.on { opacity: .85; }
.gcc-stage { position: absolute; left: 16px; top: 16px; display: inline-flex; align-items: center; gap: 8px; background: rgba(245,247,250,.92); border: 1px solid var(--rule); padding: 8px 12px; color: var(--ink); }
.gcc-stage-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--blue-bright); animation: gcc-dot 1.6s ease-out infinite; }
@keyframes gcc-dot { 0% { box-shadow: 0 0 0 0 rgba(31,102,184,.55); } 100% { box-shadow: 0 0 0 10px rgba(31,102,184,0); } }
.gcc-replay { position: absolute; right: 16px; bottom: 16px; background: var(--ink); color: var(--paper); border: 0; padding: 8px 12px; cursor: pointer; transition: background 200ms ease; }
.gcc-replay:hover { background: var(--blue-bright); }
.gcc-side { display: flex; flex-direction: column; gap: 24px; }
.gcc-group h3 { color: var(--ink-fade); margin-bottom: 8px; display: flex; gap: 8px; }
.gcc-group h3 span { color: var(--blue); }
.gcc-group ul { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--rule); }
.gcc-group li { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--rule); color: var(--ink-fade); transition: color 400ms ease; }
.gcc-group li > span { flex: 1; }
/* No opacity here. At .75 the inherited --ink-fade rendered #828e9f on the
   paper ground: 3.10:1, under the 4.5:1 WCAG AA asks of normal text. At full
   strength it is 5.07:1. The tag still reads as secondary -- it is 10.24px
   uppercase mono against 16px body -- so the size and face carry the
   hierarchy the opacity was doing. (axe-core, 2026-09-19) */
.gcc-group li i { font-style: normal; }
.gcc-group li::after { content: ''; width: 8px; height: 8px; border-radius: 50%; border: 1px solid var(--rule-strong); flex: none; transition: background 400ms ease, border-color 400ms ease; }
.gcc-group li.on { color: var(--ink); }
.gcc-group li.on::after { background: var(--blue-bright); border-color: var(--blue-bright); }
.gcc-note { color: var(--ink-fade); margin-top: auto; }
@media (max-width: 1080px) {
  .gcc { grid-template-columns: 1fr; }
  .gcc-side { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
  .gcc-note { grid-column: 1 / -1; }
}
@media (max-width: 560px) {
  .gcc-map { aspect-ratio: 1 / 1; }
  .gcc-stage { left: 10px; top: 10px; padding: 4px 8px; font-size: .58rem; letter-spacing: .1em; }
  .gcc-replay { top: 10px; right: 10px; bottom: auto; padding: 4px 8px; font-size: .8rem; }
  .gcc-replay-t { display: none; }
  .gcc-side { grid-template-columns: 1fr; }
}

/* ============================================================
   Products: use cases (2026-09-16) — 8 scenes in two mosaics
   ============================================================ */
.usecases { display: flex; flex-direction: column; gap: clamp(40px, 6vw, 88px); }
.usecase { display: grid; grid-template-columns: minmax(220px, 300px) 1fr; gap: clamp(20px, 4vw, 64px); align-items: stretch; }
.usecase-mirror { grid-template-columns: 1fr minmax(220px, 300px); }
.usecase-mirror .usecase-head { order: 2; text-align: right; align-items: flex-end; }
.usecase-head { display: flex; flex-direction: column; justify-content: flex-end; padding-bottom: 4px; border-bottom: 1px solid var(--rule); }
.usecase-num { font-family: var(--font-display); font-weight: 300; font-size: clamp(3.2rem, 6vw, 5.4rem); line-height: .9; color: transparent; -webkit-text-stroke: 1px var(--rule-strong); margin-bottom: auto; }
.usecase-kicker { color: var(--blue); margin: 24px 0 8px; }
.usecase-title { color: var(--ink); margin: 0 0 16px; }
.usecase-title em { font-style: italic; color: var(--blue); }
.usecase-note { color: var(--ink-fade); margin: 0 0 12px; }

.usecase-mosaic {
  display: grid; gap: clamp(8px, 1vw, 14px);
  grid-template-columns: 1.25fr 1fr 1fr;
  grid-template-rows: repeat(2, clamp(170px, 16vw, 250px));
  grid-template-areas: "a b c" "a d d";
}
.usecase-mirror .usecase-mosaic { grid-template-columns: 1fr 1fr 1.25fr; grid-template-areas: "b c a" "d d a"; }
.uc-a { grid-area: a; } .uc-b { grid-area: b; } .uc-c { grid-area: c; } .uc-d { grid-area: d; }
.uc-tile { position: relative; margin: 0; overflow: hidden; background: var(--paper-deep); }
.uc-tile img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: saturate(.9) contrast(1.03); transition: transform 1100ms var(--ease-out-strong), filter 500ms var(--ease); }
.uc-tile::after { content: ''; position: absolute; inset: 0; pointer-events: none; background: linear-gradient(180deg, rgba(11,36,71,0) 55%, rgba(11,36,71,.7) 100%); transition: opacity 500ms var(--ease); }
.uc-tile figcaption {
  position: absolute; z-index: 2; left: 14px; right: 14px; bottom: 12px; color: var(--white);
  display: flex; align-items: center; gap: 8px;
}
.uc-tile figcaption::before { content: ''; width: 18px; height: 1px; background: currentColor; opacity: .8; transition: width 400ms var(--ease-out-strong); }
.uc-tile:hover img { transform: scale(1.06); filter: saturate(1) contrast(1.05); }
.uc-tile:hover figcaption::before { width: 32px; }

/* Scenes wipe in one after another */
.has-js .usecase .uc-tile { clip-path: inset(100% 0 0 0); transition: clip-path 1000ms var(--ease-out-strong); }
.has-js .usecase.in .uc-tile { clip-path: inset(0 0 0 0); }
.has-js .usecase.in .uc-b { transition-delay: 110ms; }
.has-js .usecase.in .uc-c { transition-delay: 220ms; }
.has-js .usecase.in .uc-d { transition-delay: 330ms; }
.has-js .usecase .uc-tile img { transform: scale(1.14); }
.has-js .usecase.in .uc-tile img { transform: scale(1); }
.has-js .usecase.in .uc-tile:hover img { transform: scale(1.06); }

@media (max-width: 900px) {
  .usecase, .usecase-mirror { grid-template-columns: 1fr; }
  .usecase-head, .usecase-mirror .usecase-head { order: 0; text-align: left; align-items: flex-start; border-bottom: 0; padding-bottom: 0; }
  .usecase-num { font-size: 2.6rem; margin-bottom: 0; }
  .usecase-kicker { margin-top: 8px; }
  .usecase-note { display: none; }
  .usecase-mosaic, .usecase-mirror .usecase-mosaic {
    grid-template-columns: 1fr 1fr; grid-template-rows: clamp(220px, 52vw, 380px) clamp(150px, 36vw, 260px) clamp(150px, 36vw, 260px);
    grid-template-areas: "a a" "b c" "d d";
  }
}
@media (prefers-reduced-motion: reduce) {
  .has-js .usecase .uc-tile { clip-path: none; transition: none; }
  .has-js .usecase .uc-tile img { transform: none; transition: none; }
}
@media (max-width: 520px) {
  .uc-tile figcaption { left: 10px; right: 8px; bottom: 9px; font-size: .56rem; letter-spacing: .06em; gap: 4px; white-space: nowrap; }
  .uc-tile figcaption::before { width: 10px; }
}

/* Enquiry form: live sending (2026-09-15) */
.enquiry-honey { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.enquiry-form { position: relative; }
.enquiry-actions .btn[disabled] { opacity: .65; cursor: progress; }
.enquiry-status[data-state="ok"] { color: var(--success); font-weight: 500; }
.enquiry-status[data-state="error"] { color: var(--danger); font-weight: 500; }
.enquiry-fallback { flex-basis: 100%; margin: 4px 0 0; color: var(--ink-soft); }
.enquiry-fallback a { color: var(--blue); border-bottom: 1px solid currentColor; }

/* Enquiry form: field contracts + country dial code (2026-09-15) */
.field .req { color: var(--danger); margin-left: 2px; }
.phone-group { display: flex; gap: 8px; align-items: stretch; }
.phone-group select { flex: 0 0 6.2em; padding-right: 4px; text-overflow: ellipsis; }
.phone-group input { flex: 1 1 auto; min-width: 0; }
.field-error { min-height: 0; margin: 0; color: var(--danger); }
.field-error:empty { display: none; }
.field input.is-invalid, .field textarea.is-invalid { border-color: var(--danger); box-shadow: var(--ring-error); background: var(--white); }
.enquiry-status[data-state="error-inline"] { color: var(--danger); font-weight: 500; }
.enquiry > *, .enquiry-form, .enquiry-form .field, .phone-group select { min-width: 0; }
.phone-group select { max-width: 6.2em; }
@media (max-width: 560px) { .phone-group select { flex-basis: 5.6em; max-width: 5.6em; } }

/* Warehouse location (2026-09-15): office Ajman, warehouse Sharjah */
.footer-warehouse a { color: inherit; border-bottom: 1px solid var(--rule); }
.footer-warehouse a:hover { color: var(--blue); border-bottom-color: var(--blue); }
.contact-card-note strong { color: var(--ink); font-weight: 600; }

/* Footer refinement (2026-09-16): weighted columns, one heading style for every
   heading and sub-heading, one vertical rhythm, labelled social links */
.footer { padding: clamp(48px, 6vw, 84px) 0 26px; }
.footer-grid {
  grid-template-columns: minmax(0, 1.6fr) minmax(0, .8fr) minmax(0, 1fr) minmax(0, 1.3fr) minmax(0, 1.15fr);
  column-gap: clamp(24px, 3vw, 48px);
  row-gap: 32px;
  align-items: start;
  margin-bottom: clamp(36px, 5vw, 56px);
}
.footer-col { min-width: 0; }
.footer-brand-logo { max-width: 230px; margin: -5px 0 16px; }
.footer-tagline { margin-bottom: 12px; }
.footer-note { max-width: 38ch; }
/* Every heading and sub-heading in the footer shares one style and one gap below it */
.footer-warehouse span {
  color: var(--ink-fade);
  margin: 0 0 16px;
  display: block;
}
/* Sub-headings (Follow, Warehouse) sit one consistent step below the block above them */
.footer-col .footer-social-head,
.footer-warehouse { margin-top: 24px; }
.footer-col li { margin-bottom: 8px; }
.footer-col li:last-child { margin-bottom: 0; }
.footer-col a { align-items: center; gap: 8px; }
.footer-col p { color: var(--ink); }
.footer-brand .footer-note { color: var(--ink-soft); }
.footer-social-icon { width: 14px; height: 14px; flex: none; color: var(--ink-fade); transition: color 200ms var(--ease); }
.footer-col a:hover .footer-social-icon { color: var(--blue); }
.footer-bottom { padding-top: 20px; }
@media (max-width: 1080px) {
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .footer-col:first-child { grid-column: 1 / -1; }
}
@media (max-width: 480px) {
  .footer-grid { grid-template-columns: 1fr; row-gap: 32px; }
}


/* ============================================================
   2026-09-18 — tasks 4, 5 and 6
   ============================================================ */

/* TASK 4 — the enquiry form lands with its animated rule tight under the
   sticky header. The visible line is .section-header's TOP BORDER, which sits
   below the section's own padding-top, so the offset is measured from both at
   runtime (see the --form-offset writer in main.js). 41px is the fallback. */
#form { scroll-margin-top: var(--form-offset, 41px); }

/* TASK 5 — WhatsApp icon before each phone number.
   The icon is treated as a GLYPH, not a box — the pattern Iconify, Bootstrap
   Icons and Font Awesome all use: size it in em so it scales with the text,
   then apply the standard -0.125em optical offset. vertical-align:middle is
   wrong here — it aligns to baseline minus half the x-height, so icon-sized
   elements always sit slightly low.
   .footer-col a is display:inline-flex, which IGNORES vertical-align entirely,
   so the anchors in this row are put back to plain inline first. */
li.tel-li a      { display: inline; }
li.tel-li .wa-link { margin-right: 8px; }
li.tel-li .wa-ico  { width: 1em; height: 1em; font-size: inherit;
                     fill: var(--whatsapp); vertical-align: -0.125em; }

/* TASK 6b — balance the tagline: the browser picks a break point that makes the
   two lines near-equal, instead of stretching the word spaces (justify). */
.footer-tagline { text-wrap: balance; }

/* TASK 6 — footer business-hours block */
.footer-note .lbl { display: block;
                    color: var(--ink-fade); margin-bottom: 4px; }
.footer-note .sp  { display: block; margin-top: 12px; }

/* ── Privacy notice page, footer legal link and the WhatsApp disclosure ──────────────
   Added 2026-09-18 with the privacy notice (external-dependency audit, items 2 and 4). */

/* Prose column. The page grid is up to ~1330px wide, which is unreadable for body text,
   so the notice is capped at a normal measure rather than filling the container. */
.legal { max-width: 72ch; }
.legal h2 {
  color: var(--ink);
  margin: 40px 0 12px;
}
.legal h2:first-of-type { margin-top: 8px; }
.legal p, .legal li { color: var(--ink-soft); }
.legal p { margin: 0 0 12px; }
.legal ul { margin: 0 0 16px; padding-left: 20px; }
.legal li { margin-bottom: 8px; }
.legal strong { color: var(--ink); font-weight: 600; }
.legal a { color: var(--blue); border-bottom: 1px solid currentColor; }

/* Footer legal link — inherits the footer-bottom mono type, so it reads as part of the
   existing rule rather than as a new element. */
.footer-legal a { color: var(--ink-fade); transition: color 200ms var(--ease); }
.footer-legal a:hover { color: var(--blue); }

/* Sits under the two form buttons, on its own row (the row is a wrapping flex). */
.enquiry-wa-note {
  flex-basis: 100%;
  margin: 2px 0 0;
  color: var(--ink-fade);
}
.enquiry-wa-note a { color: var(--ink-fade); border-bottom: 1px solid var(--rule); }
.enquiry-wa-note a:hover { color: var(--blue); }
