/* ==========================================================================
   SUPERON — Brand design system
   Per superon-website.md. Loaded after style.css / responsive.css so the
   brand layer wins. Tokens are global; homepage layout is scoped to .sx
   so it cannot collide with the legacy 114KB style.css.
   ========================================================================== */

:root {
    /* Brand palette */
    --sx-saffron:        #FF9933;   /* Deep Saffron  — primary */
    --sx-saffron-molten: #E97400;   /* Molten Saffron — gradient depth, hover */
    --sx-ember:          #B54E00;   /* Ember — accent text on light */
    --sx-ink:            #14161A;   /* Graphite Ink — hero, production, footer */
    --sx-ink-panel:      #1D2026;   /* Panel Ink — secondary dark panels */
    --sx-porcelain:      #FAFAF8;   /* Page background */
    --sx-steel:          #5D636C;   /* Secondary text */
    --sx-muted:          #6B7078;   /* Small mono labels — 4.75:1 on porcelain */
    --sx-hairline:       #E4E2DC;   /* Rules on light */
    --sx-hairline-dark:  #2B2F37;   /* Rules on dark */

    --sx-white: #fff;

    /* Type */
    --sx-display: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
    --sx-mono:    'IBM Plex Mono', ui-monospace, 'SF Mono', Menlo, monospace;

    /* Rhythm */
    --sx-gutter: clamp(20px, 5vw, 72px);
    /* Content column. 1240 matches the live build exactly - the widened
       clamp tried here read as too wide against it and was reverted. */
    --sx-max:    1240px;
    --sx-section-y: 45px;

    /* Shared easing for the sticky header's collapse/expand */
    --sx-stick-t: .34s cubic-bezier(.4, 0, .2, 1);
}

/* style.css already smooth-scrolls anchors; keep their targets clear of the
   fixed header instead of landing underneath it. */
html { scroll-padding-top: 96px; }

/* style.css caps .main-wrapper - which every page's whole body sits inside -
   at 1920px and centres it. On a display wider than that the entire site,
   top strip and header included, became a 1920px column with bare page
   background either side, while the pinned header (position: fixed) escaped
   the wrapper and ran the full viewport - so the header visibly widened the
   moment you scrolled. The brand layout does its own centring: every section
   is full-bleed and its inner wrap is capped at --sx-max, so the wrapper cap
   buys nothing and only breaks the full-bleed bands. */
.main-wrapper { max-width: none; }

/* --------------------------------------------------------------------------
   1. Top strip — every page
   -------------------------------------------------------------------------- */

.sx-topstrip {
    background: var(--sx-saffron);
    color: var(--sx-ink);
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .16em;
    text-transform: uppercase;
    text-align: center;
    padding: 9px var(--sx-gutter);
    line-height: 1.4;
}

/* --------------------------------------------------------------------------
   2. Scoped primitives
   -------------------------------------------------------------------------- */

.sx {
    background: var(--sx-porcelain);
    color: var(--sx-ink);
    font-family: var(--sx-display);
    font-size: 16px;
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
}

.sx *, .sx *::before, .sx *::after { box-sizing: border-box; }

.sx p:last-child { margin-bottom: 0; }

.sx h1, .sx h2, .sx h3, .sx h4 {
    font-family: var(--sx-display);
    font-weight: 800;
    line-height: 1.04;
    letter-spacing: -.025em;
    margin: 0 0 .5em;
    color: inherit;
    /* style.css sets `h1 { text-transform: capitalize }` on the bare element,
       which Title-Cases every heading. Sentence case is the brand voice. */
    text-transform: none;
}

.sx__wrap {
    max-width: var(--sx-max);
    margin: 0 auto;
    padding: 0 var(--sx-gutter);
}

.sx__section { padding: var(--sx-section-y) 0; }

/* Phones come in further still, to 32px. Overriding the token rather than
   .sx__section keeps everything that reads it - the approvals body included -
   in step. The mobile design sets 40px here; 32 is the value asked for. */
@media (max-width: 767px) {
    :root { --sx-section-y: 32px; }
}

.sx__dark {
    background: var(--sx-ink);
    color: var(--sx-white);
}

.sx__panel { background: var(--sx-ink-panel); }

/* Eyebrow / label */
.sx__eyebrow {
    font-family: var(--sx-mono);
    font-size: 14px;
    font-weight: 600;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--sx-ember);
    margin: 0 0 16px;
    display: block;
}

/* A point down on phones. Tracking is .16em, so it comes in with the size
   (2.24px -> 2.08px) and the label keeps the same proportions. */
@media (max-width: 767px) {
    .sx__eyebrow { font-size: 13px; }
}

/* On any dark ground the eyebrow is saffron — ember is only legible on light. */
.sx__dark .sx__eyebrow,
.sx-hero .sx__eyebrow,
.sx-partner .sx__eyebrow { color: var(--sx-saffron); }

/* Section heading */
.sx__h2 { font-size: clamp(32px, 4.4vw, 56px); }

.sx__lede {
    font-size: clamp(17px, 1.6vw, 20px);
    color: var(--sx-steel);
    max-width: 62ch;
}

.sx__dark .sx__lede { color: rgba(255, 255, 255, .72); }

/* Rules */
.sx__rule { height: 1px; background: var(--sx-hairline); border: 0; margin: 0; }
.sx__dark .sx__rule { background: var(--sx-hairline-dark); }

/* Buttons */
.sx__btn {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    font-family: var(--sx-display);
    font-weight: 700;
    font-size: 14px;
    letter-spacing: .01em;
    padding: 14px 26px;
    border: 1px solid transparent;
    text-decoration: none;
    cursor: pointer;
    transition: background .18s ease, color .18s ease, border-color .18s ease;
}

.sx__btn--primary {
    background: var(--sx-saffron);
    color: var(--sx-ink);
}
.sx__btn--primary:hover,
.sx__btn--primary:focus {
    background: var(--sx-white);
    color: var(--sx-ink);
    text-decoration: none;
}

.sx__btn--ghost {
    background: transparent;
    color: var(--sx-white);
    border-color: var(--sx-hairline-dark);
}
.sx__btn--ghost:hover,
.sx__btn--ghost:focus {
    border-color: var(--sx-saffron);
    color: var(--sx-saffron);
    text-decoration: none;
}

.sx__btn--onlight {
    background: var(--sx-ink);
    color: var(--sx-white);
}
.sx__btn--onlight:hover,
.sx__btn--onlight:focus {
    background: var(--sx-ember);
    color: var(--sx-white);
    text-decoration: none;
}

.sx a:focus-visible,
.sx button:focus-visible {
    outline: 2px solid var(--sx-saffron);
    outline-offset: 3px;
}

/* --------------------------------------------------------------------------
   3. Image placeholder — used only where no photograph exists yet
   -------------------------------------------------------------------------- */

.sx-ph {
    position: relative;
    background: repeating-linear-gradient(-45deg, #22262D 0 14px, #1B1E24 14px 28px);
    border: 1px dashed var(--sx-saffron);
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 180px;
    overflow: hidden;
}
.sx-ph__tag {
    font-family: var(--sx-mono);
    font-size: 10.5px;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sx-saffron);
    background: rgba(20, 22, 26, .85);
    border: 1px solid var(--sx-hairline-dark);
    padding: 10px 14px;
    text-align: center;
    line-height: 1.7;
    max-width: 88%;
}
.sx-ph__tag b { color: #fff; font-weight: 600; }

/* Media frames hold either a photo or a placeholder */
.sx-frame { overflow: hidden; background: var(--sx-ink-panel); }
/* max-width matters even with width: 100% — an <img> that fails to load falls
   back to its width/height attributes for intrinsic sizing, and that intrinsic
   width is what a grid or flex track measures the frame against. Without the
   cap, one 404 photo widens the track and overruns the layout. */
.sx-frame img { width: 100%; max-width: 100%; height: 100%; object-fit: cover; display: block; }

/* --------------------------------------------------------------------------
   4. Hero
   -------------------------------------------------------------------------- */

.sx-hero {
    background: var(--sx-ink);
    color: #fff;
    position: relative;
    overflow: hidden;
}
.sx-hero::after {
    content: "";
    position: absolute;
    inset: auto -20% -55% -20%;
    height: 70%;
    background: radial-gradient(60% 100% at 50% 100%,
        rgba(255, 153, 51, .28), rgba(233, 116, 0, .08) 55%, transparent 75%);
    pointer-events: none;
}

.sx-hero__grid {
    display: grid;
    grid-template-columns: 1.15fr .85fr;
    gap: clamp(28px, 4vw, 64px);
    padding-top: clamp(56px, 8vw, 110px);
    padding-bottom: clamp(56px, 8vw, 110px);
    position: relative;
    z-index: 1;
}

.sx-hero__eyebrow { color: var(--sx-saffron); margin: 0; }

.sx-hero__h1 {
    font-size: clamp(38px, 6vw, 76px);
    font-weight: 800;
    letter-spacing: -.03em;
    line-height: 1.02;
    margin: 18px 0 22px;
    max-width: none;
}
.sx-hero__h1 em {
    font-style: normal;
    background: var(--sx-saffron);
    color: var(--sx-ink);
    padding: 0 .16em;
    -webkit-box-decoration-break: clone;
    box-decoration-break: clone;
}

.sx-hero__lede {
    font-size: clamp(16px, 1.6vw, 19px);
    color: #C9CCD2;
    max-width: 52ch;
    margin: 0;
}

.sx-hero__actions {
    display: flex;
    gap: 14px;
    margin-top: 34px;
    flex-wrap: wrap;
}

.sx-hero__media { display: flex; align-items: center; }
.sx-hero__media .sx-ph { width: 100%; min-height: 320px; }

/* The hero art is a cut-out product shot on a transparent ground, so it floats
   directly on the hero ink: no panel fill, and contain (not cover) so the range
   is never cropped, whatever the column ends up measuring. */
.sx-hero__media .sx-frame { width: 100%; background: transparent; overflow: visible; }
.sx-hero__media .sx-frame img { height: auto; object-fit: contain; }

.sx-hero__kickers {
    display: flex;
    gap: 18px;
    flex-wrap: wrap;
    margin-top: 36px;
    padding: 0;
    border: 0;
}
.sx-hero__kickers span {
    font-family: var(--sx-mono);
    font-size: 11px;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: #9AA0A9;
    border-left: 2px solid var(--sx-saffron);
    padding-left: 10px;
    display: inline-block;
}
.sx-hero__kickers span::before { content: none; }

@media (max-width: 900px) {
    .sx-hero__grid { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------------------
   5. Stats band
   -------------------------------------------------------------------------- */

/* White ground, ink numerals, small mono labels — the Availability system from
   section 11. The divider is vertical here: one hairline down the right of each
   card, sitting in the middle of the grid gap rather than on the cell edge, so
   the air either side of it is even. The last card in each row has none, or the
   row would close on a stray rule at the page edge. */

.sx-stats {
    background: none;
    border-bottom: 1px solid var(--sx-hairline);
    /* Symmetric: the band settles at 48px top and bottom on desktop. */
    padding: clamp(30px, 3.6vw, 48px) 0 clamp(32px, 3.8vw, 48px);
}

.sx-stats__grid {
    /* The pseudo-rule below reads this to centre itself in the gap. */
    --sx-stat-gap: clamp(28px, 2.8vw, 44px);

    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: var(--sx-stat-gap);
}

.sx-stat {
    position: relative;
    padding: 0;
    border: 0;
    background: none;
}

.sx-stat::before {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    right: calc(var(--sx-stat-gap) / -2);
    width: 1px;
    background: var(--sx-hairline);
}

/* Six across: only the sixth sits at the rail edge. */
.sx-stat:nth-child(6n)::before,
.sx-stat:last-child::before { content: none; }

.sx-stat__n {
    display: block;
    color: var(--sx-ink);
    font-weight: 800;
    font-size: clamp(24px, 2.4vw, 34px);
    letter-spacing: -.02em;
    line-height: 1.05;
    /* Keeps "5,000" with its "+", and "2,500" with its MT. */
    white-space: nowrap;
    /* Fixed-width digits, so the count-up climbs without the number jittering. */
    font-variant-numeric: tabular-nums;
}

.sx-stat__n sup {
    font-size: .44em;
    color: var(--sx-muted);
    top: -.85em;
    margin-left: .1em;
    letter-spacing: .02em;
}

/* "No.1" has nothing to count to, so it pops in instead. */
.sx-stat__n--pop { transform-origin: left center; }
.sx-js .sx-rv.is-in .sx-stat__n--pop {
    animation: sx-stat-pop .55s cubic-bezier(.2, .9, .25, 1.25) .1s both;
}

@keyframes sx-stat-pop {
    0%   { transform: scale(.62); opacity: 0; }
    62%  { transform: scale(1.07); opacity: 1; }
    100% { transform: scale(1); opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
    .sx-js .sx-rv.is-in .sx-stat__n--pop { animation: none; }
}

/* Tracking is .1em rather than the .12em used on the wider Availability
   figures: these columns are a sixth of the rail, and the extra letter-space
   was pushing the long labels onto a fourth line. */
.sx-stat__l {
    display: block;
    margin-top: 10px;
    font-family: var(--sx-mono);
    font-size: 10.5px;
    font-weight: 400;
    letter-spacing: .1em;
    line-height: 1.6;
    text-transform: uppercase;
    color: var(--sx-muted);
}

/* Three across: the rule now falls after every third card, and the sixth needs
   its rule back because it is no longer at the end of a row. */
@media (max-width: 1000px) {
    .sx-stats__grid {
        --sx-stat-gap: clamp(24px, 2.8vw, 34px);
        grid-template-columns: repeat(3, 1fr);
        row-gap: clamp(28px, 3.4vw, 38px);
    }
    .sx-stat:nth-child(6n)::before { content: ""; }
    .sx-stat:nth-child(3n)::before,
    .sx-stat:last-child::before { content: none; }
}

/* Two across. */
@media (max-width: 560px) {
    .sx-stats__grid {
        --sx-stat-gap: 20px;
        grid-template-columns: repeat(2, 1fr);
        row-gap: 26px;
    }
    .sx-stat:nth-child(3n)::before,
    .sx-stat:nth-child(6n)::before { content: ""; }
    .sx-stat:nth-child(2n)::before,
    .sx-stat:last-child::before { content: none; }
}

/* The homepage drops the band on phones. Six figures stacked two-across put a
   long numeric preamble between the hero and the story, and the same numbers
   are carried on the About page, which keeps its band at every width — hence
   the --home modifier rather than hiding .sx-stats outright. */
@media (max-width: 767px) {
    .sx-stats--home { display: none; }
}

/* --------------------------------------------------------------------------
   6. Section scaffolding
   -------------------------------------------------------------------------- */

.sx__head { max-width: 760px; margin-bottom: clamp(36px, 5vw, 52px); }

/* 22px is what the mobile design leaves between a section's heading block
   and its grid, against the 36px floor above. Worth moving with the section
   padding: halving the outer air only to keep 36px inside the section makes
   the heading read as detached from what it introduces. */
@media (max-width: 767px) {
    .sx__head { margin-bottom: 22px; }
}
.sx__head .sx__h2 { margin-top: 16px; }
/* :not(.sx__eyebrow) matters more than it looks. This rule is for the intro
   paragraph, but the eyebrow is a <p> in the same block, and at 0,1,1 this
   out-specified .sx__eyebrow at 0,1,0 - so every eyebrow inside a .sx__head
   was rendering at intro size (17px), in steel rather than ember, and with
   the intro's margin-top instead of its own. Excluding it here fixes that
   for every section head on every page at once; .sx-avail used to carry a
   local workaround for the same collision. */
.sx__head p:not(.sx__eyebrow) {
    color: var(--sx-steel);
    font-size: clamp(15px, 1.4vw, 17px);
    margin-top: 18px;
    max-width: 60ch;
}
.sx__dark .sx__head p:not(.sx__eyebrow) { color: #B9BDC5; }

.sx__h2 {
    font-size: clamp(30px, 4vw, 52px);
    font-weight: 800;
    letter-spacing: -.03em;
    line-height: 1.05;
}

/* --------------------------------------------------------------------------
   7. Brand story
   -------------------------------------------------------------------------- */

.sx-brand { border-bottom: 1px solid var(--sx-hairline); }

.sx-brand__grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: clamp(28px, 5vw, 80px);
    align-items: center;
}

.sx-brand__copy .sx__h2 {
    font-size: clamp(30px, 3.8vw, 50px);
    line-height: 1.06;
    margin: 16px 0 20px;
}
.sx-brand__copy p:not(.sx__eyebrow) {
    color: #3B3F46;
    font-size: clamp(15px, 1.4vw, 17px);
    margin-bottom: 16px;
    max-width: none;
}
.sx-brand__copy p b, .sx-brand__copy p strong { color: var(--sx-ink); font-weight: 700; }

.sx-brand__media .sx-frame,
.sx-brand__media.sx-ph { min-height: 380px; }

/* The story slides are square creative with text baked into the artwork, so the
   frame runs 1:1 rather than cropping the wording off the top and bottom. */
.sx-brand__media .sx-carousel { aspect-ratio: 1 / 1; min-height: 0; }

@media (max-width: 900px) {
    .sx-brand__grid { grid-template-columns: 1fr; }
    .sx-brand__media .sx-frame, .sx-brand__media.sx-ph { min-height: 260px; }
    /* Full-width on a phone a 1:1 slide eats the whole screen — cap it. */
    .sx-brand__media .sx-carousel { max-width: 520px; margin-inline: auto; }
}

/* --- Story carousel ------------------------------------------------------- */
/* Slides stack and crossfade. Only .is-active is visible, and it is set in the
   markup, so with JS off slide 1 sits there as a plain framed photo. */
.sx-carousel { position: relative; }
.sx-carousel .sx-carousel__slide {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: 0;
    transition: opacity .9s ease;
}
.sx-carousel .sx-carousel__slide.is-active { opacity: 1; }
/* First slide keeps the flow so the frame still has a height before JS runs. */
.sx-carousel .sx-carousel__slide:first-child { position: relative; }

.sx-carousel__dots {
    position: absolute;
    left: 0; right: 0; bottom: 14px;
    display: flex;
    justify-content: center;
    gap: 8px;
    z-index: 2;
}
.sx-carousel__dot {
    width: 8px;
    height: 8px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: rgba(255, 255, 255, .45);
    cursor: pointer;
    transition: background .25s ease, width .25s ease;
}
.sx-carousel__dot:hover { background: rgba(255, 255, 255, .75); }
.sx-carousel__dot.is-active { width: 22px; border-radius: 4px; background: var(--sx-saffron); }
.sx-carousel__dot:focus-visible { outline: 2px solid var(--sx-saffron); outline-offset: 3px; }

@media (prefers-reduced-motion: reduce) {
    .sx-carousel .sx-carousel__slide { transition: none; }
}

/* --------------------------------------------------------------------------
   8. Production — 2,500 MT + Kashmir/Kanyakumari weld seam
   -------------------------------------------------------------------------- */

.sx-prod__big {
    font-weight: 900;
    font-size: clamp(64px, 11vw, 168px);
    letter-spacing: -.04em;
    line-height: .95;
    color: #fff;
    margin: 0;
    font-variant-numeric: tabular-nums;
}
.sx-prod__big span { color: var(--sx-saffron); }
/* The unit is saffron, but the counting digits inside it are not — the rule
   above catches any child span, so the counter has to opt back out. */
.sx-prod__big .sx-count { color: inherit; }

.sx-prod__copy {
    max-width: 64ch;
    color: #C9CCD2;
    font-size: clamp(15px, 1.5vw, 18px);
    margin-top: 22px;
}
.sx-prod__copy b, .sx-prod__copy strong { color: #fff; font-weight: 700; }

.sx-seam { margin-top: clamp(44px, 6vw, 72px); }

.sx-seam__ends {
    display: flex;
    justify-content: space-between;
    font-family: var(--sx-mono);
    font-size: 11px;
    letter-spacing: .18em;
    text-transform: uppercase;
    color: #9AA0A9;
    margin-bottom: 12px;
}

.sx-seam__track { position: relative; display: flex; gap: 6px; }
.sx-seam__seg {
    flex: 1;
    height: 8px;
    background: linear-gradient(90deg, var(--sx-saffron-molten), var(--sx-saffron) 55%, #FFC36B);
    box-shadow: 0 0 18px rgba(255, 153, 51, .55);
    border-radius: 99px;
}
.sx-seam__seg::after { content: none; }

.sx-seam__badge { margin-top: 16px; text-align: center; }
.sx-seam__badge span {
    display: inline-block;
    font-family: var(--sx-mono);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--sx-ink);
    background: var(--sx-saffron);
    padding: 9px 16px;
}

/* --- The seam lays itself down -------------------------------------------
   Six segments fill left to right in sequence, an arc glow rides the weld
   front, and Kanyakumari plus the badge land as it arrives. Everything is
   scoped to .sx-js so the seam is simply complete when JS is off, and the
   whole thing is switched off under reduced motion further down. */

.sx-js .sx-seam .sx-seam__seg {
    transform: scaleX(0);
    transform-origin: left center;
}
.sx-js .sx-seam.is-in .sx-seam__seg {
    animation: sx-seam-lay .45s cubic-bezier(.35, 0, .25, 1) both;
}
.sx-js .sx-seam.is-in .sx-seam__seg:nth-child(1) { animation-delay: .35s; }
.sx-js .sx-seam.is-in .sx-seam__seg:nth-child(2) { animation-delay: .63s; }
.sx-js .sx-seam.is-in .sx-seam__seg:nth-child(3) { animation-delay: .91s; }
.sx-js .sx-seam.is-in .sx-seam__seg:nth-child(4) { animation-delay: 1.19s; }
.sx-js .sx-seam.is-in .sx-seam__seg:nth-child(5) { animation-delay: 1.47s; }
.sx-js .sx-seam.is-in .sx-seam__seg:nth-child(6) { animation-delay: 1.75s; }

@keyframes sx-seam-lay {
    from { transform: scaleX(0); }
    to   { transform: scaleX(1); }
}

/* The arc itself — a hot spot tracking the leading edge of the bead. */
.sx-seam__track::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 0;
    width: 30px;
    height: 30px;
    margin: -15px 0 0 -15px;
    border-radius: 50%;
    background: radial-gradient(circle, #FFF6E8 0%, #FFC36B 35%,
                                rgba(255, 153, 51, .5) 55%, rgba(255, 153, 51, 0) 72%);
    opacity: 0;
    pointer-events: none;
}
.sx-js .sx-seam.is-in .sx-seam__track::after {
    animation: sx-seam-arc 1.9s linear .35s both;
}

@keyframes sx-seam-arc {
    0%   { left: 0;    opacity: 0; transform: scale(.5); }
    6%   { opacity: 1; transform: scale(1); }
    50%  { transform: scale(1.15); }
    88%  { opacity: 1; transform: scale(1); }
    100% { left: 100%; opacity: 0; transform: scale(.5); }
}

/* Kashmir is already there; Kanyakumari lights up when the bead reaches it. */
.sx-js .sx-seam .sx-seam__ends span:last-child { opacity: 0; }
.sx-js .sx-seam.is-in .sx-seam__ends span:last-child {
    animation: sx-seam-arrive .45s ease-out 2.15s both;
}
.sx-js .sx-seam .sx-seam__badge span { opacity: 0; }
.sx-js .sx-seam.is-in .sx-seam__badge span {
    animation: sx-seam-arrive .45s cubic-bezier(.2, .9, .25, 1.25) 2.3s both;
}

@keyframes sx-seam-arrive {
    from { opacity: 0; transform: translateY(6px) scale(.94); }
    to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
    .sx-js .sx-seam .sx-seam__seg,
    .sx-js .sx-seam.is-in .sx-seam__seg { transform: none; animation: none; }
    .sx-js .sx-seam.is-in .sx-seam__track::after { animation: none; opacity: 0; }
    .sx-js .sx-seam .sx-seam__ends span:last-child,
    .sx-js .sx-seam .sx-seam__badge span { opacity: 1; animation: none; }
}

.sx-prod__specs {
    display: flex;
    gap: 34px;
    flex-wrap: wrap;
    margin-top: clamp(36px, 5vw, 56px);
    border-top: 1px solid var(--sx-hairline-dark);
    padding-top: 26px;
    background: none;
}
.sx-prod__spec { min-width: 160px; background: none; padding: 0; }
.sx-prod__spec b {
    font-weight: 800;
    font-size: 22px;
    color: #fff;
    display: block;
    letter-spacing: normal;
    margin: 0;
    font-variant-numeric: tabular-nums;
}
/* Direct-child combinator, not just `.sx-prod__spec span` — the label's
   ".sx-count" counter is also a <span>, nested one level deeper inside the
   <b>, and the descendant selector was matching it too: the counted number
   was rendering at this rule's 10.5px instead of the label's 22px. */
.sx-prod__spec > span {
    font-family: var(--sx-mono);
    font-size: 10.5px;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: #9AA0A9;
    margin-top: 4px;
    display: block;
}

/* Phone: the 2-then-1 wrapped card layout above becomes full-width rows,
   each with its own hairline and the label/value pair set side by side
   rather than stacked (Node XHDva). */
@media (max-width: 560px) {
    .sx-prod__specs { flex-direction: column; flex-wrap: nowrap; gap: 0; }
    .sx-prod__spec {
        min-width: 0;
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 12px;
        padding: 13px 0;
        border-bottom: 1px solid #FFFFFF1F;
    }
    .sx-prod__spec:last-child { border-bottom: 0; }
    .sx-prod__spec b { font-size: 21px; }
    .sx-prod__spec span { margin-top: 0; text-align: right; white-space: nowrap; }
}

/* Dropped on phones on the homepage, the same way the stats band is. The About
   page carries this section too and keeps it at every width, so the hide hangs
   off the --home modifier rather than .sx-prod itself. */
@media (max-width: 767px) {
    .sx-prod--home { display: none; }
}

/* --------------------------------------------------------------------------
   9. The range — product cards
   -------------------------------------------------------------------------- */

/* `minmax(0, 1fr)` rather than `1fr`, which is `minmax(auto, 1fr)` — the auto
   floor is the track's min-content width, so one card holding something that
   refuses to shrink (a broken <img>, which falls back to its width attribute)
   pushes every track wide and the whole grid overruns .sx__wrap to the right,
   with no gutter on that side. The explicit 0 floor lets the tracks shrink and
   keeps the grid inside its wrap whatever a card ends up containing. */
.sx-range__grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1px;
    background: var(--sx-hairline);
    border: 1px solid var(--sx-hairline);
}

/* A column, so the "View ..." link can be pinned to the bottom. The cards are
   grid items and stretch to the tallest in their row, but the descriptions run
   to different lengths - three lines for electrodes, four for brazing - so
   without this the links sit at different heights across a row. */
.sx-card {
    background: var(--sx-porcelain);
    padding: 30px 26px 34px;
    position: relative;
    display: flex;
    flex-direction: column;
    color: inherit;
    text-decoration: none;
    min-width: 0;   /* same reason: a grid item's auto min-width is min-content */
}
.sx-card:hover { background: #fff; text-decoration: none; color: inherit; }

.sx-card__code {
    font-family: var(--sx-mono);
    font-size: 10.5px;
    letter-spacing: .14em;
    color: var(--sx-steel);
    text-transform: uppercase;
    margin: 0;
}

.sx-card__title {
    font-size: 21px;
    font-weight: 800;
    letter-spacing: -.015em;
    margin: 12px 0 10px;
}

/* flex: none so the photo box can never be compressed by the column - the
   img inside is a hard 150px and would overflow its clip if it were.
   Deliberately NOT positioned: .sx-card__tag anchors to .sx-card instead, so
   the tag sits in the card's top-right corner level with the code line. The
   phone block below makes this the anchor, where the tag rides the photo. */
.sx-card__media { min-height: 150px; margin: 18px 0; aspect-ratio: auto; flex: none; }
.sx-card__media img { height: 150px; }

/* Product shots that are taller than the 150px box get letterboxed rather
   than cropped. The white ground matches the shot's own background, so the
   padding reads as part of the photo. */
.sx-card__media--contain { background: #fff; }
.sx-card__media--contain img { object-fit: contain; }

/* A sector card standing in with the menu artwork rather than a photograph.
   Cropping a drawing to a 2.5:1 box cuts the tops off the chimneys, so it is
   letterboxed instead, on the same ground the SVG paints -- which makes the
   bars read as part of the picture. Swap the module's `card_image` to a real
   photo and this modifier comes off with it. */
.sx-card__media--art { background: #23262C; }
.sx-card__media--art img { object-fit: contain; }

.sx-card__text { font-size: 14.5px; color: var(--sx-steel); margin: 0; }

.sx-card__tag {
    position: absolute;
    top: 18px;
    right: 18px;
    left: auto;
    font-family: var(--sx-mono);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .12em;
    padding: 5px 9px;
    background: var(--sx-ink);
    color: var(--sx-saffron);
    z-index: 2;
}
.sx-card__tag--new { background: var(--sx-saffron); color: var(--sx-ink); }

.sx-card__link {
    display: inline-block;
    /* auto eats the leftover column space, dropping the link to the bottom of
       the card; padding keeps its distance from the text when there is none
       spare. align-self stops it stretching the full card width. */
    margin-top: auto;
    padding-top: 14px;
    align-self: flex-start;
    font-weight: 700;
    font-size: 13.5px;
    color: var(--sx-ember);
}
.sx-card:hover .sx-card__link { color: var(--sx-ink); }

@media (max-width: 1000px) { .sx-range__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Phone: stays 2 across rather than collapsing to 1, built to Node n9bJ4X of the
   mobile design (captured at a 409.6px viewport, so its numbers are real px).

   The card stops being a cell in a hairline grid and becomes a tile. On desktop
   .sx-range__grid draws its dividers by showing a hairline ground through a 1px
   gap; widen that gap to the design's 11px and the same ground reads as an 11px
   grey gutter with a grey ring round the block. The design has none of that -
   the container is #fff and each card carries its own #E4E2DC stroke - so the
   ground and the outer border come off here and the border moves to the card.
   That is the idiom .sx-plant already uses for the plants grid below. */
@media (max-width: 560px) {
    .sx-range__grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 11px;
        background: none;
        border: 0;
    }

    .sx-card {
        padding: 16px 14px 18px;
        background: #fff;
        border: 1px solid var(--sx-hairline);
    }

    /* .7em and .5em of the 16.5px title are the 11.55 and 8.25 the design
       records above and below it. The two-line floor keeps the photos level
       across a row: five titles wrap to two lines at this width and
       "Abrasives" does not, and the design gives all six the same 34.3px. */
    .sx-card__title {
        font-size: 16.5px;
        line-height: 1.04;
        letter-spacing: -.025em;
        margin: .7em 0 .5em;
        min-height: 2.08em;
    }

    .sx-card__media { position: relative; min-height: 86px; margin: 0 0 7px; }
    .sx-card__media img { height: 86px; }
    .sx-card__text { font-size: 12.5px; line-height: 1.45; }

    /* Flush into the photo's top-right. The media box is .sx-frame, which clips
       (overflow: hidden), so the -2px/-5px this used to carry did not lift the
       tag proud of the corner - it just cut those edges off. */
    .sx-card__tag { top: 0; right: 0; font-size: 9px; padding: 4px 8px; }

    .sx-card__link { font-size: 12.5px; }
}

/* --------------------------------------------------------------------------
   10. Manufacturing — four plants
   -------------------------------------------------------------------------- */

.sx-plants {
    background: #F2F1EC;
    border-top: 1px solid var(--sx-hairline);
    border-bottom: 1px solid var(--sx-hairline);
    color: var(--sx-ink);
}
.sx-plants .sx__eyebrow { color: var(--sx-ember); }

/* minmax(0, …) for the same reason as .sx-range__grid above. */
/* On About the lede sits bare in the wrap rather than inside a .sx__head, so
   nothing else supplies the gap down to the grid below. */
.sx-plants .sx__lede { margin-bottom: 1.1em; }

.sx-plants__grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 22px;
    margin-top: 0;
}

.sx-plant {
    min-width: 0;
    background: #fff;
    border: 1px solid var(--sx-hairline);
    position: relative;
    border-radius: 0;
    display: block;
}

.sx-plant__media { min-height: 190px; aspect-ratio: auto; }
.sx-plant__media img { height: 190px; }

.sx-plant__body { padding: 20px 20px 24px; }

.sx-plant__n {
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .18em;
    color: var(--sx-ember);
    margin: 0;
}

.sx-plant__name {
    font-size: 18px;
    font-weight: 800;
    margin: 8px 0 6px;
    letter-spacing: -.01em;
    color: var(--sx-ink);
}

.sx-plant__note { font-size: 13.5px; color: var(--sx-steel); line-height: 1.6; margin: 0; }

.sx-plant__badge {
    position: absolute;
    top: 18px;
    right: 18px;
    z-index: 2;
    font-family: var(--sx-mono);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .12em;
    padding: 5px 9px;
    background: var(--sx-saffron);
    color: var(--sx-ink);
    margin: 0;
    border-radius: 0;
}

@media (max-width: 1000px) { .sx-plants__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Phone: stays a 2x2 grid rather than collapsing to 1 column, matching the
   reference mobile design — with a compact card scale to suit the narrower
   column. */
@media (max-width: 560px) {
    .sx-plants__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 11px; }
    .sx-plant__media { min-height: 104px; }
    .sx-plant__media img { height: 104px; }
    .sx-ph { min-height: 104px; }
    .sx-ph__tag { font-size: 9px; padding: 8px 10px; }
    .sx-plant__body { padding: 14px; }
    .sx-plant__name { font-size: 15px; margin: 9px 0 4px; }
    .sx-plant__note { font-size: 12.5px; line-height: 1.4; }
    .sx-plant__badge { top: 0px; right: auto; font-size: 9px; padding: 4px 8px; }
}

/* --------------------------------------------------------------------------
   11. Availability / reach
   -------------------------------------------------------------------------- */

/* Editorial, not card-based. The old version boxed both columns inside a 1px
   frame with a 1px seam down the middle, which read as a table and fought the
   openness of the rest of the page. Now: a rule under the head, one hairline
   splitting the two columns, and a rule inside each column above its figures.
   Nothing is filled, nothing is framed, the whitespace does the work.

   This section also runs its eyebrows grey rather than the ember used
   elsewhere, so the block stays monochrome and the figures carry the weight. */

/* Ember eyebrows, like every other section on a light ground. This block used
   to run them grey and let the homepage opt back out via .sx-avail--home; both
   instances now want ember, so the base rule carries it and the override is
   gone. The size, weight and margin this used to restate were a workaround for
   the .sx__head p collision, fixed at source in section 6, and the
   max-width/line-height came with it. `.sx-avail__col p` is still 0,1,1, so
   this rule stays at 0,2,0 to hold the colour. */
.sx-avail .sx__eyebrow {
    color: var(--sx-ember);
    max-width: none;
}

.sx-avail .sx__head {
    max-width: 860px;
    margin-bottom: 28px;
    padding-bottom: clamp(28px, 3.4vw, 44px);
    border-bottom: 1px solid var(--sx-hairline);
}

.sx-avail__grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0;
    margin-top: 0;
    background: none;
    border: 0;
}

.sx-avail__col {
    background: none;
    padding: 30px 0 0;
}

/* The single seam between the two columns, with air either side of it. */
.sx-avail__col:first-child { padding-right: clamp(32px, 4vw, 64px); }
.sx-avail__col + .sx-avail__col {
    padding-left: clamp(32px, 4vw, 64px);
    border-left: 1px solid var(--sx-hairline);
}

.sx-avail__h3 {
    font-size: clamp(22px, 2.1vw, 28px);
    font-weight: 700;
    letter-spacing: -.02em;
    line-height: 1.22;
    margin: 0 0 16px;
}

.sx-avail__col > p:not(.sx__eyebrow) {
    color: var(--sx-steel);
    font-size: 16px;
    line-height: 1.75;
    max-width: 46ch;
    margin: 0;
}

.sx-avail__figs {
    display: flex;
    flex-wrap: wrap;
    gap: clamp(32px, 4vw, 56px);
    margin-top: clamp(28px, 3.2vw, 40px);
    padding-top: clamp(22px, 2.6vw, 32px);
    border-top: 1px solid var(--sx-hairline);
}

.sx-avail__fig b {
    display: block;
    margin: 0;
    font-weight: 800;
    font-size: clamp(26px, 2.4vw, 34px);
    letter-spacing: -.02em;
    line-height: 1.05;
    color: var(--sx-ink);
    /* Keeps "5,000" with its "+". */
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

.sx-avail__fig span {
    display: block;
    margin-top: 8px;
    font-family: var(--sx-mono);
    font-size: 10.5px;
    letter-spacing: .12em;
    line-height: 1.5;
    text-transform: uppercase;
    color: var(--sx-muted);
}

/* Stacked, the seam turns from a vertical rule into a horizontal one. */
@media (max-width: 860px) {
    .sx-avail__grid { grid-template-columns: 1fr; }
    .sx-avail__col:first-child { padding-right: 0; }
    .sx-avail__col + .sx-avail__col {
        padding-left: 0;
        border-left: 0;
        border-top: 1px solid var(--sx-hairline);
    }
}

/* Third of the homepage's phone drops, alongside .sx-stats--home and
   .sx-prod--home. About and the dealer-request page use this block too and keep
   it at every width, so again the hide hangs off the --home modifier. */
@media (max-width: 767px) {
    .sx-avail--home { display: none; }
}

/* --------------------------------------------------------------------------
   12. Trust band
   -------------------------------------------------------------------------- */

.sx-trust {
    background: var(--sx-saffron);
    background-image: none;
    color: var(--sx-ink);
    padding-top: clamp(48px, 7vw, 88px);
    padding-bottom: clamp(48px, 7vw, 88px);
    text-align: left;
}

/* The homepage band runs shallower than the About page's: 62px top and bottom
   at desktop, tapering on the same 7vw slope below that. */
.sx-trust--home {
    padding-top: clamp(48px, 7vw, 62px);
    padding-bottom: clamp(48px, 7vw, 62px);
}

.sx-trust__line {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
}
.sx-trust__line h2 {
    font-size: clamp(30px, 5.2vw, 72px);
    font-weight: 900;
    letter-spacing: -.03em;
    line-height: 1;
    margin: 0;
}
.sx-trust__dot {
    width: 12px;
    height: 12px;
    background: var(--sx-ink);
    border-radius: 50%;
    flex: none;
}

.sx-trust__sub {
    font-family: var(--sx-mono);
    font-size: 12px;
    letter-spacing: .16em;
    text-transform: uppercase;
    margin-top: 22px;
    color: var(--sx-ink);
}

@media (max-width: 700px) {
    .sx-trust__line { flex-direction: column; align-items: flex-start; }
    .sx-trust__dot { display: none; }
}

/* The homepage drops the band on phones, as it does the stats, production
   and reach sections. About carries the same band and keeps it at every
   width, so the hide hangs off the --home modifier. Note that this takes
   the 700px rule above out of play on the homepage too - it only has a
   phone range to act on - so if the band is ever unhidden here, check that
   stack still reads before assuming it works. */
@media (max-width: 767px) {
    .sx-trust--home { display: none; }
}

/* --------------------------------------------------------------------------
   13. Leadership
   -------------------------------------------------------------------------- */

.sx-lead__grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 320px));
    gap: 26px;
    margin-top: 8px;
    max-width: none;
}

.sx-leader {
    border: 1px solid var(--sx-hairline);
    background: #fff;
    border-radius: 0;
    padding: 0;
    border-top: 1px solid var(--sx-hairline);
}
.sx-leader__media { min-height: 230px; border: 0; border-bottom: 1px dashed var(--sx-saffron); }
.sx-leader__media img { height: 230px; }
.sx-leader__body { padding: 18px 20px 22px; }
.sx-leader__name { font-size: 18px; font-weight: 800; margin: 0; }
.sx-leader__role {
    font-family: var(--sx-mono);
    font-size: 11px;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--sx-ember);
    margin-top: 6px;
}

/* Leadership: cards on the left, the founding note beside them */
.sx-lead__layout {
    display: grid;
    grid-template-columns: minmax(240px, 300px) 1fr;
    gap: clamp(28px, 5vw, 64px);
    align-items: start;
}

.sx-lead__layout .sx-lead__grid {
    grid-template-columns: 1fr;
    gap: 1px;
    background: var(--sx-hairline);
    border: 1px solid var(--sx-hairline);
    margin-top: 0;
}

.sx-lead__layout .sx-leader {
    border: 0;
    background: #fff;
    position: relative;
}
.sx-lead__layout .sx-leader::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background: var(--sx-saffron);
}
.sx-lead__layout .sx-leader__body { padding: 22px 24px 24px 26px; }

.sx-lead__note { padding-top: 2px; }
.sx-lead__note p {
    color: var(--sx-steel);
    font-size: clamp(15px, 1.4vw, 17px);
    max-width: 62ch;
    margin: 0;
}
.sx-lead__note p + p { margin-top: 18px; }
.sx-lead__note b,
.sx-lead__note strong {
    font-weight: 700;
    color: var(--sx-ink);
}

@media (max-width: 860px) { .sx-lead__layout { grid-template-columns: 1fr; gap: clamp(24px, 4vw, 36px); } }
@media (max-width: 640px) { .sx-lead__grid { grid-template-columns: 1fr; } }

/* --------------------------------------------------------------------------
   14. Partner CTA
   -------------------------------------------------------------------------- */

.sx-partner { background: var(--sx-ink-panel); color: #fff; }

.sx-partner__grid {
    display: grid;
    grid-template-columns: 1.2fr .8fr;
    gap: clamp(28px, 5vw, 70px);
    align-items: center;
}

.sx-partner__h2 {
    font-size: clamp(30px, 4vw, 54px);
    font-weight: 800;
    letter-spacing: -.03em;
    line-height: 1.05;
    margin: 16px 0 18px;
}
.sx-partner p:not(.sx__eyebrow) { color: #C9CCD2; max-width: 52ch; font-size: 16px; }
.sx-partner__media .sx-frame, .sx-partner__media.sx-ph { min-height: 280px; }

@media (max-width: 900px) {
    .sx-partner__grid { grid-template-columns: 1fr; }
    .sx-partner__media { display: block; }
}

/* --------------------------------------------------------------------------
   15. Careers strip
   -------------------------------------------------------------------------- */

.sx-careers {
    border-bottom: 1px solid var(--sx-hairline);
    padding-top: 44px;
    padding-bottom: 44px;
}
.sx-careers__row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 20px;
    flex-wrap: wrap;
}
.sx-careers__row h3 {
    font-size: clamp(20px, 2.2vw, 26px);
    font-weight: 800;
    letter-spacing: -.02em;
    margin: 0;
}
.sx-careers__vals {
    font-family: var(--sx-mono);
    font-size: 11px;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--sx-steel);
    margin-top: 8px;
}

/* --------------------------------------------------------------------------
   16. Contact block (dark)
   -------------------------------------------------------------------------- */

.sx-contact__grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: clamp(32px, 5vw, 72px);
    align-items: start;
}

.sx-contact__label {
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--sx-saffron);
    margin-bottom: 16px;
}

.sx-contact__addr {
    font-size: clamp(19px, 2vw, 24px);
    font-weight: 700;
    letter-spacing: -.02em;
    line-height: 1.4;
    color: #fff;
    margin: 0 0 24px;
}

.sx-contact__links a {
    display: block;
    font-size: 15px;
    color: #C9CCD2;
    text-decoration: none;
    padding: 9px 0;
    border-bottom: 1px solid var(--sx-hairline-dark);
    transition: color .18s ease;
}
.sx-contact__links a:hover { color: var(--sx-saffron); text-decoration: none; }

@media (max-width: 860px) { .sx-contact__grid { grid-template-columns: 1fr; } }

/* --------------------------------------------------------------------------
   17. Scroll reveal
   The hidden state is applied only when JS is present (.sx-js), so the page
   is never left invisible if the script fails to run.
   -------------------------------------------------------------------------- */

.sx-js .sx-rv {
    opacity: 0;
    transform: translateY(18px);
    transition: opacity .7s ease, transform .7s ease;
}
.sx-js .sx-rv.is-in { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
    .sx-js .sx-rv { opacity: 1; transform: none; transition: none; }
    .sx *, .sx *::before, .sx *::after {
        transition-duration: .01ms !important;
        animation-duration: .01ms !important;
    }
    header.sx-header.is-fixed { animation: none; }
    .sx-header__inner,
    .sx-brandmark__logo { transition: none; }
}

/* --------------------------------------------------------------------------
   15. Inner pages — breadcrumbs, page head, form shell
   -------------------------------------------------------------------------- */

.sx-crumbs {
    background: var(--sx-white);
    border-bottom: 1px solid var(--sx-hairline);
    padding: 20px 0 22px;
}

/* breadcrumbs.html emits `.bradcam`, and style.css gives that a
   rgba(0,0,0,.6) background because it was designed to sit over a hero
   image. On a light page that renders as a floating grey slab, so it is
   neutralised here. Its `.container` is also unwrapped to avoid double
   padding inside .sx__wrap. */
.sx-crumbs .bradcam {
    background-color: transparent;
    color: inherit;
    padding: 0;
}
.sx-crumbs .bradcam .container {
    max-width: none;
    width: auto;
    padding: 0;
    margin: 0;
}

.sx-crumbs .bradcam ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 500;
    letter-spacing: .12em;
    text-transform: uppercase;
}

.sx-crumbs .bradcam ul li {
    color: var(--sx-steel);
    padding: 0 18px 0 0;
    margin-right: 4px;
    position: relative;
}
.sx-crumbs .bradcam ul li:first-of-type { padding-left: 0; }

/* chevron separator, in hairline rather than white */
.sx-crumbs .bradcam ul li::after {
    content: '';
    display: block;
    width: 5px;
    height: 5px;
    border: solid #C9C6BE;
    border-width: 1.5px 1.5px 0 0;
    transform: rotate(45deg);
    position: absolute;
    top: 0; right: 6px; bottom: 0;
    margin: auto;
}
.sx-crumbs .bradcam ul li:last-of-type { padding-right: 0; margin-right: 0; }
.sx-crumbs .bradcam ul li:last-of-type::after { display: none; }

.sx-crumbs .bradcam ul li a { color: var(--sx-steel); text-decoration: none; }
.sx-crumbs .bradcam ul li a:hover { color: var(--sx-ember); text-decoration: none; }
.sx-crumbs .bradcam ul li span { color: var(--sx-ink); }

/* page title that breadcrumbs.html renders beneath the trail */
.sx-crumbs .product-name {
    font-family: var(--sx-display);
    font-size: clamp(26px, 3.4vw, 40px);
    font-weight: 800;
    letter-spacing: -.03em;
    line-height: 1.1;
    color: var(--sx-ink);
    text-transform: none;
    margin: 14px 0 0;
    padding: 0;
}

.sx-pagehead__h1 {
    font-size: clamp(34px, 5.2vw, 64px);
    font-weight: 900;
    letter-spacing: -.03em;
    max-width: 21ch;
    margin-bottom: 22px;
}

/* Form shell — wraps the existing form markup without altering the fields,
   so CSRF / captcha / CRM wiring is untouched. */
.sx-formcard {
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-top: 3px solid var(--sx-saffron);
    border-radius: 2px;
    padding: clamp(26px, 4vw, 44px);
}

.sx-formcard .form-control,
.sx-formcard input[type="text"],
.sx-formcard input[type="email"],
.sx-formcard input[type="tel"],
.sx-formcard select,
.sx-formcard textarea {
    font-family: var(--sx-display);
    border-radius: 2px;
    border: 1px solid var(--sx-hairline);
}

.sx-formcard .btn,
.sx-formcard button[type="submit"],
.sx-formcard input[type="submit"] {
    font-family: var(--sx-display);
    font-weight: 700;
    letter-spacing: .01em;
    border-radius: 2px;
}

/* --------------------------------------------------------------------------
   16. Site header
   Self-contained: the markup uses only .sx-* classes, so none of the legacy
   .navigation / .nav / .navbar-mobile rules in style.css + responsive.css
   apply. The resets below neutralise the bare `header {}` rules in style.css.
   -------------------------------------------------------------------------- */

header.sx-header {
    background: var(--sx-porcelain);
    border-bottom: 1px solid var(--sx-hairline);
    position: relative;
    z-index: 60;
    /* reset legacy `header {}` */
    padding: 0;
    margin: 0;
    height: auto;
    min-height: 0;
    top: auto;
    left: auto;
    right: auto;
    width: auto;
    box-shadow: none;
    background-image: none;
    transition: background var(--sx-stick-t), box-shadow var(--sx-stick-t);
}

/* Sticky-on-scroll. `position: fixed` rather than `sticky` because
   style.css sets `overflow-x: hidden` on body, which kills sticky.
   The script inserts .sx-header__spacer so the page doesn't jump.

   No slide-in animation: the header pins at the exact moment its own top
   reaches the viewport top, so it is already in place — animating it would
   make it visibly jump. Only the size eases. */
header.sx-header.is-fixed {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    width: 100%;
    background: var(--sx-white);
    box-shadow: 0 6px 24px rgba(20, 22, 26, .09);
}

/* Applied for one frame when a page loads already scrolled down, so the
   header starts collapsed instead of animating into it. */
header.sx-header.is-instant,
header.sx-header.is-instant * { transition: none !important; }

/* Dropdowns hang off a fixed header, so they can't be scrolled into view
   by the page — cap them to the viewport and scroll internally instead. */
.sx-header.is-fixed .sx-mega,
.sx-header.is-fixed .sx-nav.is-open {
    max-height: calc(100vh - 100%);
    overflow-y: auto;
    overscroll-behavior: contain;
}

header.sx-header *,
header.sx-header *::before,
header.sx-header *::after { box-sizing: border-box; }

header.sx-header ul { list-style: none; margin: 0; padding: 0; }

.sx-header__inner {
    max-width: var(--sx-max);
    margin: 0 auto;
    padding: 18px var(--sx-gutter);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
    transition: padding var(--sx-stick-t);
}

.sx-header.is-fixed .sx-header__inner { padding-top: 9px; padding-bottom: 9px; }
.sx-header.is-fixed a.sx-nav__link { font-size: 15px; }
.sx-header.is-fixed a.sx-nav__cta { font-size: 15px; padding-top: 11px; padding-bottom: 11px; }

/* --- Wordmark --- */

.sx-header .sx-brandmark {
    display: inline-flex;
    align-items: center;
    gap: 14px;
    text-decoration: none;
    flex: none;
}
.sx-header .sx-brandmark:hover { text-decoration: none; }

.sx-brandmark__mark {
    width: 18px;
    height: 18px;
    background: var(--sx-saffron);
    flex: none;
    border-radius: 1px;
}

.sx-brandmark__logo {
    display: block;
    height: 76px;
    width: auto;
    max-width: 100%;
    flex: none;
    transition: height var(--sx-stick-t);
}

.sx-header.is-fixed .sx-brandmark__logo { height: 46px; }

/* Collapsed header: swap the full lockup for the tagline-less wordmark.
   The full mark is 1106x502 with the tagline taking the bottom third, so at
   46px its orange block was only ~34px. The compact mark is all block, so 40px
   here gives a bigger, more legible wordmark in a slightly shorter header - it
   now matches the collapsed CTA's height rather than setting it.
   This must stay below the rule above: both selectors are 0,3,0, so order
   decides which height wins. */
.sx-brandmark__logo--compact { display: none; }
.sx-header.is-fixed .sx-brandmark__logo--full { display: none; }
.sx-header.is-fixed .sx-brandmark__logo--compact { display: block; height: 40px; }

.sx-brandmark__text { display: block; }

.sx-brandmark__name {
    display: block;
    font-family: var(--sx-display);
    font-weight: 900;
    font-size: 30px;
    line-height: 1;
    letter-spacing: -.02em;
    color: var(--sx-ink);
    text-transform: none;
}

.sx-brandmark__sub {
    display: block;
    font-family: var(--sx-mono);
    font-size: 10px;
    font-weight: 500;
    letter-spacing: .17em;
    text-transform: uppercase;
    color: var(--sx-steel);
    margin-top: 7px;
    white-space: nowrap;
}

/* --- Nav (desktop) --- */

.sx-header .sx-nav { display: block; }

.sx-header .sx-nav__list {
    display: flex;
    align-items: center;
    gap: 34px;
}

/* Seven items (Blog included) plus the logo run out of room just above the
   1024px hamburger breakpoint, so tighten the spacing there. */
@media (min-width: 1025px) and (max-width: 1199px) {
    .sx-header .sx-nav__list { gap: 22px; }
}

.sx-header .sx-nav__item {
    display: block;
    margin: 0;
    padding: 0;
    position: relative;
}
.sx-header .sx-nav__item::after,
.sx-header .sx-nav__item::before { content: none; }

.sx-header a.sx-nav__link {
    display: inline-block;
    font-family: var(--sx-display);
    font-size: 16px;
    font-weight: 600;
    line-height: 1.2;
    letter-spacing: -.005em;
    color: var(--sx-ink);
    text-decoration: none;
    text-transform: none;
    padding: 6px 0;
    cursor: pointer;
    white-space: nowrap;
    background: none;
    transition: color .16s ease, font-size var(--sx-stick-t);
}
.sx-header a.sx-nav__link::after,
.sx-header a.sx-nav__link::before { content: none; }

/* `:focus-visible`, not `:focus`. A mouse click on Products focuses the link
   and plain `:focus` kept it ember long after the mega panel had gone - most
   obviously when scrolling closed the panel but left the label lit. Keyboard
   focus still shows, because that is what focus-visible is for. */
.sx-header a.sx-nav__link:hover,
.sx-header a.sx-nav__link:focus-visible { color: var(--sx-ember); text-decoration: none; }

/* Active page — variant B's treatment: the label goes ember and a saffron bar
   sits under it. The rule above sets `content: none` on this pseudo to kill the
   legacy sheet's decorations, so this has to out-specify it (0,3,2 vs 0,2,2).
   `position: relative` goes on the link rather than the li so the bar tracks
   the text width, not the row, once the nav stacks. */
.sx-header a.sx-nav__link.is-active,
.sx-header a.sx-nav__link.is-open {
    position: relative;
    color: var(--sx-ember);
    font-weight: 700;
}
.sx-header a.sx-nav__link.is-active::after,
.sx-header a.sx-nav__link.is-open::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 2px;
    background: var(--sx-saffron);
}

.sx-header a.sx-nav__cta {
    display: inline-flex;
    align-items: center;
    font-family: var(--sx-display);
    font-size: 16px;
    font-weight: 700;
    line-height: 1.2;
    color: var(--sx-white);
    background: var(--sx-ink);
    padding: 15px 26px;
    border-radius: 2px;
    text-decoration: none;
    text-transform: none;
    white-space: nowrap;
    transition: background .16s ease, font-size var(--sx-stick-t), padding var(--sx-stick-t);
}
.sx-header a.sx-nav__cta:hover,
.sx-header a.sx-nav__cta:focus {
    background: var(--sx-ember);
    color: var(--sx-white);
    text-decoration: none;
}

/* --- Burger --- */

.sx-header .sx-burger {
    display: none;
    width: 30px;
    height: 22px;
    position: relative;
    background: none;
    border: 0;
    padding: 0;
    flex: none;
    cursor: pointer;
}
.sx-header .sx-burger span {
    display: block;
    position: absolute;
    left: 0;
    height: 2px;
    width: 100%;
    background: var(--sx-ink);
    border-radius: 2px;
    transition: transform .25s ease, opacity .25s ease, top .25s ease;
}
.sx-header .sx-burger span:nth-child(1) { top: 0; }
.sx-header .sx-burger span:nth-child(2) { top: 10px; }
.sx-header .sx-burger span:nth-child(3) { top: 20px; }
.sx-header .sx-burger.is-open span:nth-child(1) { top: 10px; transform: rotate(45deg); }
.sx-header .sx-burger.is-open span:nth-child(2) { opacity: 0; }
.sx-header .sx-burger.is-open span:nth-child(3) { top: 10px; transform: rotate(-45deg); }

/* --- Mega menu --- */

.sx-mega {
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    background: var(--sx-white);
    border-top: 1px solid var(--sx-hairline);
    border-bottom: 1px solid var(--sx-hairline);
    box-shadow: 0 18px 40px rgba(20, 22, 26, .10);
    padding: 34px 0;
    z-index: 70;
}
.sx-mega[hidden] { display: none; }

/* Two-pane layout: left rail (with search) + right pane of the active one. */
.sx-mega__inner {
    max-width: var(--sx-max);
    margin: 0 auto;
    padding: 0 var(--sx-gutter);
    display: grid;
    grid-template-columns: 312px 1fr;
    min-height: 440px;
}

/* left side: search + rail */
.sx-mega__side { border-right: 1px solid var(--sx-hairline); padding: 4px 26px 0 0; }

.sx-mega__search {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--sx-porcelain);
    border: 1px solid var(--sx-hairline);
    border-radius: 8px;
    padding: 0 14px;
    margin-bottom: 14px;
    color: var(--sx-steel);
}
.sx-mega__search svg { flex: none; }
.sx-mega__search input {
    flex: 1;
    border: 0;
    background: transparent;
    outline: none;
    font-family: var(--sx-display);
    font-size: 14px;
    color: var(--sx-ink);
    padding: 12px 0;
}
.sx-mega__search input::placeholder { color: var(--sx-steel); }
.sx-mega__search:focus-within { border-color: var(--sx-saffron); }

.sx-mega__rail {
    list-style: none;
    margin: 0;
    padding: 0;
    max-height: 60vh;
    overflow-y: auto;
}
.sx-mega__rail li { margin: 0; }

.sx-mega__cat {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    font-family: var(--sx-display);
    font-weight: 500;
    font-size: 15px;
    color: var(--sx-ink);
    text-decoration: none;
    padding: 12px 16px;
    border-radius: 6px;
    cursor: pointer;
    transition: background .14s ease, color .14s ease;
}
.sx-mega__cat .sx-mega__chev { opacity: 0; color: var(--sx-saffron); transition: opacity .14s ease; flex: none; }
.sx-mega__cat:hover { color: var(--sx-ember); text-decoration: none; }
.sx-mega__cat.is-active {
    background: var(--sx-porcelain);
    color: var(--sx-ember);
    font-weight: 600;
}
.sx-mega__cat.is-active .sx-mega__chev { opacity: 1; }

/* right pane */
.sx-mega__main {
    display: flex;
    flex-direction: column;
    padding: 4px 0 0 48px;
}
.sx-mega__panels { flex: 1; position: relative; }

.sx-mega__panel { display: none; }
.sx-mega__panel.is-active { display: block; animation: sx-mega-fade .18s ease; }
@keyframes sx-mega-fade { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

.sx-mega__panel-title {
    display: inline-block;
    font-family: var(--sx-display);
    font-weight: 800;
    font-size: 24px;
    letter-spacing: -.02em;
    color: var(--sx-ink);
    text-decoration: none;
    margin-bottom: 24px;
}
a.sx-mega__panel-title:hover { color: var(--sx-ember); text-decoration: none; }

.sx-mega__links {
    list-style: none;
    margin: 0;
    padding: 0;
    columns: 2;
    column-gap: 48px;
}
.sx-mega__link {
    break-inside: avoid;
    margin: 0 0 6px;
    padding-left: 30px;
    position: relative;
}
/* saffron four-petal marker, matching the reference clover */
.sx-mega__link::before {
    content: "";
    position: absolute;
    left: 0;
    top: 9px;
    width: 15px;
    height: 15px;
    background: no-repeat center/contain
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23FF9933'%3E%3Ccircle cx='8' cy='8' r='4.2'/%3E%3Ccircle cx='16' cy='8' r='4.2'/%3E%3Ccircle cx='8' cy='16' r='4.2'/%3E%3Ccircle cx='16' cy='16' r='4.2'/%3E%3C/svg%3E");
}
.sx-mega__links a {
    display: block;
    font-family: var(--sx-display);
    font-size: 15px;
    color: var(--sx-steel);
    text-decoration: none;
    padding: 4px 0;
    line-height: 1.45;
}
.sx-mega__links a:hover { color: var(--sx-ember); text-decoration: none; }
.sx-mega__empty::before { display: none; }
.sx-mega__empty { padding-left: 0; }
.sx-mega__empty a { color: var(--sx-ember); font-weight: 700; }

.sx-mega__noresults {
    font-family: var(--sx-display);
    font-size: 15px;
    color: var(--sx-steel);
    margin: 4px 0 0;
}

/* help bar */
.sx-mega__help {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 20px;
    flex-wrap: wrap;
    margin-top: 22px;
    padding-top: 20px;
    border-top: 1px solid var(--sx-hairline);
    font-size: 14px;
    color: var(--sx-steel);
}
.sx-mega__help a {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: var(--sx-steel);
    text-decoration: none;
    font-weight: 500;
}
.sx-mega__help a:hover { color: var(--sx-ember); text-decoration: none; }
.sx-mega__help svg { color: var(--sx-saffron); flex: none; }

/* --- Mobile --- */

@media (max-width: 1024px) {
    .sx-header__inner { padding: 14px var(--sx-gutter); }
    .sx-brandmark__name { font-size: 24px; }
    .sx-brandmark__sub { font-size: 9px; letter-spacing: .14em; }
    .sx-brandmark__logo { height: 60px; }
    .sx-header.is-fixed .sx-brandmark__logo { height: 40px; }
    .sx-header.is-fixed .sx-brandmark__logo--compact { height: 34px; }
    .sx-header.is-fixed .sx-header__inner { padding-top: 8px; padding-bottom: 8px; }

    .sx-header .sx-burger { display: block; }

    .sx-header .sx-nav {
        display: none;
        position: absolute;
        top: 100%;
        left: 0;
        right: 0;
        background: var(--sx-white);
        border-bottom: 1px solid var(--sx-hairline);
        box-shadow: 0 18px 40px rgba(20, 22, 26, .10);
        padding: 8px 0;
        z-index: 65;
    }
    /* Capped and scrolled here as well as in the is-fixed rule above, so the
       menu scrolls inside itself whether or not the header has detached yet.
       Without this a long Industries accordion pushed past the viewport and
       the only way to reach the end was to scroll the page behind it.
       `overscroll-behavior: contain` keeps that scroll from chaining out to
       the page once the list hits its end. */
    .sx-header .sx-nav.is-open {
        display: block;
        max-height: calc(100vh - 100%);
        overflow-y: auto;
        overscroll-behavior: contain;
        -webkit-overflow-scrolling: touch;
    }

    .sx-header .sx-nav__list {
        flex-direction: column;
        align-items: stretch;
        gap: 0;
    }

    .sx-header .sx-nav__item { border-bottom: 1px solid var(--sx-hairline); }
    .sx-header .sx-nav__item:last-child { border-bottom: 0; }

    .sx-header a.sx-nav__link { display: block; padding: 15px var(--sx-gutter); }
    .sx-header a.sx-nav__link.is-active::after,
    .sx-header a.sx-nav__link.is-open::after {
        left: var(--sx-gutter);
        right: auto;
        bottom: 10px;
        width: 26px;
    }

    .sx-nav__item--cta { padding: 14px var(--sx-gutter); }
    .sx-header a.sx-nav__cta { width: 100%; justify-content: center; }

    /* Two-pane doesn't apply on mobile (the mega never opens there); stack
       defensively in case it is ever shown. */
    .sx-mega__inner { grid-template-columns: 1fr; min-height: 0; }
    .sx-mega__side { border-right: 0; border-bottom: 1px solid var(--sx-hairline); padding: 8px 0; }
    .sx-mega__rail { max-height: none; }
    .sx-mega__main { padding: 16px 0 0; }
    .sx-mega__panel { display: block; margin-bottom: 20px; }
    .sx-mega__panel--search { display: none; }
    .sx-mega__links { columns: 2; }
    .sx-mega__cat .sx-mega__chev { opacity: 1; }
}

@media (max-width: 560px) {
    .sx-mega__links { columns: 1; }
    .sx-brandmark__name { font-size: 21px; }
    .sx-brandmark__sub { font-size: 8px; letter-spacing: .1em; }
    .sx-brandmark__logo { height: 50px; }
    .sx-header.is-fixed .sx-brandmark__logo { height: 36px; }
}


/* --------------------------------------------------------------------------
   18. Site footer
   Ported from the supplied footer design. Uses the brand tokens rather than
   the mockup's near-identical values so the footer matches the rest of the
   site. Resets included because style.css styles `footer` and `footer li`.
   -------------------------------------------------------------------------- */

/* style.css paints the bare `footer` element with an orange background image
   plus matching top/bottom borders (line ~1538) — `.sx-foot ul` below already
   covers `footer li`, but the element's own background/border were never
   neutralised. Left alone that shows as an orange edge behind the footer,
   which stands out far more now the footer itself is light than it did
   against the old dark theme. */
footer {
    background: none;
    border-top: 0;
    border-bottom: 0;
}

/* Light theme — per the supplied footer mock (Node yQnVh). Every value below
   was sampled off it rather than guessed:
     ground #F7F6F3 · body copy #56534D · section labels #B4540E
     hairline #E2DED7 · legal bar #EDE9E3 · 2px saffron rule across the top
   Ember replaces saffron wherever text sits on this ground, because saffron
   text isn't legible on light — the same rule .sx__eyebrow already follows. */
.sx-foot {
    background: #F7F6F3;
    color: #56534D;
    font-family: var(--sx-display);
    font-size: 15px;
    line-height: 1.55;
    padding: 72px 0 0;
    background-image: none;
    border-top: 2px solid var(--sx-saffron);
}

.sx-foot *, .sx-foot *::before, .sx-foot *::after { box-sizing: border-box; }
.sx-foot ul { list-style: none; margin: 0; padding: 0; }
.sx-foot p  { margin: 0; }

/* The same rail as .sx__wrap, via the same tokens rather than copies of the
   numbers - the footer used to run max-width 1280 / padding 40, which put its
   content 52px left of the header and every section above it at wide viewports.
   Sharing the tokens means the two cannot drift apart again. */
.sx-foot__wrap {
    max-width: var(--sx-max);
    margin: 0 auto;
    padding: 0 var(--sx-gutter);
}

.sx-foot__eyebrow {
    display: block;
    font-family: var(--sx-mono);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: .22em;
    text-transform: uppercase;
    color: #B4540E;
    margin-bottom: 22px;
}

/* --- top grid --- */

.sx-foot__top {
    display: grid;
    grid-template-columns: 1.4fr 1fr 1fr .8fr;
    gap: 56px;
    padding-bottom: 56px;
}

.sx-foot__logo { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
.sx-foot__mark { width: 22px; height: 22px; background: var(--sx-saffron); flex: none; }
.sx-foot__name {
    font-size: 26px;
    font-weight: 800;
    letter-spacing: .02em;
    color: var(--sx-ink);
    text-decoration: none;
    text-transform: none;
}
.sx-foot__name:hover { color: var(--sx-ink); text-decoration: none; }

.sx-foot__sub {
    font-family: var(--sx-mono);
    font-size: 10.5px;
    letter-spacing: .28em;
    text-transform: uppercase;
    color: #56534D;
    margin: 6px 0 24px 34px;
}

.sx-foot__desc { color: #56534D; font-size: 15px; line-height: 1.7; max-width: 38ch; }

.sx-foot__office {
    font-style: normal;
    color: #56534D;
    font-size: 15px;
    line-height: 1.75;
}
.sx-foot__office a {
    color: #56534D;
    text-decoration: none;
    display: block;
    margin-top: 10px;
}
.sx-foot__office a:hover { color: #B4540E; text-decoration: none; }

.sx-foot__plants li,
.sx-foot__menu li {
    margin-bottom: 12px;
    font-size: 15px;
    color: #56534D;
    line-height: 1.55;
    list-style: none;
}
/* The plants list carries full postal addresses, so each entry wraps over
   two or three lines. Flex gives the wrapped lines a hanging indent past the
   pin instead of letting them run back under it, and the extra bottom margin
   keeps one address visually separate from the next. */
.sx-foot__plants li { display: flex; margin-bottom: 16px; }

/* The pin is a marker, not a bullet the text should clear, so it stays a
   fixed 15px and is nudged down to sit on the first line's cap height
   rather than its top edge. */
.sx-foot__pin {
    flex: none;
    width: 15px;
    height: 15px;
    margin-right: 8px;
    margin-top: 3px;
    color: #B4540E;
}

.sx-foot__menu a { color: #56534D; text-decoration: none; transition: color .15s; }
.sx-foot__menu a:hover { color: #B4540E; text-decoration: none; }

/* --- products band --- */

.sx-foot__products {
    border-top: 1px solid #E2DED7;
    padding: 48px 0 40px;
}

.sx-foot__cols {
    columns: 4;
    column-gap: 48px;
}
.sx-foot__cols li {
    break-inside: avoid;
    margin-bottom: 13px;
    font-size: 14.5px;
    line-height: 1.5;
    padding-left: 16px;
    position: relative;
    list-style: none;
    color: #56534D;
}
.sx-foot__cols li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 8px;
    width: 5px;
    height: 5px;
    border: 1px solid var(--sx-saffron);
    border-radius: 50%;
}
.sx-foot__cols a { color: #56534D; text-decoration: none; transition: color .15s; }
.sx-foot__cols a:hover { color: #B4540E; text-decoration: none; }

/* --- bottom bar --- */

.sx-foot__bottom {
    border-top: 1px solid #E2DED7;
    background: #EDE9E3;
}
.sx-foot__bottom .sx-foot__wrap {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 24px;
    padding-top: 22px;
    padding-bottom: 22px;
    font-family: var(--sx-mono);
    font-size: 12.5px;
    letter-spacing: .06em;
    color: #56534D;
    flex-wrap: wrap;
}

/* --- responsive --- */

@media (max-width: 1024px) {
    .sx-foot__top  { grid-template-columns: 1fr 1fr; gap: 44px; }
    .sx-foot__cols { columns: 3; }
}
@media (max-width: 640px) {
    .sx-foot          { padding-top: 36px; }   /* the artboard's value */
    .sx-foot__top  { grid-template-columns: 1fr; gap: 40px; }
    .sx-foot__products { display: none; }
    .sx-foot__bottom .sx-foot__wrap { flex-direction: column; align-items: flex-start; gap: 8px; }

    /* Company links go two-up (Node QPyS8). Once .sx-foot__top collapses to one
       column these are half a dozen short labels stacked one per row, which
       leaves a tall thin list against most of the rail empty to its right.
       column-count rather than a two-track grid: it fills down the first column
       and then the second - the order the design shows - and it rebalances on
       its own if a link is added or dropped, where a grid would need its row
       count kept in step by hand. */
    .sx-foot__menu { columns: 2; column-gap: 12px; }
    .sx-foot__menu li { margin-bottom: 10px; break-inside: avoid; }

    /* The three link blocks stop being cards floating in a 40px gap and become
       ruled bands, which is how the mobile design separates them: a hairline
       across the rail, 18px of air either side of it. The gap goes to 0 because
       that padding is now the rhythm - keeping both would double it. The rule
       is on div + div so the brand block at the top is left open; it takes the
       design's 26px of clearance below the blurb instead. */
    /* padding-bottom too, not just the gap: the last block already closes with
       its own 18px, and the desktop 56px on top of that left a hole above the
       legal bar. */
    .sx-foot__top { gap: 0; padding-bottom: 0; }
    .sx-foot__top > div + div {
        border-top: 1px solid #E2DED7;
        padding: 18px 0;
    }
    .sx-foot__top > div:first-child { padding-bottom: 26px; }

    /* Down from 12px/.22em/#B4540E. At 10px the tracking has to come in with
       it, or three words of mono eat the whole rail. */
    .sx-foot__eyebrow {
        font-size: 10px;
        letter-spacing: .14em;
        color: #C85A10;
        margin-bottom: 9px;
    }
    /* The company block sits 12px off its heading where the other two sit 9px,
       so it makes up the difference here rather than forking the eyebrow. */
    .sx-foot__menu { margin-top: 3px; }

    /* One body size for the whole footer, 13.5px, replacing the 15px desktop
       carries down. */
    .sx-foot__desc,
    .sx-foot__office,
    .sx-foot__plants li,
    .sx-foot__menu li { font-size: 13.5px; }
    .sx-foot__office a { margin-top: 9px; }
}

/* --------------------------------------------------------------------------
   19. Product page banner strip
   -------------------------------------------------------------------------- */

/* style.css sets `.banner-strip { padding: 100px 0 20px }`, a 5:1 split that
   sits the breadcrumb and the page title hard against the bottom of the dark
   band. The 100px was there to clear an older header that overlapped the page;
   the current one inserts a spacer and takes its own space in flow, so there is
   nothing left to clear.

   Even padding centres the content and keeps the band exactly as tall as it was
   - 100 + 20 and 60 + 60 are both 120px of padding. Scoped to .products-wrap,
   which every product template carries, plus the blog listing and blog post
   banners, which opt in with .banner-strip--blog; the contact / search / other
   banners are left alone. */

.products-wrap .banner-strip,
.banner-strip--blog { padding: 60px 0; }

/* responsive.css drops it to `80px 0 20px` under 767px; same total, split evenly. */
@media (max-width: 767px) {
    .products-wrap .banner-strip,
    .banner-strip--blog { padding: 50px 0; }
}

/* --------------------------------------------------------------------------
   20. Enquiry form
   -------------------------------------------------------------------------- */

/* Built to the supplied mock; every value below was sampled or measured off it
   rather than guessed:
     ground #F7F6F3 · field #FFF, 1px #DFDBD3, 6px radius, 55px tall
     placeholder #9A948B · heading ink #1B1A18 · accent + button #E8802A
     18px between rows · 70x3 rule under the heading · button 149x55
   Fields sit straight on the ground - no panel or card around the form.

   Two templates render this form: product pages carry their own copy inside
   .product-form, while productlist, subproduct and
   welding-electrodes-manufacturers include cms/form.html, whose root is
   #form-id and which is not always wrapped in .product-form. Both selectors
   are listed so every page matches.

   Styling only. No markup touched, no field added or removed, so the
   country/state cascade, the hidden captcha and the validation are untouched. */

.product-form,
#form-id {
    background: #F7F6F3;
    padding: clamp(44px, 5.5vw, 72px) 0;
}

/* productlist and subproduct nest #form-id inside .product-form - without this
   the ground would be painted and padded twice. */
.product-form #form-id { background: none; padding: 0; }

/* --- heading ------------------------------------------------------------ */

.product-form .common-heading,
#form-id .common-heading {
    font-family: var(--sx-display);
    font-size: clamp(26px, 3.4vw, 40px);
    font-weight: 800;
    line-height: 1.12;
    letter-spacing: -.02em;
    color: #1B1A18;
    margin-bottom: 0;
}

.product-form .common-heading::after,
#form-id .common-heading::after {
    content: "";
    display: block;
    width: 70px;
    height: 3px;
    margin: 26px auto 0;
    background: #E8802A;
}

.product-form form.commonform,
#form-id form.commonform { margin-top: clamp(30px, 3.6vw, 46px); }

/* --- fields ------------------------------------------------------------- */

.product-form .form-group,
#form-id .form-group { margin-bottom: 18px; }

.product-form .form-group .form-control,
#form-id .form-group .form-control {
    height: 45px;
    padding: 12px 10px;
    font-family: var(--sx-display);
    font-size: 15px;
    /* 45 - 2px borders - 24px padding leaves 19px, so the line box has to be
       pinned or a 15px font at `normal` would push the text off-centre. */
    line-height: 19px;
    font-weight: 400;
    color: #1B1A18;
    background-color: #FFFFFF;
    border: 1px solid #DFDBD3;
    border-radius: 6px;
    box-shadow: none;
    transition: border-color .16s ease, box-shadow .16s ease;
}

.product-form .form-group .form-control::placeholder,
#form-id .form-group .form-control::placeholder {
    color: #9A948B;
    font-weight: 400;
    opacity: 1;
}

/* style.css cancels the focus ring outright - `border: 1px solid #d6d3d3;
   box-shadow: none` on :focus - leaving keyboard users with nothing to follow.
   This puts one back in the mock's accent. */
.product-form .form-group .form-control:focus,
#form-id .form-group .form-control:focus {
    border-color: #E8802A;
    box-shadow: 0 0 0 3px rgba(232, 128, 42, .18);
    outline: none;
}

/* One chevron for all three selects. Country and State sit bare while Product
   is wrapped in .selectdiv, so each was drawing a different native arrow. */
.product-form .form-group select.form-control,
#form-id .form-group select.form-control {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    padding-right: 34px;
    cursor: pointer;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9'%3E%3Cpath d='M1 1.5L7 7.5L13 1.5' fill='none' stroke='%23A5A099' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 12px center;
    background-size: 14px 9px;
}

/* .selectdiv>select forces appearance:button, which would bring the native
   arrow back on top of the drawn one. */
.product-form .selectdiv > select.form-control,
#form-id .selectdiv > select.form-control {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

.product-form .form-group textarea.form-control,
#form-id .form-group textarea.form-control {
    height: auto;
    min-height: 182px;
    padding: 12px 10px;
    line-height: 1.6;
    resize: vertical;      /* horizontal drag used to break the grid */
}


/* --- select2 ------------------------------------------------------------ */
/* main.js:386 runs `$('select').select2()` on every page, so the control you
   actually see for Country, State and Product is a select2 widget - the real
   <select> is hidden. Styling `select.form-control` therefore does nothing to
   it, which is why the dropdowns kept style.css's 38px while the inputs moved
   to 45px. These rules bring the widget in line.

   The native rules above are kept as a fallback: if the select2 CDN fails, the
   real <select> shows through and still matches. */

.product-form .select2-container--default .select2-selection--single,
#form-id .select2-container--default .select2-selection--single {
    height: 45px;
    background-color: #FFFFFF;
    border: 1px solid #DFDBD3;
    border-radius: 6px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9'%3E%3Cpath d='M1 1.5L7 7.5L13 1.5' fill='none' stroke='%23A5A099' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 12px center;
    background-size: 14px 9px;
    transition: border-color .16s ease, box-shadow .16s ease;
}

.product-form .select2-container--default .select2-selection--single .select2-selection__rendered,
#form-id .select2-container--default .select2-selection--single .select2-selection__rendered {
    height: 43px;               /* 45 less the two borders */
    line-height: 43px;
    padding: 0 34px 0 10px;     /* matches the inputs, with room for the chevron */
    font-family: var(--sx-display);
    font-size: 15px;
    color: #1B1A18;
}

/* select2 draws its own CSS triangle; the chevron above replaces it so all
   three dropdowns match each other and the native fallback. */
.product-form .select2-container--default .select2-selection--single .select2-selection__arrow,
#form-id .select2-container--default .select2-selection--single .select2-selection__arrow {
    display: none;
}

.product-form .select2-container--default.select2-container--open .select2-selection--single,
.product-form .select2-container--default.select2-container--focus .select2-selection--single,
#form-id .select2-container--default.select2-container--open .select2-selection--single,
#form-id .select2-container--default.select2-container--focus .select2-selection--single {
    border-color: #E8802A;
    box-shadow: 0 0 0 3px rgba(232, 128, 42, .18);
}

/* --- submit ------------------------------------------------------------- */
/* The base rule is `width: 100px; float: right`, which squeezes the label and
   drops the button out of flow so its column collapses. fit-content with an
   auto left margin keeps it in flow and still hard right, level with the
   right-hand field edge as in the mock. */

.product-form .career-submit.career_btn,
#form-id .career-submit.career_btn {
    float: none;
    display: block;
    width: fit-content;
    min-width: 140px;
    height: 45px;
    margin: 4px 0 0 auto;
    padding: 0 24px;
    font-family: var(--sx-display);
    font-size: 14px;
    font-weight: 700;
    letter-spacing: .08em;
    line-height: 43px;      /* 45 less the two borders, so the label sits centred */
    text-align: center;
    text-transform: uppercase;
    color: #FFFFFF;
    background: #E8802A;
    border: 1px solid #E8802A;
    border-radius: 6px;
    transition: background .16s ease, border-color .16s ease;
}

.product-form .career-submit.career_btn:hover,
#form-id .career-submit.career_btn:hover,
.product-form .career-submit.career_btn:focus,
#form-id .career-submit.career_btn:focus {
    background: #D2701C;
    border-color: #D2701C;
    color: #FFFFFF;
}

.product-form .career-submit.career_btn:focus-visible,
#form-id .career-submit.career_btn:focus-visible {
    outline: 2px solid #1B1A18;
    outline-offset: 3px;
}

@media (max-width: 575.98px) {
    .product-form .career-submit.career_btn,
    #form-id .career-submit.career_btn { width: 100%; margin-left: 0; }
}

/* --------------------------------------------------------------------------
   21. Approvals / Certificates / Credentials list
   -------------------------------------------------------------------------- */

/* Its own padding rather than .sx__section's var(--sx-section-y): this is a
   plain page head sitting right under the nav with no crumbs bar above it,
   and it wants a little more room above than below. Kept explicit so it
   holds whatever the shared section token is set to. */
.sx-approvals-head { padding-top: 48px; padding-bottom: 32px; }
.sx-approvals-head__h1 {
    font-size: clamp(28px, 3.6vw, 44px);
    max-width: none;
    margin-bottom: 14px;
}

.sx-approvals-body { padding: 0 0 var(--sx-section-y); }

.sx-approvals-filters {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 16px;
    margin-bottom: 24px;
}

.sx-approvals-filters__row {
    display: flex;
    flex-wrap: wrap;
    gap: 14px;
}

.sx-approvals-filters__field { position: relative; }

/* Native <select> — the visible control if select2 doesn't load. */
.sx-approvals-filters__field select {
    appearance: none;
    -webkit-appearance: none;
    font-family: var(--sx-display);
    font-size: 14px;
    color: var(--sx-ink);
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    padding: 12px 40px 12px 16px;
    min-width: 220px;
    height: 46px;
    cursor: pointer;
}

.sx-approvals-filters__field select:focus {
    outline: none;
    border-color: var(--sx-saffron);
}

/* main.js:386 runs `$('select').select2()` sitewide, so what actually renders
   here is a select2 widget with the real <select> hidden — see the identical
   note above .product-form's select2 rules. These bring that widget in line
   with this page's tokens instead of the enquiry-form's orange skin. */
.sx-approvals-filters__field .select2-container { width: 220px !important; }

.sx-approvals-filters__field .select2-container--default .select2-selection--single {
    height: 46px;
    background-color: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    transition: border-color .16s ease;
}

.sx-approvals-filters__field .select2-container--default .select2-selection--single .select2-selection__rendered {
    height: 44px;
    line-height: 44px;
    padding: 0 40px 0 16px;
    font-family: var(--sx-display);
    font-size: 14px;
    color: var(--sx-ink);
}

/* select2 draws its own triangle; the chevron below replaces it so the
   select2 widget and the native fallback match. */
.sx-approvals-filters__field .select2-container--default .select2-selection--single .select2-selection__arrow {
    display: none;
}

.sx-approvals-filters__field .select2-container--default.select2-container--open .select2-selection--single,
.sx-approvals-filters__field .select2-container--default.select2-container--focus .select2-selection--single {
    border-color: var(--sx-saffron);
}

.sx-approvals-filters__field::after {
    content: '';
    position: absolute;
    top: 50%; right: 16px;
    width: 8px; height: 8px;
    border: solid var(--sx-steel);
    border-width: 0 1.5px 1.5px 0;
    transform: translateY(-65%) rotate(45deg);
    pointer-events: none;
}

.sx-approvals-filters__count {
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--sx-muted);
    white-space: nowrap;
}

.sx-approvals-table {
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    overflow: hidden;
}

.sx-approvals-table__row {
    display: grid;
    grid-template-columns: 80px 1.3fr 1.8fr 0.9fr 110px;
    align-items: center;
    gap: 16px;
    padding: 18px 24px;
    border-bottom: 1px solid var(--sx-hairline);
}
.sx-approvals-table__row:last-child { border-bottom: 0; }

.sx-approvals-table__row--head {
    background: var(--sx-porcelain);
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sx-muted);
    padding-top: 16px;
    padding-bottom: 16px;
}
.sx-approvals-table__row--head .sx-approvals-table__cell--agency {
    border-left: 1px solid var(--sx-hairline);
    border-right: 1px solid var(--sx-hairline);
}

/* Data rows share ONE grid so the agency cell can span multiple grid rows
   (grid-row set inline per cell from the view's sl_no / agency_span) —
   consecutive rows for the same agency get one centered logo instead of
   repeating it, per Node request. */
.sx-approvals-table__body {
    display: grid;
    grid-template-columns: 80px 1.3fr 1.8fr 0.9fr 110px;
    column-gap: 16px;
}
.sx-approvals-table__body .sx-approvals-table__cell {
    display: flex;
    align-items: center;
    padding: 18px 0;
}
/* A per-cell border-bottom would break at every column-gap, leaving dashed-
   looking rows — a divider per row bridges the gaps instead. It's split
   around the agency column rather than spanning the full width, since a
   merged agency cell must not be cut by a line through the middle of its
   logo; the agency segment only renders on a group's last row (see
   agency_group_end in the view), closing off that merged cell cleanly. */
.sx-approvals-table__body .sx-approvals-table__row-divider {
    align-self: end;
    border-bottom: 1px solid var(--sx-hairline);
}
.sx-approvals-table__body .sx-approvals-table__row-divider--left { grid-column: 1 / 4; }
.sx-approvals-table__body .sx-approvals-table__row-divider--agency { grid-column: 4 / 5; }
.sx-approvals-table__body .sx-approvals-table__row-divider--right { grid-column: 5 / 6; }
.sx-approvals-table__body .sx-approvals-table__cell--sl { grid-column: 1; padding-left: 24px; }
.sx-approvals-table__body .sx-approvals-table__cell--product { grid-column: 2; }
.sx-approvals-table__body .sx-approvals-table__cell--class { grid-column: 3; }
.sx-approvals-table__body .sx-approvals-table__cell--agency {
    grid-column: 4;
    justify-content: center;
    border-left: 1px solid var(--sx-hairline);
    border-right: 1px solid var(--sx-hairline);
}
.sx-approvals-table__body .sx-approvals-table__cell--agency-mobile { display: none; }
.sx-approvals-table__body .sx-approvals-table__cell--download { grid-column: 5; padding-right: 24px; justify-content: center; }

.sx-approvals-table__cell--sl { font-family: var(--sx-mono); color: var(--sx-muted); font-size: 13px; }
.sx-approvals-table__row--head .sx-approvals-table__cell--sl { color: inherit; font-size: 11px; }

.sx-approvals-table__cell--product { font-weight: 700; color: var(--sx-ink); }
.sx-approvals-table__cell--class { font-family: var(--sx-mono); font-size: 13px; color: var(--sx-steel); }
.sx-approvals-table__cell--agency,
.sx-approvals-table__cell--agency-mobile { color: var(--sx-steel); }
.sx-approvals-table__agency-logo {
    max-height: 52px;
    max-width: 100%;
    width: auto;
    object-fit: contain;
    display: block;
}
/* Per-agency size overrides — each logo's own proportions read better at a
   different height than the shared 52px cap; tuned individually per Node. */
.sx-approvals-table__agency-logo[alt="BV"] { max-height: 180px; }
.sx-approvals-table__agency-logo[alt="DNV"] { max-height: 92px; }
.sx-approvals-table__agency-logo[alt="DB"] { max-height: 104px; }
.sx-approvals-table__agency-logo[alt="FBTS"] { max-height: 64px; }
.sx-approvals-table__agency-logo[alt="TÜV Rheinland"] { max-height: 110px; }
.sx-approvals-table__agency-logo[alt="IBR"] { max-height: 120px; }
.sx-approvals-table__agency-logo[alt="LR"] { max-height: 120px; }
.sx-approvals-table__agency-logo[alt="ABS"] { max-height: 60px; }
.sx-approvals-table__agency-logo[alt="BIS"] { max-height: 80px; }
.sx-approvals-table__cell--download { text-align: center; }

/* Icon-only download control, per Node OpxVK — a plain 38x38 square with a
   subtle border, no "PDF" label; the label lives in the link's aria-label
   instead so it's still announced to screen readers. */
.sx-approvals-table__pdf {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    color: var(--sx-ink);
    background: transparent;
    border: 1px solid #DCD8D1;
    border-radius: 2px;
    text-decoration: none;
    transition: border-color .16s ease, background-color .16s ease;
}
.sx-approvals-table__pdf:hover,
.sx-approvals-table__pdf:focus {
    border-color: var(--sx-saffron);
    background-color: var(--sx-porcelain);
    text-decoration: none;
}

/* Rows whose certificate hasn't been supplied yet keep the same 38x38 footprint
   so the column stays aligned, but read as inert rather than clickable. */
.sx-approvals-table__pdf--none,
.sx-approvals-table__pdf--none:hover,
.sx-approvals-table__pdf--none:focus {
    color: var(--sx-muted);
    border-color: var(--sx-hairline);
    border-style: dashed;
    background: transparent;
    cursor: default;
}

.sx-approvals-table__empty {
    padding: 40px 24px;
    text-align: center;
    color: var(--sx-steel);
}

/* --- Phone-only card view (Node J5QyR, "Variant C — datasheet card") ---
   Hidden by default; swapped in for .sx-approvals-table at 767.98px below.
   Values sampled off the node rather than mapped onto the desktop table's
   tokens, per this page's own convention (see the per-agency logo-height
   overrides above). */
.sx-approvals-cards { display: none; flex-direction: column; gap: 14px; }

.sx-approvals-card {
    background: #FFFFFF;
    border: 1px solid #E4E2DC;
    border-radius: 3px;
    overflow: hidden;
}

.sx-approvals-card__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 14px 16px;
    background: #F7F5F2;
    border-bottom: 1px solid #E4E2DC;
}
.sx-approvals-card__name {
    font-family: var(--sx-display);
    font-size: 15.5px;
    font-weight: 600;
    color: var(--sx-ink);
    margin: 0;
}
.sx-approvals-card__no {
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .08em;
    color: #9A968E;
    flex: none;
}

.sx-approvals-card__row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 12px 16px;
    border-bottom: 1px solid #EFEDE8;
}
.sx-approvals-card__label {
    font-family: var(--sx-mono);
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: .13em;
    text-transform: uppercase;
    color: #8A8781;
}
.sx-approvals-card__value {
    font-family: var(--sx-mono);
    font-size: 12.5px;
    color: var(--sx-ink);
    text-align: right;
}
.sx-approvals-card__agency-logo {
    max-width: 90px;
    max-height: 28px;
    object-fit: contain;
    display: block;
}

.sx-approvals-card__download {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 9px;
    height: 44px;
    background: #FCEFE3;
    color: #B4540E;
    font-family: var(--sx-mono);
    font-size: 11.5px;
    font-weight: 600;
    letter-spacing: .13em;
    text-transform: uppercase;
    text-decoration: none;
}
.sx-approvals-card__download:hover,
.sx-approvals-card__download:focus {
    color: #B4540E;
    text-decoration: none;
}
.sx-approvals-card__download--none {
    background: var(--sx-porcelain);
    color: var(--sx-muted);
    cursor: default;
}

@media (max-width: 767.98px) {
    /* The grid table (Sl./Product/Classification/Agency/Download as one
       CSS grid with per-cell inline grid-row/grid-column, for the merged
       agency logo) is desktop-only past this point — .sx-approvals-cards
       below replaces it with an actual per-row card. */
    .sx-approvals-table { display: none; }
    .sx-approvals-cards { display: flex; }

    .sx-approvals-filters { flex-direction: column; align-items: flex-start; }
    .sx-approvals-filters__field select { min-width: 0; width: 100%; }
    .sx-approvals-filters__field .select2-container { width: 100% !important; }
    .sx-approvals-filters__row { width: 100%; }
    .sx-approvals-filters__field { flex: 1; min-width: 0; }
}

@media (max-width: 479.98px) {
    .sx-approvals-filters__row { flex-direction: column; }
}

/* Homepage approvals carousel — every logo renders in the same fixed box
   regardless of its native aspect ratio, so the row reads as one consistent
   set rather than a mix of tall/wide/square images. */
/* Desktop approvals — Node x3gtZ. The owl carousel stays as the mechanism;
   what changes is the frame around it. Everything here is min-width 768 so
   the phone section below is untouched. */
@media (min-width: 768px) {
    /* The padding is restated rather than left to --sx-section-y: this is the
       legacy .approvals section, not a .sx__section, and style.css sets it a
       flat 80px that never reads the token. */
    .sx-approvals {
        background: #FAFAFA;
        padding: 45px 0;
    }

    /* 52px off the marquee, and the head's own rhythm tightened to the
       design's 16px between eyebrow, heading and note. */
    .sx-approvals .sx__head { margin-bottom: 52px; }
    .sx-approvals .sx__h2 { font-size: 44px; line-height: 1.1; }
    .sx-approvals .sx__head p:not(.sx__eyebrow) { margin-top: 16px; max-width: 620px; }

    /* The carousel runs on the same rail as the heading above it, not the
       full viewport: same max-width and same gutter as .sx__wrap, so the
       first tile's left edge lines up with the eyebrow and the h2, and the
       row sits in the page's vertical column like every other section.
       bootstrap's .container is 1140 and .row carries -15px side margins,
       so both have to be restated rather than left to inherit. */
    .sx-approvals .container {
        max-width: var(--sx-max);
        width: 100%;
        margin: 0 auto;
        padding: 0 var(--sx-gutter);
    }
    .sx-approvals .row { margin: 0; }

    /* The design's auto-scroll has no controls, and owl's arrows would sit
       over the tiles. autoplay still moves it. */
    .sx-approvals .owl-nav { display: none; }

    /* The tile. margin rather than gap: .item is an owl slide, and owl sets
       each slot's width itself - a margin is the only spacing it leaves to
       CSS. All 18px on the right rather than 9px a side, so the gap between
       cells is the design's 18 while the first tile still starts flush with
       the rail edge, level with the eyebrow and heading above it. */
    .sx-approvals .logo-slider .item {
        width: 160px;   /* autoWidth reads this off the slide */
        height: 160px;
        margin: 0 18px 0 0;
        padding: 35px 22px;
        display: flex;
        align-items: center;
        justify-content: center;
        background: #fff;
        border: 1px solid var(--sx-hairline);
    }

    /* 35px/22px of padding inside a 160px cell leaves exactly the 116x90 box
       the design gives each logo, which is what .sx-home-approvals__logo
       already fills - so that rule needs no desktop override. */

    /* No edge fades. They belonged to the full-bleed version, where tiles ran
       under the viewport edge and needed softening; on a rail that stops
       level with the heading they would just grey out the first and last
       tile inside the column. */
}

/* Phone approvals — the headed section and logo strip that replace the owl
   carousel below 767px. Desktop never sees it; the carousel never sees a
   phone. Head, ground and hairlines are the section system and the legacy
   .approvals ground respectively, so only the strip below is new. */
.sx-approv { display: none; }

@media (max-width: 767px) {
    .approvals { display: none; }

    .sx-approv {
        display: block;
        background: rgba(0, 0, 0, .02);
        border-top: 1px solid rgba(0, 0, 0, .1);
        border-bottom: 1px solid rgba(0, 0, 0, .1);
    }

    /* Full-bleed scroller. The left gutter is a margin, not padding: with
       scroll snapping on, the snapport is the padding box, so the initial
       snap pulled the first tile's edge onto the border edge and scrolled
       the left padding out of sight - the strip sat flush with the viewport
       while the head sat a gutter in. A margin cannot be scrolled away, so
       the first tile now holds the heading's line. The right gutter stays
       padding, so the last tile can still sit under the right edge and read
       as more-to-come. scrollbar-width/::-webkit-scrollbar hide the bar
       itself - the cut-off tile is the affordance. */
    .sx-approv__strip {
        display: flex;
        gap: 12px;
        margin: 0 0 0 var(--sx-gutter);
        padding: 0 var(--sx-gutter) 0 0;
        list-style: none;
        overflow-x: auto;
        scroll-snap-type: x proximity;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
    }
    .sx-approv__strip::-webkit-scrollbar { display: none; }

    /* flex: none, or the tiles shrink to share the rail instead of holding
       their width and overflowing into a scroll. */
    .sx-approv__tile {
        flex: 0 0 104px;
        height: 132px;
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 14px;
        background: #fff;
        border: 1px solid var(--sx-hairline);
        scroll-snap-align: start;
    }

    /* max-* rather than width/height: the logos are a mix of tall, wide and
       square, and each should sit at its own size inside the tile rather than
       be stretched to a common box. */
    .sx-approv__tile img {
        max-width: 100%;
        max-height: 100%;
        object-fit: contain;
        display: block;
    }
}

.sx-home-approvals__logo {
    /* width:100% (capped at 150px) rather than a flat 150px — owl-carousel
       hands each slide a narrower slot on mobile (items:3 in the responsive
       config below 767px), and a fixed 150px logo overflowed that slot and
       bled into the neighbouring slides, reading as stacked/overlapping
       logos. */
    width: 100%;
    max-width: 150px;
    height: 90px;
    object-fit: contain;
    display: block;
    margin: 0 auto;
}

/* --------------------------------------------------------------------------
   22. Industry page — steel (plant map + component/wear/consumable table)
   -------------------------------------------------------------------------- */

/* --- head -------------------------------------------------------------- */

.sx-ind-head { padding-bottom: 0; }

.sx-ind-head__grid {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 28px;
}
.sx-ind-head__copy { flex: 1 1 520px; min-width: 0; }

.sx-ind-head__h1 {
    font-size: clamp(30px, 4.2vw, 54px);
    max-width: 20ch;
    margin-bottom: 16px;
}

.sx-ind-head__figs {
    display: grid;
    grid-template-columns: repeat(3, auto);
    gap: clamp(20px, 3vw, 40px);
    margin: 0;
    flex: 0 0 auto;
}
.sx-ind-fig { margin: 0; }
.sx-ind-fig__n {
    display: block;
    font-size: clamp(26px, 2.6vw, 34px);
    font-weight: 800;
    letter-spacing: -.03em;
    line-height: 1;
}
.sx-ind-fig__l {
    display: block;
    margin: 8px 0 0;
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--sx-muted);
}

/* --- head, picture-led variant ----------------------------------------- */

/* A sector that ships a render of its whole site puts it in the head. Copy and
   figures share the left column; the drawing takes the right and spans both
   rows, so the figures sit on the picture's bottom edge instead of floating
   halfway up it. The DOM order stays copy / picture / figures for a reader
   without CSS - the headline still comes before the artwork. */
@media (min-width: 992px) {
    .sx-ind-head--visual .sx-ind-head__grid {
        display: grid;
        grid-template-columns: minmax(0, 1fr) minmax(0, 1.16fr);
        grid-template-rows: auto 1fr;
        grid-template-areas:
            "copy   visual"
            "figs   visual";
        column-gap: clamp(28px, 3vw, 48px);
        row-gap: 22px;
        align-items: start;
    }
    .sx-ind-head--visual .sx-ind-head__copy { grid-area: copy; }
    /* Stretched over both rows so the picture ends on the figures rather than
       leaving a column of white under it whatever length the lede runs to. */
    .sx-ind-head--visual .sx-ind-visual {
        grid-area: visual;
        align-self: stretch;
        display: flex;
        flex-direction: column;
    }
    .sx-ind-head--visual .sx-ind-visual__frame {
        flex: 1 1 auto;
        aspect-ratio: auto;
        min-height: 380px;
    }
    .sx-ind-head--visual .sx-ind-head__figs {
        grid-area: figs;
        align-self: end;
        border-top: 1px solid var(--sx-hairline);
        padding-top: 18px;
    }
    .sx-ind-head--visual .sx-ind-head__h1 { max-width: none; }
}

.sx-ind-visual { margin: 0; }
/* The frame - not the picture - sets the box, so swapping in an area drawing
   of a different aspect never changes the height of the head. */
.sx-ind-visual__frame {
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
    background: var(--sx-ink);
    border-radius: 2px;
    aspect-ratio: 1400 / 904;
}
/* Letterboxed, never cropped: the picture's whole point is that it is the
   whole plant, and a cover crop takes the coke ovens off one edge and the
   substation off the other. Each drawing sits on its own ground -- the campus
   render on ink, the area drawings on the porcelain they were cut from -- so
   the bars either side of it are not visible as bars. */
.sx-ind-visual__img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
    transition: opacity .22s ease;
}
.sx-ind-visual.is-area .sx-ind-visual__frame { background: var(--sx-porcelain); }
.sx-ind-visual.is-swapping .sx-ind-visual__img { opacity: 0; }

/* Loading state. The renders are heavy, and on a phone the frame can sit empty
   for seconds -- which reads as broken, not as busy. So the frame carries a
   spinner while the first picture is on its way (is-loading, cleared by the
   img's own onload) and again while the filmstrip swaps one in (is-swapping).
   The picture is held back until it is whole, then fades in over the spinner's
   place. With scripting off nothing would clear the class, so the picture is
   only ever hidden when script can run. */
.sx-ind-visual__frame { position: relative; }
.sx-ind-visual__frame::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 36px;
    height: 36px;
    margin: -18px 0 0 -18px;
    border: 3px solid rgba(255, 255, 255, .18);
    border-top-color: var(--sx-saffron);
    border-radius: 50%;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity .18s ease, visibility 0s linear .18s;
    animation: sx-spin .8s linear infinite;
}
.sx-ind-visual__frame.is-loading::after,
.sx-ind-visual.is-swapping .sx-ind-visual__frame::after {
    opacity: 1;
    visibility: visible;
    transition: opacity .18s ease;
}
@media (scripting: enabled) {
    .sx-ind-visual__frame.is-loading .sx-ind-visual__img,
    .sx-ind-visual__frame.is-loading .sx-hotspots { opacity: 0; }
}
/* On porcelain (an area drawing) and on the transparent map frame the white
   track would vanish, so it turns to a hairline there. */
.sx-ind-visual.is-area .sx-ind-visual__frame::after,
.sx-ind-visual--map .sx-ind-visual__frame::after {
    border-color: var(--sx-hairline);
    border-top-color: var(--sx-saffron);
}
@keyframes sx-spin { to { transform: rotate(360deg); } }

.sx-ind-visual__cap {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 6px 12px;
    margin-top: 10px;
}
.sx-ind-visual__name {
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--sx-ink);
}
.sx-ind-visual__note {
    font-family: var(--sx-mono);
    font-size: 11px;
    color: var(--sx-muted);
}

@media (max-width: 991.98px) {
    .sx-ind-head--visual .sx-ind-head__grid { display: block; }
    .sx-ind-head--visual .sx-ind-visual { margin: 24px 0 0; }
    .sx-ind-head--visual .sx-ind-head__figs { margin-top: 24px; }
}
@media (prefers-reduced-motion: reduce) {
    .sx-ind-visual__img { transition: none; }
    /* Slowed, not stopped: a still ring would stop saying "loading". */
    .sx-ind-visual__frame::after { animation-duration: 2.4s; }
}

/* --- the render as the selector ----------------------------------------
   A sector whose area pictures are crops of one render (cement) puts numbered
   pins on that render. The frame letterboxes like every other one -- the whole
   point of the picture is that it is the whole plant -- so the pin layer
   cannot simply fill the frame: it is sized to the picture's own box inside it
   by sizeHotspots() in industry-map.js, and the pins are per cent of that.
   Everything below the frame -- the caption, the filmstrip, the table -- is
   unchanged; the pins are a second way into the same filter, not a second one. */
.sx-ind-visual--map .sx-ind-visual__frame {
    position: relative;
    /* The picture already fits inside the frame, and the pin labels need to be
       able to stand outside it at the edges of the plant. */
    overflow: visible;
    /* These renders are delivered cut out, with real transparency around the
       plant, so the frame must not paint a ground of its own -- an ink panel
       behind a cut-out render is exactly the dark rectangle the cut-out was
       made to get rid of. The site sits on the page instead. */
    background: transparent;
}
/* Same reason in the selected-area state, whatever the base rule says. */
.sx-ind-visual--map.is-area .sx-ind-visual__frame { background: transparent; }
@media (min-width: 992px) {
    /* The render is the control here, not an illustration beside one, so it
       takes more of the head than a picture that only gets looked at -- and it
       is held to its own 3:2 rather than stretched to the copy, because ink
       bars above and below a plant you are meant to click read as dead space.
       That leaves the copy column the taller of the two, so the figures move
       under the picture instead of under the lede and the two columns finish
       together. DOM order is unchanged: copy, picture, figures. */
    .sx-ind-head--map .sx-ind-head__grid {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1.34fr);
        grid-template-areas:
            "copy visual"
            "copy figs";
        align-items: start;
    }
    .sx-ind-head--map .sx-ind-visual { align-self: start; }
    .sx-ind-head--map .sx-ind-visual__frame {
        flex: 0 0 auto;
        aspect-ratio: 3 / 2;
        min-height: 0;
    }
    .sx-ind-head--map .sx-ind-head__figs { align-self: start; }
}

/* Positioned and sized from script, over the picture rather than the frame.
   The fallback box is the whole frame, so a pin is never stranded off-page if
   the script has not run yet. */
.sx-hotspots {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    transition: opacity .22s ease;
}
/* Pin coordinates only mean something on the full render, so once the frame
   carries an area crop the pins go -- visibility rather than opacity so they
   leave the tab order with them. */
.sx-ind-visual--map.is-area .sx-hotspots,
.sx-ind-visual--map.is-swapping .sx-hotspots {
    opacity: 0;
    visibility: hidden;
}

.sx-hotspot {
    position: absolute;
    left: var(--sx-hx);
    top: var(--sx-hy);
    transform: translate(-50%, -50%);
    padding: 5px;
    border: 0;
    background: none;
    cursor: pointer;
}
.sx-hotspot__pin {
    display: grid;
    place-items: center;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    border: 2px solid #fff;
    background: var(--sx-saffron);
    color: var(--sx-ink);
    font-family: var(--sx-mono);
    font-size: 12px;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0;
    transition: transform .18s ease, background-color .18s ease, box-shadow .18s ease;
    /* The ring is what makes a pin readable over a busy render at any zoom. */
    box-shadow: 0 0 0 5px rgba(255, 153, 51, .24), 0 3px 14px rgba(0, 0, 0, .45);
}
.sx-hotspot:hover, .sx-hotspot:focus-visible { z-index: 3; }
.sx-hotspot:hover .sx-hotspot__pin,
.sx-hotspot:focus-visible .sx-hotspot__pin { transform: scale(1.14); background: #fff; }
.sx-hotspot:focus { outline: none; }
.sx-hotspot:focus-visible .sx-hotspot__pin {
    box-shadow: 0 0 0 4px var(--sx-saffron), 0 3px 14px rgba(0, 0, 0, .45);
}
.sx-hotspot.is-selected .sx-hotspot__pin {
    background: #fff;
    box-shadow: 0 0 0 7px rgba(255, 153, 51, .42), 0 3px 14px rgba(0, 0, 0, .45);
}

/* display, not opacity: a hidden label still counts towards the page's scroll
   width, and the leftmost pins put theirs past the edge of the picture. */
.sx-hotspot__label {
    display: none;
    position: absolute;
    top: calc(100% + 4px);
    left: 50%;
    transform: translateX(-50%);
    white-space: nowrap;
    padding: 7px 10px;
    background: var(--sx-white);
    border: 1px solid var(--sx-saffron);
    box-shadow: 0 6px 16px rgba(0, 0, 0, .22);
    font-family: var(--sx-mono);
    font-size: 11px;
    line-height: 1.2;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--sx-ink);
}
.sx-hotspot:hover .sx-hotspot__label,
.sx-hotspot:focus-visible .sx-hotspot__label { display: block; }

/* With the pins gone this is the way back to the whole plant from the picture
   itself; the filter bar's pill does the same job from below the strip. */
.sx-ind-visual__back {
    display: none;
    position: absolute;
    left: 12px;
    top: 12px;
    padding: 9px 13px;
    border: 1px solid var(--sx-hairline);
    background: rgba(255, 255, 255, .94);
    color: var(--sx-ink);
    font-family: var(--sx-mono);
    font-size: 11px;
    letter-spacing: .08em;
    text-transform: uppercase;
    cursor: pointer;
}
.sx-ind-visual__back:hover { background: var(--sx-saffron); }
.sx-ind-visual--map.is-area .sx-ind-visual__back { display: block; }

.sx-ind-visual__prompt {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    font-family: var(--sx-mono);
    font-size: 11px;
    color: var(--sx-muted);
    margin-left: auto;
}
.sx-ind-visual--map.is-area .sx-ind-visual__prompt { visibility: hidden; }

@media (max-width: 767.98px) {
    .sx-hotspot__pin {
        width: 26px;
        height: 26px;
        font-size: 10px;
        box-shadow: 0 0 0 4px rgba(255, 153, 51, .24), 0 2px 10px rgba(0, 0, 0, .45);
    }
    .sx-ind-visual__prompt { margin-left: 0; }
}
@media (prefers-reduced-motion: reduce) {
    .sx-hotspots,
    .sx-hotspot__pin { transition: none; }
    .sx-hotspot:hover .sx-hotspot__pin,
    .sx-hotspot:focus-visible .sx-hotspot__pin { transform: none; }
}

/* --- plant map --------------------------------------------------------- */

/* The map is a card of its own so it can sit beside the component list as an
   equal panel rather than a drawing floating above it. */
.sx-plantmap {
    position: relative;
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    padding: 16px 18px 18px;
}

.sx-plantmap__head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 10px 16px;
    margin-bottom: 10px;
}
.sx-plantmap__title { font-size: clamp(18px, 1.6vw, 22px); margin: 0; }

.sx-plantmap__hint {
    display: inline-flex;
    align-items: center;
    gap: 9px;
    margin: 0;
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--sx-muted);
}
.sx-plantmap__dot {
    width: 8px; height: 8px;
    border-radius: 50%;
    background: var(--sx-saffron);
    flex: none;
}

/* Below ~760px the drawing labels stop being readable if the stage keeps
   scaling down with the viewport, so it holds a floor width and the wrapper
   scrolls sideways instead. */
.sx-plantmap__scroll { overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch; }
.sx-plantmap__stage {
    width: 100%;
    min-width: 640px;
    aspect-ratio: 1080 / 620;
}

/* From tablet up the panel takes the shape of the widest-framed drawing in the
   set rather than a ratio picked by hand. An SVG scales to fit its box entirely,
   so whichever of width or height runs out first decides how big the drawing
   gets: at the old 1080/620 the box was wider than every scene, so height ran
   out first and the drawing was pinned smaller than its column with slack left
   and right. Matching the narrowest scene (transport, 1.52) makes width the
   limit on all nine, so each one is drawn as large as its column allows. */
@media (min-width: 992px) {
    .sx-plantmap__stage { aspect-ratio: 1080 / 710; }
    /* A few more pixels of drawing rather than frame, at the width where the
       map column is tightest. */
    .sx-plantmap { padding: 16px 14px 16px; }
}
/* aspect-ratio is well supported now, but a fallback height keeps the SVG
   from collapsing to nothing where it is not. */
@supports not (aspect-ratio: 1 / 1) {
    .sx-plantmap__stage { height: 420px; }
}

.sx-plantmap__spot { cursor: pointer; transition: opacity .2s ease; }
.sx-plantmap__spot[data-dim] { opacity: .5; }
.sx-plantmap__spot:focus { outline: none; }
.sx-plantmap__spot:focus-visible { outline: 2px solid var(--sx-saffron); outline-offset: 2px; }

.sx-plantmap__label { pointer-events: none; }
/* No font-size here on purpose: the labels are sized in viewBox units, so the
   drawing picks the size that lands right on screen for the width it was given
   (see labelFont() in industry-map.js) and a rule here would only override it
   while the pill drawn behind the text kept the old width. */
.sx-plantmap__label text {
    font-family: var(--sx-display);
    font-weight: 600;
    letter-spacing: .01em;
}

@keyframes sx-drift {
    0%   { transform: translate(0, 0) scale(1); opacity: .5; }
    100% { transform: translate(10px, -46px) scale(1.7); opacity: 0; }
}
.sx-plantmap__smoke {
    opacity: 0;
    animation: sx-drift 4.2s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
    .sx-plantmap__smoke { animation: none; }
}

/* --- plant tiles ------------------------------------------------------- */

/* --- plant filmstrip --------------------------------------------------- */

/* Where an industry ships raster artwork (a "tiles" block in its module), the
   plant panel draws these instead of the generated isometric scene. Each tile
   is a button carrying the same data-area slug the drawn map uses, so the
   picture, the photograph in the page head and the table are three views of
   one filter.

   The strip is one horizontal run at every width. Eight areas in a wrapping
   grid ran the panel taller than the table it filters and lost the order of
   the route; scrolling sideways keeps the whole plant on one line, keeps the
   route left-to-right, and puts the table straight under the pictures. */
.sx-strip {
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
    scrollbar-color: var(--sx-hairline) transparent;
    /* the strip is the scroll container, so the tiles' hover lift and focus
       ring need room inside it rather than being clipped at the edges */
    padding: 4px 2px 10px;
    margin: 0 -2px;
    scroll-padding-inline: 2px;
    overscroll-behavior-x: contain;
}
/* The strip runs past the panel edge by design, so it has to look like it
   does: the last tile fades out under a mask rather than being cut clean, which
   at a glance reads as the panel ending. Masked only while there is something
   to scroll to -- the class comes off at the end of the run. */
.sx-strip.is-overflowing {
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 54px), transparent 100%);
            mask-image: linear-gradient(to right, #000 calc(100% - 54px), transparent 100%);
}
.sx-strip.is-overflowing.is-scrolled {
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 30px, #000 calc(100% - 54px), transparent 100%);
            mask-image: linear-gradient(to right, transparent 0, #000 30px, #000 calc(100% - 54px), transparent 100%);
}
.sx-strip.is-overflowing.is-scrolled.is-scrollend {
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 30px);
            mask-image: linear-gradient(to right, transparent 0, #000 30px);
}

.sx-strip::-webkit-scrollbar { height: 8px; }
.sx-strip::-webkit-scrollbar-track { background: transparent; }
.sx-strip::-webkit-scrollbar-thumb {
    background: var(--sx-hairline);
    border-radius: 4px;
}
.sx-strip::-webkit-scrollbar-thumb:hover { background: #CFCCC4; }

/* max-content with a 100% floor is what lets one rule serve both cases: a
   sector with three areas gets a row exactly as wide as the panel, and its
   tiles grow into it; a sector with nine gets a row wider than the panel, no
   free space to grow into, and a sideways scroll. No JS decides which. */
.sx-strip__row {
    list-style: none;
    display: flex;
    gap: 10px;
    margin: 0;
    padding: 0;
    width: max-content;
    min-width: 100%;
}
/* Every tile the same width whatever the caption runs to, so the artwork sits
   on one baseline across the strip. Grows into spare room, never shrinks below
   its floor -- shrinking is what would turn a long strip into eight unreadable
   slivers instead of a scroll. */
.sx-strip__item {
    flex: 1 0 150px;
    scroll-snap-align: start;
}

/* Every tile keeps a porcelain ground at all states, including selected. The
   artwork was cut from a #FAFAF8 field and a few near-background pixels survive
   along each platform's shadow; on porcelain they are the background, and on a
   tinted or white ground they would read as a faint halo. Selection is carried
   by the border, the ring and the tick instead of a fill. */
.sx-tile {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    overflow: hidden;
    background: var(--sx-porcelain);
    border: 1px solid var(--sx-hairline);
    border-radius: 3px;
    font: inherit;
    color: inherit;
    text-align: left;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition: border-color .18s ease, box-shadow .18s ease,
                opacity .18s ease, transform .14s ease;
}

/* --- click feedback ---------------------------------------------------
   The tile is the page's main control, so it has to feel like one: it lifts
   under the pointer, presses down on pointerdown, and stays ringed while its
   area is the one in the table. */
.sx-tile:hover {
    border-color: var(--sx-steel);
    transform: translateY(-2px);
    box-shadow: 0 6px 18px rgba(20, 22, 26, .09);
}
.sx-tile:active,
.sx-tile.is-pressed { transform: translateY(0) scale(.978); box-shadow: none; }
.sx-tile:focus { outline: none; }
.sx-tile:focus-visible { outline: 2px solid var(--sx-saffron); outline-offset: 2px; }

.sx-tile.is-selected {
    border-color: var(--sx-saffron);
    box-shadow: inset 0 0 0 1px var(--sx-saffron), 0 4px 14px rgba(233, 116, 0, .16);
}
.sx-tile.is-selected:hover { transform: translateY(-2px); }
.sx-tile.is-selected .sx-tile__name { color: var(--sx-ember); }

/* One area selected dims the others - the same read the drawn map gives. The
   "Full plant" tile is the reset, not one of the areas, so it stays lit. */
.sx-strip.is-filtered .sx-tile:not(.is-selected):not(.sx-tile--all) { opacity: .45; }
.sx-strip.is-filtered .sx-tile:not(.is-selected):hover { opacity: 1; }

/* The tick that says "this is the area in the table". Sized and placed off the
   corner so it never lands on the artwork. */
.sx-tile__mark {
    position: absolute;
    top: 6px;
    right: 6px;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--sx-saffron);
    opacity: 0;
    transform: scale(.4);
    transition: opacity .16s ease, transform .16s cubic-bezier(.34, 1.56, .64, 1);
}
.sx-tile__mark::before {
    content: "";
    position: absolute;
    top: 4px;
    left: 5.5px;
    width: 4px;
    height: 7px;
    border: solid var(--sx-white);
    border-width: 0 1.6px 1.6px 0;
    transform: rotate(42deg);
}
.sx-tile.is-selected .sx-tile__mark { opacity: 1; transform: scale(1); }

/* --- artwork ----------------------------------------------------------
   The eight drawings are not the same aspect, so the frame - not the image -
   sets the height, and every caption in the strip lines up whatever the
   picture gave back. The band runs edge to edge: the tiles are small enough
   that padding around the artwork costs more than it buys. */
.sx-tile__frame {
    display: flex;
    align-items: flex-end;
    justify-content: center;
    width: 100%;
    height: 92px;
    overflow: hidden;
}
.sx-tile__art {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
    object-position: bottom center;
    transition: transform .22s ease;
}
.sx-tile:hover .sx-tile__art { transform: scale(1.06); }
.sx-tile:active .sx-tile__art,
.sx-tile.is-pressed .sx-tile__art { transform: scale(1); }

/* Until its drawing arrives a tile shows a shimmering skeleton the size of
   the artwork, so the strip reads as filling in rather than as eight blanks.
   is-loading is cleared by the img's own onload/onerror. */
.sx-tile__frame.is-loading {
    background: linear-gradient(90deg,
        var(--sx-hairline) 0%, #F1F0EC 45%, var(--sx-hairline) 90%);
    background-size: 220% 100%;
    animation: sx-shimmer 1.3s ease-in-out infinite;
}
@media (scripting: enabled) {
    .sx-tile__frame.is-loading .sx-tile__art { opacity: 0; }
}
.sx-tile__art { transition: transform .22s ease, opacity .25s ease; }
@keyframes sx-shimmer {
    from { background-position: 100% 0; }
    to   { background-position: -120% 0; }
}

/* "Full plant" is the reset, not a photograph of one area, so it carries the
   page's ink ground and a mark rather than a picture - the one tile in the
   strip that never dims. */
.sx-tile--all .sx-tile__frame--all {
    align-items: center;
    background: var(--sx-ink);
    color: var(--sx-saffron);
}

.sx-tile__text {
    display: flex;
    flex-direction: column;
    gap: 3px;
    margin-top: auto;
    padding: 9px 10px 10px;
}
.sx-tile__name {
    font-family: var(--sx-display);
    font-size: 12.5px;
    font-weight: 700;
    line-height: 1.3;
    color: var(--sx-ink);
    transition: color .18s ease;
}
.sx-tile__count {
    font-family: var(--sx-mono);
    font-size: 10px;
    letter-spacing: .03em;
    color: var(--sx-muted);
}

@media (max-width: 767.98px) {
    .sx-strip__item { width: 132px; }
    .sx-tile__frame { height: 80px; }
}

@media (prefers-reduced-motion: reduce) {
    .sx-tile,
    .sx-tile__art,
    .sx-tile__mark { transition: none; }
    .sx-tile:hover { transform: none; }
    .sx-tile:hover .sx-tile__art { transform: none; }
    .sx-tile__frame.is-loading { animation: none; }
}

/* --- plant panel ------------------------------------------------------- */

/* One card holding the whole control: the strip, the read-out of what it is
   filtered to, and the table it filters. The two used to be side-by-side
   panels; stacking them inside one border is what lets the table have the
   page's full width back. */
.sx-plantpanel {
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    padding: clamp(16px, 2vw, 26px);
}
.sx-plantpanel__head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px 16px;
    margin-bottom: 14px;
}
.sx-plantpanel__title { font-size: clamp(17px, 1.5vw, 20px); margin: 0; }
.sx-plantpanel__hint {
    display: flex;
    align-items: center;
    gap: 7px;
    margin: 0;
    font-family: var(--sx-mono);
    font-size: 11.5px;
    line-height: 1.4;
    color: var(--sx-muted);
}
/* Pushed to the far end of the head row, where the design leaves the space
   empty - the strip below replaced the chip row, but 110 rows still need a
   way in that is not eight clicks. */
.sx-plantpanel__search { margin-left: auto; flex: 0 1 300px; min-width: 190px; }

/* --- filter read-out --------------------------------------------------- */

.sx-filterbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px 14px;
    margin: 16px 0 12px;
}
.sx-filterbar__pill {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 7px 11px;
    background: #FCEFE3;
    border: 0;
    border-radius: 2px;
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--sx-ember);
    cursor: default;
}
/* The clear control only exists once there is something to clear. */
.sx-filterbar__x { display: none; line-height: 0; }
.sx-filterbar.is-filtered .sx-filterbar__pill { cursor: pointer; }
.sx-filterbar.is-filtered .sx-filterbar__x { display: inline-flex; }
.sx-filterbar.is-filtered .sx-filterbar__pill:hover { background: var(--sx-saffron); color: var(--sx-ink); }
.sx-filterbar__pill:focus { outline: none; }
.sx-filterbar__pill:focus-visible { outline: 2px solid var(--sx-saffron); outline-offset: 2px; }

.sx-filterbar__count,
.sx-filterbar__note {
    font-family: var(--sx-mono);
    font-size: 11.5px;
    color: var(--sx-muted);
}
.sx-filterbar__note {
    margin-left: auto;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: #9AA0A8;
}
@media (max-width: 767.98px) { .sx-filterbar__note { display: none; } }

/* Inside the panel the table is not a card of its own - the panel's border is
   already around it. */
.sx-comp--flat {
    background: transparent;
    border: 0;
    border-radius: 0;
}
.sx-comp--flat .sx-comp-table { border: 1px solid var(--sx-hairline); }
.sx-comp--flat .sx-comp__foot {
    border: 1px solid var(--sx-hairline);
    border-top: 0;
}
.sx-comp--flat .sx-comp-table__row,
.sx-comp--flat .sx-comp__foot { padding-left: 16px; padding-right: 16px; }
.sx-comp--flat .sx-comp-cards { padding: 0; }

/* 110 rows under the strip would run the page on for six screens and take the
   filmstrip -- the control the table answers to -- off the top of it. The list
   scrolls inside the panel instead, with the head row pinned, the same trade
   the two-column layout makes at 1200px. */
@media (min-width: 768px) {
    .sx-comp--flat .sx-comp-table { max-height: min(70vh, 660px); overflow-y: auto; }
    .sx-comp--flat .sx-comp-table__row--head {
        position: sticky;
        top: 0;
        z-index: 1;
    }
}

/* --- area chips -------------------------------------------------------- */

/* The page head above stops at padding-bottom:0, so the gap between the lede
   and this block is set here — it used to be .sx-plantmap's margin-top. */
.sx-ind-body { padding: 28px 0 var(--sx-section-y); }
@media (min-width: 992px) {
    .sx-ind-body { padding-top: 64px; }
}

/* Stacked by default — map first, then the chips and the table, which is the
   order the page had before the two-column layout existed. The grid only
   engages at 1200px, where the map column is finally wide enough to read. */
.sx-ind-split { display: grid; gap: 28px; }
.sx-ind-split .sx-plantmap { order: -1; }
/* Grid items default to min-width:auto, which lets the map's 640px floor push
   the whole column — and with it the page — wider than the phone it is on. */
.sx-ind-split > * { min-width: 0; }

.sx-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 20px;
}
.sx-chip {
    font-family: var(--sx-display);
    font-size: 13.5px;
    font-weight: 600;
    color: var(--sx-steel);
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    padding: 10px 16px;
    white-space: nowrap;
    cursor: pointer;
    transition: border-color .16s ease, color .16s ease, background .16s ease;
}
.sx-chip:hover { border-color: var(--sx-saffron); color: var(--sx-ink); }
.sx-chip.is-active {
    background: var(--sx-ink);
    border-color: var(--sx-ink);
    color: var(--sx-white);
}

/* --- component table --------------------------------------------------- */

.sx-comp {
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
}

/* Clicking a plant tile swaps the rows in place, which on a long list is a
   change a reader can miss. One pass of a saffron edge says the panel is the
   thing that just answered the click. industry-map.js puts the class on. */
@keyframes sxCompRefresh {
    0%   { box-shadow: 0 0 0 0 rgba(255, 153, 51, .55); border-color: var(--sx-saffron); }
    100% { box-shadow: 0 0 0 7px rgba(255, 153, 51, 0);  border-color: var(--sx-hairline); }
}
.sx-comp.is-refreshed { animation: sxCompRefresh .55s ease-out; }
@media (prefers-reduced-motion: reduce) {
    .sx-comp.is-refreshed { animation: none; }
}

.sx-comp__head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 20px 24px;
    border-bottom: 1px solid var(--sx-hairline);
}
.sx-comp__title { font-size: clamp(20px, 2vw, 26px); margin: 0; }
.sx-comp__sub { margin: 6px 0 0; font-size: 14.5px; color: var(--sx-steel); }

.sx-comp__search { flex: 0 1 340px; min-width: 200px; }
/* The label is there for screen readers only; the placeholder carries it
   visually, the same trade the approvals filters make. */
.sx-comp__srlabel {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}
.sx-comp__search input {
    /* type="search" keeps Chrome's native searchfield appearance by default,
       which sizes the field off its own intrinsic width rather than the box
       model — width:100% then loses and the field runs past its own card on
       narrow screens. Resetting appearance hands sizing back to the CSS. */
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    /* style.css's normalize reset pins input[type="search"] to
       box-sizing:content-box with a selector specific enough to beat the
       sitewide `.sx * { box-sizing: border-box }` rule, so width:100% was
       landing 53px (the padding) past this field's own box. */
    box-sizing: border-box;
    width: 100%;
    font-family: var(--sx-display);
    font-size: 14.5px;
    color: var(--sx-ink);
    background-color: var(--sx-porcelain);
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B7078' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20.5 20.5l-4.2-4.2'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 13px center;
    background-size: 15px 15px;
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    padding: 0 38px 0 15px;
    height: 40px;
}
.sx-comp__search input::-webkit-search-decoration,
.sx-comp__search input::-webkit-search-cancel-button,
.sx-comp__search input::-webkit-search-results-button,
.sx-comp__search input::-webkit-search-results-decoration {
    display: none;
}
.sx-comp__search input:focus {
    outline: none;
    border-color: var(--sx-saffron);
    background-color: var(--sx-white);
}

/* Keep absolutely positioned screen-reader text inside its scrolling list. */
.sx-comp-table,
.sx-comp-cards { position: relative; }

.sx-comp-table__row {
    display: grid;
    grid-template-columns: minmax(0, 1.45fr) minmax(0, .95fr) minmax(0, 1.05fr) minmax(0, 1fr) minmax(0, 1.75fr);
    align-items: center;
    gap: 16px;
    padding: 12px 24px;
    min-height: 62px;
    border-bottom: 1px solid var(--sx-hairline);
}
.sx-comp-table__row:last-child { border-bottom: 0; }

.sx-comp-table__row--head {
    min-height: 0;
    background: var(--sx-porcelain);
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sx-muted);
    padding-top: 13px;
    padding-bottom: 13px;
}

.sx-comp-table__cell {
    font-size: 14.5px;
    color: var(--sx-steel);
    min-width: 0;
    overflow-wrap: anywhere;
}
.sx-comp-table__cell--comp { font-weight: 700; color: var(--sx-ink); }
/* Extra room before the recommendation, so the grade tag does not sit tight
   against the area column. Set on the cell, head included, so they align. */
.sx-comp-table__cell--prod { padding-left: 24px; }
.sx-comp-table__row--head .sx-comp-table__cell { font-weight: 600; color: inherit; }

/* The recommendation is a link to the grade's product page, styled as a tag
   so the column still reads as data rather than a wall of link text. */
.sx-comp-tag {
    display: inline-block;
    font-family: var(--sx-mono);
    font-size: 11.5px;
    font-weight: 600;
    letter-spacing: .02em;
    line-height: 1.4;
    color: var(--sx-ember);
    background: #FCEFE3;
    padding: 6px 10px;
    border-radius: 2px;
    text-decoration: none;
    transition: background .16s ease, color .16s ease;
}
.sx-comp-tag:hover,
.sx-comp-tag:focus {
    background: var(--sx-saffron);
    color: var(--sx-ink);
    text-decoration: none;
}
/* The link icon beside a grade. A phone has no hover, so without it the tag
   does not read as something to tap. */
a.sx-comp-tag { display: inline-flex; align-items: center; gap: 6px; }
.sx-comp-link-icon { flex: none; }
.sx-comp-card__grade { display: inline-flex; align-items: center; gap: 7px; }
/* Screen-reader text: "(opens in a new tab)". */
.sx-comp-sr {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}
/* No grade named for the component: same footprint, but grey and inert so it
   does not read as a link. */
.sx-comp-tag--none,
.sx-comp-tag--none:hover {
    color: var(--sx-muted);
    background: #F1F0EE;
}
/* The grade's family, under the tag, so the range is still visible. */
.sx-comp-family {
    display: block;
    margin-top: 5px;
    font-size: 12px;
    line-height: 1.35;
    color: var(--sx-muted);
}

.sx-comp__empty {
    padding: 44px 24px;
    text-align: center;
    color: var(--sx-steel);
    margin: 0;
}
.sx-comp__empty b { display: block; color: var(--sx-ink); font-size: 18px; margin-bottom: 6px; }

.sx-comp__foot {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    justify-content: space-between;
    padding: 14px 24px;
    border-top: 1px solid var(--sx-hairline);
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sx-muted);
}

/* --- phone card view --------------------------------------------------- */
/* Same swap as the approvals list: the five-column grid is desktop-only, and
   below 767.98px each row becomes its own datasheet card. */

.sx-comp-cards { display: none; flex-direction: column; gap: 12px; padding: 16px; }

.sx-comp-card {
    border: 1px solid var(--sx-hairline);
    border-radius: 3px;
    overflow: hidden;
}
.sx-comp-card__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
    padding: 13px 15px;
    background: #F7F5F2;
    border-bottom: 1px solid var(--sx-hairline);
}
.sx-comp-card__name { font-size: 15.5px; font-weight: 700; margin: 0; }
.sx-comp-card__area {
    font-family: var(--sx-mono);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sx-muted);
    text-align: right;
    flex: none;
    max-width: 45%;
}
.sx-comp-card__row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 11px 15px;
    border-bottom: 1px solid #EFEDE8;
}
.sx-comp-card__label {
    font-family: var(--sx-mono);
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: .13em;
    text-transform: uppercase;
    color: #8A8781;
}
.sx-comp-card__value {
    font-family: var(--sx-mono);
    font-size: 12.5px;
    color: var(--sx-ink);
    text-align: right;
}
.sx-comp-card__prod {
    display: flex;
    flex-direction: column;
    gap: 3px;
    align-items: center;
    justify-content: center;
    /* min-height, not height: the family line under the grade adds a row. */
    min-height: 44px;
    padding: 8px 12px;
    background: #FCEFE3;
    color: var(--sx-ember);
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .11em;
    text-transform: uppercase;
    text-decoration: none;
    text-align: center;
}
.sx-comp-card__prod:hover,
.sx-comp-card__prod:focus { color: var(--sx-ember); text-decoration: none; }
.sx-comp-card__family {
    font-size: 10px;
    font-weight: 500;
    letter-spacing: .06em;
    color: var(--sx-muted);
}
.sx-comp-card__prod--none { color: var(--sx-muted); background: #F1F0EE; }

/* --- wear modes band --------------------------------------------------- */

.sx-wear__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 24px;
}
.sx-wear__item { border-top: 2px solid var(--sx-saffron); padding-top: 16px; }
.sx-wear__name { font-size: 20px; margin: 0 0 8px; }
.sx-wear__desc { font-size: 15px; line-height: 1.55; color: rgba(255, 255, 255, .72); margin: 0; }

/* --- the range --------------------------------------------------------- */

.sx-ind-range__h2 { font-size: clamp(26px, 3.2vw, 40px); margin-bottom: 24px; }

.sx-ind-range__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 14px;
}
.sx-ind-range__card {
    display: block;
    position: relative;
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    padding: 22px 44px 22px 22px;
    text-decoration: none;
    color: inherit;
    transition: border-color .16s ease, transform .16s ease;
}
.sx-ind-range__card:hover,
.sx-ind-range__card:focus {
    border-color: var(--sx-saffron);
    text-decoration: none;
    color: inherit;
    transform: translateY(-2px);
}
.sx-ind-range__name { display: block; font-size: 17px; font-weight: 700; line-height: 1.25; }
.sx-ind-range__desc { display: block; margin-top: 7px; font-size: 14.5px; line-height: 1.5; color: var(--sx-steel); }
.sx-ind-range__go {
    position: absolute;
    top: 22px; right: 20px;
    color: var(--sx-ember);
    font-size: 18px;
}

/* --- closing CTA ------------------------------------------------------- */

.sx-ind-cta__grid {
    display: grid;
    grid-template-columns: 1.4fr 1fr;
    gap: clamp(24px, 4vw, 56px);
    align-items: center;
}
.sx-ind-cta__h2 { font-size: clamp(26px, 3.4vw, 44px); }
.sx-ind-cta__actions {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 12px;
}
.sx-ind-cta__actions .sx__btn {
    justify-content: center;
    max-width: 340px;
}

/* --- responsive -------------------------------------------------------- */

@media (max-width: 991.98px) {
    .sx-comp-table__row { grid-template-columns: minmax(0, 1.4fr) minmax(0, .9fr) minmax(0, 1fr) minmax(0, 1.2fr) minmax(0, 1.3fr); gap: 12px; padding-left: 18px; padding-right: 18px; }
    .sx-ind-cta__grid { grid-template-columns: 1fr; }
}

@media (max-width: 767.98px) {
    .sx-ind-head__grid { align-items: flex-start; }
    .sx-ind-head__figs { gap: 20px; }

    .sx-comp-table { display: none; }
    .sx-comp-cards { display: flex; }

    /* --- map: fit the phone instead of scrolling sideways --------------- */
    /* The 640px floor existed to keep the label chips readable, at the cost of
       a sideways scroll. Dropping it fits the drawing to the screen, but the
       labels cannot come with it: seven chips sized for ~10px text would cover
       most of a 314px-wide drawing and sit on top of each other. They are
       hidden here and the chip row below carries the area names instead — the
       drawing stays tappable and still lights up the area that is selected. */
    .sx-plantmap__stage { min-width: 0; }
    .sx-plantmap__label { display: none; }

    /* --- area chips: one scrolling row, not a stack of wrapped rows ----- */
    .sx-chips {
        flex-wrap: nowrap;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        /* the row is the scroll container, so the gutter has to come back as
           padding or the last chip sits flush against the edge */
        padding-bottom: 2px;
        margin-bottom: 16px;
    }
    .sx-chips::-webkit-scrollbar { display: none; }
    .sx-chip { flex: 0 0 auto; }

    /* --- cards: scroll the list, not the page -------------------------- */
    /* Roughly four cards at the measured ~176px pitch, but never taller than
       the screen, so the list always scrolls inside its own panel rather than
       running the page on for another eighty rows. */
    .sx-comp-cards {
        max-height: min(720px, 76vh);
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
    }
    /* The list is a flex column, so once it has a max-height every card is a
       shrinkable item and the whole set squashes to fit instead of scrolling.
       Pinning each card to its own height is what makes the container scroll. */
    .sx-comp-card { flex: 0 0 auto; }

    .sx-comp__head { flex-direction: column; align-items: stretch; }
    /* flex-basis:auto here sizes off the search input's own intrinsic
       (searchfield-decoration) content width rather than the available
       space, which pushed the field past the card's edge on phones.
       flex-basis:0 + min-width:0 fills the row instead. */
    .sx-comp__search { flex: 1 1 0; min-width: 0; }
    .sx-comp__foot { flex-direction: column; gap: 6px; }
}

@media (max-width: 479.98px) {
    .sx-ind-head__figs { grid-template-columns: 1fr 1fr; }
    .sx-ind-cta__actions .sx__btn { max-width: none; }
}

/* --- four-column variant ------------------------------------------------ */
/* Railway's published table has no wear factor at all, so that page drops the
   column rather than printing a dash on every row. */
.sx-comp-table--nowear .sx-comp-table__row { grid-template-columns: minmax(0, 1.55fr) minmax(0, 1.05fr) minmax(0, 1.1fr) minmax(0, 1.75fr); }

/* --- other industries rail --------------------------------------------- */

.sx-ind-others { padding-top: 0; }
.sx-ind-others__row { display: flex; flex-wrap: wrap; gap: 8px; }
.sx-ind-others__link {
    display: inline-block;
    font-family: var(--sx-display);
    font-size: 13.5px;
    font-weight: 600;
    color: var(--sx-steel);
    background: var(--sx-white);
    border: 1px solid var(--sx-hairline);
    border-radius: 2px;
    padding: 10px 16px;
    text-decoration: none;
    transition: border-color .16s ease, color .16s ease;
}
.sx-ind-others__link:hover,
.sx-ind-others__link:focus {
    border-color: var(--sx-saffron);
    color: var(--sx-ink);
    text-decoration: none;
}

/* Phones drop the rail entirely - the footer and the header menu already
   carry every industry link, so on a small screen it is one more scroll of
   repeated navigation between the page body and the enquiry CTA. */
@media (max-width: 767.98px) {
    .sx-ind-others { display: none; }
}

@media (max-width: 991.98px) {
    .sx-comp-table--nowear .sx-comp-table__row { grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 1.2fr) minmax(0, 1.3fr); }
}

/* --- side-by-side list + map ------------------------------------------- */
/* From 1200px the component list and the plant map sit next to each other, so
   clicking an area of the drawing filters a table the reader can already see.
   The floor is where the list column stops holding four readable columns —
   below it the two blocks stack and the table gets the full width back. These
   rules come last in the section so they win over the .sx-comp-table--nowear
   column counts declared above.

   The wrap stays at the site's 1240px so the block lines up with the header and
   the page head; that leaves the map around 570px rather than the ~1100 it had
   full-width, which is what labelFont() in industry-map.js sizes for. */
@media (min-width: 1200px) {
    .sx-ind-split {
        grid-template-columns: minmax(0, 1.05fr) minmax(0, 1.15fr);
        gap: clamp(18px, 1.8vw, 28px);
        align-items: start;
    }
    .sx-ind-split .sx-plantmap { order: 0; }

    /* The stage's 640px floor is there to stop the drawing shrinking away on a
       phone; the column is already wider than that, so the floor would only
       switch the horizontal scrollbar on for nothing. */
    .sx-ind-split .sx-plantmap__stage { min-width: 0; }
    /* The area column goes: the chips and the map beside it already say which
       area is in view, and four columns is what this width holds. */
    .sx-ind-split .sx-comp-table__cell--area { display: none; }
    .sx-ind-split .sx-comp-table__long { display: none; }
    /* Column widths are set by the two mono headings rather than the data:
       "Base metal" and "Wear factor" have to hold one line, or the head row
       goes to two and the table stops scanning. */
    .sx-ind-split .sx-comp-table__row {
        grid-template-columns: minmax(0, 1.2fr) minmax(0, .9fr) minmax(0, 1.05fr) minmax(0, 1.45fr);
        gap: 10px;
        padding: 11px 16px;
        min-height: 58px;
    }
    .sx-ind-split .sx-comp-table--nowear .sx-comp-table__row { grid-template-columns: minmax(0, 1.6fr) minmax(0, 1.05fr) minmax(0, 1.5fr); }
    .sx-ind-split .sx-comp-table__cell { font-size: 13.5px; }
    .sx-ind-split .sx-comp-tag {
        font-size: 10.5px;
        padding: 5px 8px;
        letter-spacing: .02em;
        line-height: 1.4;
    }
    .sx-ind-split .sx-comp__head,
    .sx-ind-split .sx-comp__foot { padding-left: 18px; padding-right: 18px; }

    /* The list runs far past the bottom of the map, so it scrolls inside its own
       card rather than dragging the map off screen — with the head row pinned,
       since a scrolled table with no headings is unreadable. The mono tracking
       is also what pushes "Wear factor" onto a second line at this width, so
       the head gives a little of it back. */
    .sx-ind-split .sx-comp-table { max-height: min(66vh, 620px); overflow-y: auto; }
    .sx-ind-split .sx-comp-table__row--head {
        position: sticky;
        top: 0;
        z-index: 1;
        font-size: 10.5px;
        letter-spacing: .05em;
    }
}


/* --------------------------------------------------------------------------
   23. Industries menu — desktop dropdown + phone accordion
   Both are rendered from the same `industry_menu` context, and both reuse the
   products mega's tokens: the same white panel, the same hairlines, the same
   ember-on-hover rail. What differs is the right-hand side — one sector at a
   time, with its artwork and the ranges it buys, instead of a list of links.
   -------------------------------------------------------------------------- */

/* The caret on a nav item that opens a panel. It rotates rather than swapping
   glyphs so there is no reflow when a panel opens. */
.sx-header a.sx-nav__link--menu {
    display: inline-flex;
    align-items: center;
    gap: 7px;
}
.sx-header .sx-nav__caret {
    flex: none;
    color: var(--sx-steel);
    transition: transform .18s ease, color .16s ease;
}
.sx-header a.sx-nav__link--menu:hover .sx-nav__caret { color: var(--sx-ember); }
.sx-header a.sx-nav__link--menu.is-open .sx-nav__caret {
    color: var(--sx-ember);
    transform: rotate(180deg);
}
/* The active-page bar is drawn on the link, which now includes the caret —
   pull it back under the label so it doesn't run past the word. */
.sx-header a.sx-nav__link--menu.is-active::after,
.sx-header a.sx-nav__link--menu.is-open::after { right: 19px; }

/* --- Desktop dropdown --- */

.sx-indmenu {
    max-width: var(--sx-max);
    margin: 0 auto;
    padding: 0 var(--sx-gutter);
    display: grid;
    grid-template-columns: 320px minmax(0, 1fr);
    gap: 0;
    min-height: 404px;
}

.sx-indmenu__eyebrow {
    display: block;
    font-family: var(--sx-mono);
    font-size: 10.5px;
    font-weight: 500;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--sx-muted);
    margin-bottom: 14px;
}
.sx-indmenu__eyebrow--tight { margin: 0 0 10px; }

.sx-indmenu__rail {
    border-right: 1px solid var(--sx-hairline);
    padding: 4px 26px 0 0;
}
.sx-indmenu__rail ul { list-style: none; margin: 0; padding: 0; }
.sx-indmenu__rail li { margin: 0; }

/* The rail rows carry .sx-mega__cat -- the products rail's own class -- so the
   two menus share one hover, one active state and one type treatment by
   construction rather than by two rules kept in step. .sx-indmenu__cat is left
   on them purely as a script hook. */

/* Only the active panel is a grid item, so it always lands in column two. */
.sx-indmenu__panel { display: none; }
.sx-indmenu__panel.is-active {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 300px;
    gap: 34px;
    padding-left: 34px;
    animation: sx-mega-fade .18s ease;
}

/* The sector's own full-plant render. No frame: the artwork ships on a
   transparent ground, so a border and a white panel around it only drew a box
   the picture did not need -- the render sits straight on the menu. */
.sx-indmenu__art {
    display: block;
    align-self: start;
    overflow: hidden;
}

/* Same ratio as the map column on the sector page. The renders are 3:2 (sugar
   is 4:3), so `contain` letterboxes rather than crops -- a plant drawing must
   never lose its edges. The fallback isometric SVG scales to fit the same box. */
.sx-indmenu__stage {
    display: block;
    width: 100%;
    aspect-ratio: 1080 / 710;
}
/* `height: auto` is load-bearing, not tidiness: the <img> carries width and
   height attributes for CLS, and those land as a presentational height. Without
   this the element is 1024px tall inside a 540px-wide column and the plant is
   stretched to fill it. Written on the element as well as the class so a future
   edit to .sx-indmenu__stage--photo cannot drop the guard. */
.sx-indmenu__art img,
.sx-indmenu__stage--photo {
    height: auto;
    object-fit: contain;
    object-position: center;
}
@supports not (aspect-ratio: 1 / 1) {
    .sx-indmenu__stage { height: 250px; }
}

.sx-indmenu__detail {
    display: flex;
    flex-direction: column;
    padding-top: 2px;
}
/* Same treatment as .sx-mega__panel-title, the heading in the products menu. */
.sx-indmenu__title {
    display: block;
    font-family: var(--sx-display);
    font-size: 24px;
    font-weight: 800;
    line-height: 1.15;
    letter-spacing: -.02em;
    color: var(--sx-ink);
    margin: 0 0 12px;
}
.sx-indmenu__note {
    font-size: 14.5px;
    line-height: 1.6;
    color: var(--sx-steel);
    margin: 0 0 22px;
    padding-bottom: 22px;
    border-bottom: 1px solid var(--sx-hairline);
}

.sx-indmenu__chips {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.sx-indmenu__chips li {
    margin: 0;
    padding: 6px 11px;
    border: 1px solid var(--sx-hairline);
    background: var(--sx-porcelain);
    font-size: 12.5px;
    line-height: 1.35;
    color: var(--sx-steel);
}

/* Follows the chips rather than being pushed to the foot of the column. The
   column is as tall as the nine-row rail beside it, so `margin-top: auto` left
   the link stranded a long way under the content it belongs to. */
.sx-indmenu__go {
    margin-top: 30px;
    align-self: start;
    font-family: var(--sx-mono);
    font-size: 13.5px;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sx-ink);
    text-decoration: none;
    transition: color .14s ease;
}
.sx-indmenu__go span { display: inline-block; transition: transform .16s ease; }
.sx-indmenu__go:hover { color: var(--sx-ember); text-decoration: none; }
.sx-indmenu__go:hover span { transform: translateX(4px); }

/* --- Phone / tablet accordion --- */

.sx-navsub { display: none; }

@media (max-width: 1024px) {
    /* The dropdown never opens below 1025px — the accordion replaces it. */
    .sx-mega--ind { display: none !important; }

    .sx-header a.sx-nav__link--menu {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 12px;
    }
    .sx-header a.sx-nav__link--menu.is-active::after,
    .sx-header a.sx-nav__link--menu.is-open::after { right: auto; }

    /* Products navigates through on phones rather than expanding, so it must
       not wear the caret that promises a panel. Industries does expand, and
       its caret flips to say so. */
    .sx-nav__item--has-menu .sx-nav__caret { display: none; }

    .sx-header a.sx-nav__link--menu.is-expanded { color: var(--sx-ember); }
    .sx-header a.sx-nav__link--menu.is-expanded .sx-nav__caret {
        color: var(--sx-ember);
        transform: rotate(180deg);
    }

    .sx-navsub {
        display: block;
        list-style: none;
        margin: 0;
        padding: 0 0 8px;
        background: var(--sx-porcelain);
        border-top: 1px solid var(--sx-hairline);
    }
    .sx-navsub[hidden] { display: none; }
    .sx-navsub li { margin: 0; }

    .sx-navsub__link {
        display: flex;
        align-items: center;
        gap: 14px;
        /* The counter used to sit in this space and set the sub-items in from
           the top-level links; the extra left padding keeps that step now the
           number is gone. */
        padding: 13px var(--sx-gutter) 13px calc(var(--sx-gutter) + 14px);
        font-family: var(--sx-display);
        font-size: 14.5px;
        font-weight: 600;
        letter-spacing: .02em;
        text-transform: uppercase;
        color: var(--sx-ink);
        text-decoration: none;
        border-bottom: 1px solid var(--sx-hairline);
    }
    .sx-navsub li:last-child .sx-navsub__link { border-bottom: 0; }
    .sx-navsub__link:hover,
    .sx-navsub__link:focus { color: var(--sx-ember); text-decoration: none; }

    .sx-navsub__name { flex: 1; min-width: 0; }
    .sx-navsub__go { flex: none; color: var(--sx-saffron); }
}


/* Sector cards carry no description, so the padding and gaps that suit a
   product card (which has three or four lines of text between the photo and
   the link) leave the tile looking half-empty. Tightened here rather than on
   .sx-card, so the product grid further up the page keeps the spacing it was
   built to. */
#industries .sx-card { padding: 22px 22px 24px; }
#industries .sx-card__title { margin: 10px 0 0; }
#industries .sx-card__media { margin: 14px 0 0; }
#industries .sx-card__link { padding-top: 14px; }

@media (max-width: 560px) {
    #industries .sx-card { padding: 14px 12px 14px; }
    #industries .sx-card__media { margin: 0 0 6px; }
    #industries .sx-card__link { padding-top: 8px; }
}


/* --------------------------------------------------------------------------
   24. Blog listing — footer pinned to the card's foot
   The cards in a row already stretch to the tallest one (the <ul> is a wrapping
   flex row), but the link inside was display:block, so the date and "Read more"
   sat straight under each excerpt and floated at a different height on every
   card. Each level down to .desc now fills the card as a flex column, and the
   excerpt takes up the slack — growing .short-desc rather than giving the
   footer margin-top:auto, because the footer's gap comes from Bootstrap's
   .mt-4, which is !important and would override it.
   -------------------------------------------------------------------------- */
.blog-list ul li { display: flex; }
.blog-list ul li a {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-width: 0;
}
.blog-list ul li .desc {
    display: flex;
    flex-direction: column;
    flex: 1;
}
.blog-list ul li .short-desc { flex: 1 0 auto; }


/* --------------------------------------------------------------------------
   25. Blog post — cover image on phones
   responsive.css hides `.blog .blog-detail .image` under 767px (a legacy rule
   with no recorded reason), directly after the rule that stacks it full width,
   so phone readers never saw the post's cover image. Shown again here, full
   width above the text; style.css's desktop margin (0 20px 15px 0, meant for
   the floated half-width image) is reset, since .content already carries its
   own 20px margin-top on phones.
   -------------------------------------------------------------------------- */
@media (max-width: 767px) {
    .blog .blog-detail .image {
        display: block;
        margin: 0;
    }
}

/* --------------------------------------------------------------------------
   Product Finder - right-edge launcher and slide-in drawer

   Replaces the old Quick Enquiry footer form. Type, colour and spacing come
   from the approved design (superon-design nodes BCRrR / C7HKIo), re-flowed
   for a 520px panel instead of a 1240px band.

   Everything here is prefixed .sx-finder and lives outside .sx, because the
   drawer is site-wide and must work on base.html pages that never enter the
   .sx scope.
   -------------------------------------------------------------------------- */

/* Bottom right, which is exactly where the retired Quick Enquiry tab sat, so
   the affordance stays where returning visitors already look for it. It also
   keeps clear of .fixed-buttons - the call/WhatsApp/email rail is fixed and
   vertically centred on the same edge, so a centred tab would sit on top of
   it at every viewport height. */
.sx-finder-launcher {
    position: fixed;
    right: 0;
    bottom: 0;
    z-index: 1040;

    display: flex;
    align-items: center;
    gap: 11px;
    padding: 14px 22px;
    border: 0;
    border-radius: 10px 0 0 0;
    background: var(--sx-saffron);
    color: var(--sx-ink);
    cursor: pointer;
    box-shadow: 0 8px 26px rgba(20, 22, 26, .2);
    transition: background var(--sx-stick-t), opacity var(--sx-stick-t);
}

.sx-finder-launcher:hover,
.sx-finder-launcher:focus-visible { background: var(--sx-saffron-molten); }

.sx-finder-launcher:focus-visible {
    outline: 2px solid var(--sx-ink);
    outline-offset: 3px;
}

.sx-finder-launcher__label {
    font-family: var(--sx-mono);
    font-size: 14.5px;
    font-weight: 700;
    letter-spacing: .111em;
    line-height: 1.27;
    text-transform: uppercase;
    white-space: nowrap;
}

/* Sized here rather than on the SVG attributes, so the phone pill can step it
   down with the label. */
.sx-finder-launcher__i {
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
    color: currentColor;
}

/* Hidden while the panel is open so it cannot be tabbed to behind the scrim. */
.sx-finder-launcher[aria-expanded="true"] {
    opacity: 0;
    pointer-events: none;
}

.sx-finder-scrim {
    position: fixed;
    inset: 0;
    z-index: 1050;
    background: rgba(20, 22, 26, .46);
    opacity: 0;
    transition: opacity .42s cubic-bezier(.4, 0, .2, 1);
}

.sx-finder-scrim.is-open { opacity: 1; }

.sx-finder-panel {
    position: fixed;
    top: 0;
    right: 0;
    z-index: 1060;

    width: min(520px, 100%);
    height: 100%;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;

    background: var(--sx-porcelain);
    border-left: 1px solid var(--sx-hairline);
    box-shadow: -18px 0 50px rgba(20, 22, 26, .18);

    /* Parked off the right edge; .is-open slides it in right-to-left. */
    transform: translateX(100%);
    visibility: hidden;
    transition: transform .42s cubic-bezier(.4, 0, .2, 1),
                visibility 0s linear .42s;
}

.sx-finder-panel.is-open {
    transform: translateX(0);
    visibility: visible;
    transition: transform .42s cubic-bezier(.4, 0, .2, 1),
                visibility 0s linear 0s;
}

@media (prefers-reduced-motion: reduce) {
    .sx-finder-panel,
    .sx-finder-scrim { transition-duration: .01ms; }
}

.sx-finder-panel__body {
    font-family: var(--sx-display);
    padding: 34px 40px 48px;
}

.sx-finder-close {
    position: sticky;
    top: 0;
    z-index: 1;
    float: right;

    display: flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    margin: 18px 18px 0 0;
    padding: 0;

    border: 0.8px solid var(--sx-hairline);
    border-radius: 19px;
    background: var(--sx-white);
    color: var(--sx-ink);
    cursor: pointer;
    transition: border-color var(--sx-stick-t), color var(--sx-stick-t);
}

.sx-finder-close:hover {
    border-color: var(--sx-ember);
    color: var(--sx-ember);
}

.sx-finder-close:focus-visible {
    outline: 2px solid var(--sx-ember);
    outline-offset: 2px;
}

/* ---- Heading block ---- */

.sx-finder__eyebrow {
    margin: 0 0 13px;
    font-family: var(--sx-mono);
    font-size: 11.5px;
    font-weight: 600;
    letter-spacing: .16em;
    line-height: 1.4;
    text-transform: uppercase;
    color: var(--sx-ember);
}

.sx-finder__headline {
    margin: 0 0 13px;
    font-family: var(--sx-display);
    font-size: clamp(28px, 5.4vw, 34px);
    font-weight: 800;
    letter-spacing: -0.026em;
    line-height: 1.06;
    color: var(--sx-ink);
}

.sx-finder__subhead {
    margin: 0 0 30px;
    font-size: 16px;
    line-height: 1.5;
    color: var(--sx-steel);
}

/* ---- Search field ---- */

.sx-finder__search {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 8px 8px 20px;
    background: var(--sx-white);
    border: 0.8px solid var(--sx-hairline);
    border-radius: 12px;
    transition: border-color var(--sx-stick-t);
}

.sx-finder__search:focus-within { border-color: var(--sx-ember); }

/* Screen-reader only: the placeholder is not the accessible label. */
.sx-finder__search-label {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}

.sx-finder__search-icon {
    flex: 0 0 auto;
    color: #9AA0A8;
}

.sx-finder__input {
    flex: 1 1 auto;
    min-width: 0;
    height: 46px;
    padding: 0;
    border: 0;
    background: none;
    font-family: var(--sx-display);
    font-size: 16px; /* below 16px, iOS zooms in on focus */
    color: var(--sx-ink);
}

/* The full placeholder from the design is far too long for a 520px panel,
   so it is trimmed with an ellipsis rather than wrapped. */
.sx-finder__input::placeholder {
    color: var(--sx-steel);
    text-overflow: ellipsis;
}

.sx-finder__input:focus { outline: none; }

.sx-finder__submit {
    flex: 0 0 auto;
    height: 46px;
    padding: 0 26px;
    border: 0;
    border-radius: 23px;
    background: var(--sx-saffron);
    color: var(--sx-ink);
    font-family: var(--sx-mono);
    font-size: 12.5px;
    font-weight: 600;
    letter-spacing: .13em;
    text-transform: uppercase;
    cursor: pointer;
    transition: background var(--sx-stick-t);
}

.sx-finder__submit:hover { background: var(--sx-saffron-molten); }

.sx-finder__submit:focus-visible {
    outline: 2px solid var(--sx-ink);
    outline-offset: 2px;
}

/* ---- Lanes ---- */

/* The design lays these out as four cards across 1240px, each showing its
   options at rest. A 520px panel has no room for that, so a lane collapses to
   its heading and expands in place. Colours follow the design, mapped onto the
   brand tokens where the intent is the same (its #b35c00 is --sx-ember, its
   #0B1220 is --sx-ink). */
.sx-finder__lanes {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: 18px;
}

.sx-finder-lane {
    background: var(--sx-white);
    border: 0.8px solid var(--sx-hairline);
    border-radius: 12px;
    overflow: hidden;
}

.sx-finder-lane__h {
    margin: 0;
    font-size: inherit;
    font-weight: inherit;
}

.sx-finder-lane__toggle {
    display: flex;
    align-items: center;
    gap: 14px;
    width: 100%;
    padding: 16px 18px;
    border: 0;
    background: none;
    text-align: left;
    cursor: pointer;
    transition: background var(--sx-stick-t);
}

.sx-finder-lane__toggle:hover { background: #FCFBF8; }

.sx-finder-lane__toggle:focus-visible {
    outline: 2px solid var(--sx-ember);
    outline-offset: -2px;
}

.sx-finder-lane__i {
    flex: 0 0 auto;
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .13em;
    color: var(--sx-ember);
}

.sx-finder-lane__text {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
    flex: 1 1 auto;
}

/* Set in caps, like the entry labels in superon-design node BCRrR. Caps need
   tracking opened up rather than the tightening a mixed-case headline wants. */
.sx-finder-lane__title {
    font-family: var(--sx-display);
    font-size: 14px;
    font-weight: 700;
    letter-spacing: .07em;
    line-height: 1.3;
    text-transform: uppercase;
    color: var(--sx-ink);
}

.sx-finder-lane__note {
    font-family: var(--sx-display);
    font-size: 12.5px;
    line-height: 1.45;
    color: var(--sx-muted);
}

.sx-finder-lane__caret {
    flex: 0 0 auto;
    color: #B8BCC2;
    transition: transform var(--sx-stick-t), color var(--sx-stick-t);
}

.sx-finder-lane__toggle[aria-expanded="true"] .sx-finder-lane__caret {
    transform: rotate(180deg);
    color: var(--sx-ember);
}

.sx-finder-lane__panel {
    padding: 0 18px 16px;
    border-top: 0.8px solid #EFEEE9;
}

/* A lane opens on four rows. "All grades" then reveals the rest, and this cap
   stops the box growing past eight - a lane carries nearly forty grades, and
   an uncapped list pushes the helper strip, and in the sheet the rest of the
   panel, out of reach. Four rows sit well under the cap, so nothing scrolls
   until the rest is revealed. --sx-opt-h is the measured row height for the
   current context; the compact variant overrides it. */
.sx-finder-opts {
    --sx-opt-h: 40px;

    margin: 0;
    padding: 0;
    list-style: none;
    max-height: calc(var(--sx-opt-h) * 8);
    overflow-y: auto;
    overscroll-behavior: contain;
}

/* A slim scrollbar, so the list does not gain a heavy grey gutter. */
.sx-finder-opts::-webkit-scrollbar { width: 6px; }

.sx-finder-opts::-webkit-scrollbar-track { background: transparent; }

.sx-finder-opts::-webkit-scrollbar-thumb {
    background: #D8D5CD;
    border-radius: 3px;
}

.sx-finder-opts::-webkit-scrollbar-thumb:hover { background: #BFBCB3; }

.sx-finder-opts {
    scrollbar-width: thin;
    scrollbar-color: #D8D5CD transparent;
}

/* A hairline between rows, not around them - the row is a line in a list,
   which is how the design draws it. */
.sx-finder-opts li + li .sx-finder-opt { border-top: 0.8px solid #EFEEE9; }

.sx-finder-opt {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 11px 2px;

    font-family: var(--sx-display);
    font-size: 13.5px;
    font-weight: 500;
    line-height: 1.3;
    color: var(--sx-ink);
    text-decoration: none;
    transition: color var(--sx-stick-t), padding-left var(--sx-stick-t);
}

.sx-finder-opt svg {
    flex: 0 0 auto;
    color: #B8BCC2;
    transition: color var(--sx-stick-t), transform var(--sx-stick-t);
}

.sx-finder-opt:hover {
    color: var(--sx-ember);
    padding-left: 5px;
    text-decoration: none;
}

.sx-finder-opt:hover svg {
    color: var(--sx-ember);
    transform: translateX(2px);
}

.sx-finder-opt:focus-visible {
    outline: 2px solid var(--sx-ember);
    outline-offset: -2px;
}

/* Process names are acronyms - SMAW, GTAW, GMAW, FCAW - so the whole lane is
   set in caps rather than leaving "SMAW - stick" half-shouting. Caps want the
   tracking opened a little. The other lanes stay as they are: grades are
   numbers, and base metals and sectors read as names. */
.sx-finder-lane--process .sx-finder-opt {
    text-transform: uppercase;
    letter-spacing: .04em;
}

/* Only the acronym options are set in caps - SMAW, GTAW, GMAW, FCAW - and
   their label is already written that way, so nothing is up-cased here. Caps
   want the tracking opened a little. Process names that are ordinary words,
   like Brazing and Cutting & Gouging, read as names and are left alone, as
   are the other lanes: grades are numbers, base metals and sectors are names. */
.sx-finder-opt--caps {
    letter-spacing: .04em;
}

/* Lane footer: "All grades", "All processes" and so on. A button when it
   reveals the rest of the lane, a link when it leaves the panel - both read
   the same. */
.sx-finder-lane__all {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 14px;
    padding: 0;
    border: 0;
    background: none;

    font-family: var(--sx-mono);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--sx-ember);
    text-decoration: none;
    cursor: pointer;
}

.sx-finder-lane__all:hover {
    color: var(--sx-ember);
    text-decoration: underline;
}

.sx-finder-lane__all:focus-visible {
    outline: 2px solid var(--sx-ember);
    outline-offset: 3px;
}

.sx-finder-lane__all svg { transition: transform var(--sx-stick-t); }

.sx-finder-lane__all.is-open svg { transform: rotate(90deg); }

.sx-finder-lane__count {
    font-weight: 400;
    letter-spacing: .08em;
    color: var(--sx-muted);
}

/* ---- Helper strip ---- */

.sx-finder__helper {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    margin-top: 26px;
    padding: 18px 22px;

    background: #F4F1EA;
    border: 0.8px solid var(--sx-hairline);
    border-radius: 10px;
}

.sx-finder__helper-text {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.sx-finder__helper-1 {
    font-size: 15px;
    font-weight: 600;
    line-height: 1.35;
    color: var(--sx-ink);
}

.sx-finder__helper-2 {
    font-size: 14.5px;
    line-height: 1.4;
    color: var(--sx-steel);
}

.sx-finder__helper-cta {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    font-family: var(--sx-mono);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: .13em;
    text-transform: uppercase;
    color: var(--sx-ember);
    text-decoration: none;
}

.sx-finder__helper-cta:hover {
    color: var(--sx-ember);
    text-decoration: underline;
}

.sx-finder__helper-cta:focus-visible {
    outline: 2px solid var(--sx-ember);
    outline-offset: 3px;
}

/* ---- Narrow viewports ---- */

/* On phones the tab lifts off the very corner into a floating pill, clear of
   the home indicator, and the label loses a step of tracking so it still fits
   on one line at 360px. */
@media (max-width: 767px) {
    .sx-finder-launcher {
        bottom: calc(14px + env(safe-area-inset-bottom, 0px));
        right: 12px;
        padding: 12px 18px;
        border-radius: 26px;
    }

    .sx-finder-launcher__label {
        font-size: 11px;
        letter-spacing: .1em;
    }

    .sx-finder-launcher__i {
        width: 13px;
        height: 13px;
    }

    /* Everything from here down is tightened so all four lanes clear the first
       fold on a 360-430px screen. The panel is the whole viewport on a phone,
       and a visitor who has to scroll before seeing the fourth way in has been
       shown three ways in. */
    .sx-finder-panel__body { padding: 18px 18px 36px; }

    .sx-finder-close { margin: 12px 12px 0 0; }

    .sx-finder__eyebrow { margin-bottom: 8px; }

    .sx-finder__headline {
        margin-bottom: 8px;
        font-size: 23px;
        letter-spacing: -0.022em;
    }

    .sx-finder__subhead {
        margin-bottom: 14px;
        font-size: 13.5px;
        line-height: 1.4;
    }

    /* One row, as on desktop. Wrapping the button onto a row of its own cost
       about fifty pixels, which is most of a lane. */
    .sx-finder__search {
        gap: 8px;
        padding: 5px 5px 5px 14px;
    }

    .sx-finder__input {
        flex: 1 1 auto;
        height: 40px;
        padding: 0 2px;
        /* 16px is the floor: iOS Safari zooms the page into any focused
           field whose text is smaller, and the zoom sticks after blur. */
        font-size: 16px;
    }

    .sx-finder__submit {
        height: 40px;
        padding: 0 16px;
        border-radius: 20px;
        font-size: 11px;
        letter-spacing: .1em;
    }

    .sx-finder__lanes {
        gap: 8px;
        margin-top: 12px;
    }

    /* Still a 48px-plus tap target once the two lines of text are counted. */
    .sx-finder-lane__toggle {
        gap: 11px;
        padding: 11px 14px;
    }

    .sx-finder-lane__title { font-size: 13px; }

    .sx-finder-lane__note {
        font-size: 11.5px;
        line-height: 1.35;
    }

    .sx-finder-lane__panel { padding: 0 14px 12px; }

    .sx-finder-opt { padding: 9px 2px; font-size: 13px; }

    .sx-finder-opts { --sx-opt-h: 35px; }

    .sx-finder__helper {
        flex-direction: column;
        align-items: flex-start;
        gap: 10px;
        margin-top: 16px;
        padding: 14px 16px;
    }
}

/* The panel goes full-bleed on small phones. */
@media (max-width: 420px) {
    .sx-finder-panel { width: 100%; }
}

/* Body scroll lock while the drawer is open. */
body.sx-finder-open { overflow: hidden; }

/* --------------------------------------------------------------------------
   Quick Enquiry - opened from the right rail

   The form itself is unchanged: same markup, same fields, same POST to
   user_query. What changed is how it is reached. It used to sit at the bottom
   right as a permanently visible "Quick Enquiry" bar; now it is closed until
   the rail button below the mail icon is pressed, which keeps the bottom right
   free for the Product Finder launcher.
   -------------------------------------------------------------------------- */

/* A button, not an anchor, so none of the a:last-of-type / :nth rules that
   style.css hangs off .fixed-buttons a shift by one. These values mirror
   .fixed-buttons a exactly. */
.sx-qe-btn {
    display: block;
    width: 100%;
    padding: 6px;
    margin: 5px 0;
    border: 1px solid var(--sx-saffron);
    border-radius: 50%;
    background-color: #fff;
    cursor: pointer;
    transition: background-color var(--sx-stick-t);
}

/* style.css gives the rail a fixed 200px height with flex-wrap, and each
   button width:100% of a 48px column but only ~38px of height. With the Quick
   Enquiry button added the stack outgrew 200px, so the last button wrapped
   into a second, half-hidden column, and every button drew as an oval.
   Let the rail size to its content, keep it vertically centred, and give each
   button a fixed square box so border-radius yields a true circle. */
.fixed-buttons {
    top: 50%;
    bottom: auto;
    height: auto;
    max-width: none;
    flex-wrap: nowrap;
    align-items: center;
    transform: translateY(-50%);
}

.fixed-buttons > a,
.fixed-buttons > .sx-qe-btn {
    width: 40px;
    height: 40px;
    padding: 0;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
}

.fixed-buttons > a { display: flex; }
.fixed-buttons > a:last-of-type { display: none; }
.fixed-buttons.show-inquiry-btn > a:last-of-type { display: flex; }
.fixed-buttons > .sx-qe-btn { display: flex; }

.sx-qe-btn:hover { background-color: #FFF4E8; }

.sx-qe-btn:focus-visible {
    outline: 2px solid var(--sx-ember);
    outline-offset: 2px;
}

.sx-qe-btn svg { display: block; }

.sx-qe-btn__sr {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}

/* Closed until the rail button opens it. The panel keeps its own bottom-right
   position from style.css; only its visibility is ours. */
.footer-form { display: none; }

.footer-form.is-open { display: block; }

/* style.css collapses #quickcontact on desktop because the old heading was a
   two-step toggle. The rail button is a single step, so an open panel shows
   its fields straight away. */
.footer-form.is-open #quickcontact { display: block; }

/* Both live in the bottom right corner, so only one of them is there at a
   time: the open panel would otherwise have its Submit button sitting under
   the Product Finder tab. This mirrors what the finder does with its own
   launcher while its drawer is open. */
body.sx-qe-open .sx-finder-launcher {
    opacity: 0;
    pointer-events: none;
}

/* The heading stays the panel's own close control, as it always was. */
.footer-form-inner h2 { cursor: pointer; }

/* --------------------------------------------------------------------------
   Search type-ahead

   The dropdown under any data-sx-suggest field. It hangs off the search form
   itself, so it lines up with the field wherever that field is.
   -------------------------------------------------------------------------- */

.sx-suggest-host { position: relative; }

.sx-suggest {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    z-index: 20;

    max-height: min(420px, 60vh);
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: 6px 0;

    background: var(--sx-white);
    border: 0.8px solid var(--sx-hairline);
    border-radius: 12px;
    box-shadow: 0 16px 40px rgba(20, 22, 26, .14);

    font-family: var(--sx-display);
    text-align: left;
}

.sx-suggest__group {
    padding: 10px 16px 4px;
    font-family: var(--sx-mono);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--sx-muted);
}

.sx-suggest__opt {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 8px 16px;
    color: var(--sx-ink);
    text-decoration: none;
}

.sx-suggest__opt:hover,
.sx-suggest__opt.is-active {
    background: #FFF4E8;
    color: var(--sx-ink);
    text-decoration: none;
}

.sx-suggest__text {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.sx-suggest__name {
    overflow: hidden;
    font-size: 14px;
    font-weight: 500;
    line-height: 1.3;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Where the row sits: the family for a product, the parent for a category. */
.sx-suggest__ctx {
    overflow: hidden;
    margin-top: 1px;
    font-size: 11.5px;
    line-height: 1.3;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--sx-muted);
}

.sx-suggest__hit {
    padding: 0;
    background: none;
    color: var(--sx-ember);
    font-weight: 700;
}

.sx-suggest__type {
    flex: 0 0 auto;
    padding: 3px 7px;
    border-radius: 4px;
    font-family: var(--sx-mono);
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
}

.sx-suggest__type--cat {
    background: var(--sx-ink);
    color: var(--sx-white);
}

.sx-suggest__type--prod {
    background: #F4F1EA;
    color: var(--sx-steel);
}

.sx-suggest__all {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-top: 6px;
    padding: 11px 16px 7px;
    border-top: 0.8px solid #EFEEE9;

    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .08em;
    color: var(--sx-ember);
    text-decoration: none;
}

.sx-suggest__all:hover,
.sx-suggest__all.is-active {
    background: #FFF4E8;
    color: var(--sx-ember);
    text-decoration: none;
}

.sx-suggest__empty {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 12px 16px;
}

.sx-suggest__empty-1 {
    font-size: 13.5px;
    color: var(--sx-steel);
}

.sx-suggest__empty-cta {
    font-family: var(--sx-mono);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sx-ember);
    text-decoration: none;
}

.sx-suggest__empty-cta:hover {
    color: var(--sx-ember);
    text-decoration: underline;
}

@media (max-width: 767px) {
    .sx-suggest { max-height: min(360px, 55vh); }

    .sx-suggest__opt { padding: 9px 14px; }

    .sx-suggest__name { font-size: 13.5px; }
}

/* ---- Search results page ---- */

/* The results page reuses the finder's search field. It sits on the dark
   banner, so it gets a fixed width and some air above. */
.sx-search-page__form {
    max-width: 620px;
    margin: 22px auto 0;
}

.sx-search-page__count {
    margin: 12px 0 0;
    font-family: var(--sx-mono);
    font-size: 11px;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: #B8BCC2;
}

.sx-search-page__empty {
    max-width: 560px;
    margin: 20px auto 40px;
    padding: 24px 26px;
    background: #F4F1EA;
    border: 0.8px solid var(--sx-hairline);
    border-radius: 12px;
    text-align: left;
}

.sx-search-page__empty-1 {
    margin: 0 0 8px;
    font-size: 17px;
    font-weight: 600;
    color: var(--sx-ink);
}

.sx-search-page__empty-2 {
    margin: 0 0 14px;
    font-size: 14.5px;
    line-height: 1.55;
    color: var(--sx-steel);
}

.sx-search-page__empty-cta {
    font-family: var(--sx-mono);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--sx-ember);
    text-decoration: none;
}

.sx-search-page__empty-cta:hover {
    color: var(--sx-ember);
    text-decoration: underline;
}

/* ---- Quick Enquiry on phones ---- */

/* On a phone the 280px corner panel sat over the hero and cut its headline
   in half, with a Submit button too small to hit. Below 768px it becomes the
   same full-screen sheet as the Product Finder drawer: it slides in from the
   right, keeps its title bar pinned while the form scrolls, and gives every
   field and the button full width.

   Visibility and transform drive it, not display, so it animates both in and
   out - display cannot be transitioned. */
@media (max-width: 767px) {
    .footer-form {
        display: block;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        z-index: 1060;
        width: 100%;
        height: 100%;

        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        overscroll-behavior: contain;

        background: var(--sx-porcelain);
        border-radius: 0;

        visibility: hidden;
        transform: translateX(100%);
        transition: transform .42s cubic-bezier(.4, 0, .2, 1),
                    visibility 0s linear .42s;
    }

    .footer-form.is-open {
        visibility: visible;
        transform: translateX(0);
        transition: transform .42s cubic-bezier(.4, 0, .2, 1),
                    visibility 0s linear 0s;
    }

    @media (prefers-reduced-motion: reduce) {
        .footer-form { transition-duration: .01ms; }
    }

    body.sx-qe-open { overflow: hidden; }

    .footer-form-inner {
        border: 0;
        border-radius: 0;
        background: transparent;
    }

    /* The orange bar becomes a pinned title with a close control, matching
       the finder's heading. The heading was already the panel's close
       target, so the whole row still closes it. */
    .footer-form-inner h2 {
        position: sticky;
        top: 0;
        z-index: 2;

        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 12px;
        margin: 0;
        padding: 16px 18px 14px;

        background: var(--sx-porcelain);
        border-bottom: 1px solid var(--sx-hairline);

        font-family: var(--sx-display);
        font-size: 23px;
        font-weight: 800;
        letter-spacing: -0.022em;
        line-height: 1.1;
        color: var(--sx-ink);
    }

    /* style.css pins the chevron with .footer-form-inner .fa.fa-angle-up, so
       this needs to out-rank that to hide it. */
    .footer-form-inner h2 .fa.fa-angle-up { display: none; }

    .footer-form-inner h2::after {
        content: "";
        flex: 0 0 auto;
        width: 38px;
        height: 38px;
        border: 0.8px solid var(--sx-hairline);
        border-radius: 19px;
        background: var(--sx-white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M18 6 6 18M6 6l12 12' stroke='%2314161A' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") center / 18px no-repeat;
    }

    #quickcontact {
        padding: 18px 18px 36px;
    }

    #quickcontact .form-group { margin-bottom: 12px; }

    /* 16px stops iOS zooming the page when a field takes focus. */
    #quickcontact .common-input,
    #quickcontact .form-control {
        height: 46px;
        padding: 0 14px;
        border: 0.8px solid var(--sx-hairline);
        border-radius: 10px;
        background: var(--sx-white);
        font-family: var(--sx-display);
        font-size: 16px;
        color: var(--sx-ink);
    }

    /* Muted, so an empty field never reads as one already filled in. */
    #quickcontact .common-input::placeholder,
    #quickcontact .form-control::placeholder {
        color: #8A9099;
        opacity: 1;
    }

    #quickcontact textarea.common-input {
        height: auto;
        min-height: 110px;
        padding: 12px 14px;
    }

    #quickcontact .common-input:focus,
    #quickcontact .form-control:focus {
        border-color: var(--sx-ember);
        box-shadow: none;
        outline: none;
    }

    #quickcontact .select2-container .select2-selection--single {
        height: 46px;
        border: 0.8px solid var(--sx-hairline);
        border-radius: 10px;
        background: var(--sx-white);
    }

    #quickcontact .select2-container .select2-selection--single .select2-selection__rendered {
        padding-left: 14px;
        line-height: 44px;
        font-size: 16px;
        color: var(--sx-ink);
    }

    #quickcontact .select2-container .select2-selection--single .select2-selection__arrow {
        height: 44px;
        right: 8px;
    }

    .quick-submit { margin-top: 18px; }

    .quick-submit .career-submit.career_btn {
        display: block;
        width: 100%;
        height: 48px;
        margin: 0;
        padding: 0;
        border: 0;
        border-radius: 24px;
        background: var(--sx-saffron);
        color: var(--sx-ink);
        font-family: var(--sx-mono);
        font-size: 12.5px;
        font-weight: 600;
        letter-spacing: .13em;
        text-transform: uppercase;
    }

    .quick-submit .career-submit.career_btn:hover,
    .quick-submit .career-submit.career_btn:focus {
        background: var(--sx-saffron-molten);
        color: var(--sx-ink);
    }

    /* select2 appends its option list to <body> at z-index 1051, which would
       open underneath this 1060 sheet and look like the dropdown is broken. */
    body.sx-qe-open .select2-container--open,
    body.sx-qe-open .select2-dropdown {
        z-index: 1090;
    }
}
