/* ============================================================================
   an-chrome.css — the single source of truth for shared chrome.
   Added 27 Aug 2026.

   WHY THIS FILE EXISTS
   The 69 pages carried EIGHT different CSS profiles. index.html does not load
   an-town.css at all — it has 54KB of inline CSS instead; the town pages load
   an-town.css with 959 bytes inline; the content pages load it with 12-13KB
   inline; the legal pages load neither. The footer and cookie-banner MARKUP is
   byte-identical on all 69 pages, so every visible difference between them came
   from which stylesheet happened to win. That is why the footers, banners and
   heroes all looked slightly different.

   This file loads LAST on every page, so the chrome resolves identically
   everywhere regardless of what each page loaded before it.

   Every colour below is measured, not chosen by eye. Contrast ratios are
   stated against the ground the text actually sits on.
   ========================================================================= */

/* ---------------------------------------------------------------------------
   1. PALETTE — one definition, reachable from every page
   ------------------------------------------------------------------------ */
:root{
  --zn-paper:#FAF6EE;
  --zn-band:#F3E7D2;
  --zn-card:#FFFFFF;
  --zn-ink:#3E2246;
  --zn-body:#4A3358;
  --zn-mute:#6B5477;
  --zn-link:#A83A2A;          /* 5.90:1 on paper, 5.20 on band, 6.36 on card */
  --zn-gold:#FFC533;          /* 10.2:1 on plum — a DARK-ground colour only  */
  --zn-gold-lt:#FFD873;       /* 11.8:1 on plum                              */
  --zn-gold-dk:#93721D;       /* 4.50:1 on white — gold for LIGHT grounds    */
  --zn-plum:#3E2246;
  --zn-plum-deep:#231A44;
  --zn-footer:#1E2126;
  --zn-line:rgba(62,34,70,.16);
}

/* ---------------------------------------------------------------------------
   2. LINK COLOUR BY GROUND
   Gold on paper measures 1.47:1 and light gold 1.27:1 — neither is a colour,
   both are a rumour. On the plum grounds the reverse is true: the ember link
   drops to 2.08:1. So the rule is decided by the ground, not by the component.
   ------------------------------------------------------------------------ */

/* light grounds -> ember.
   !important is needed because one of these links carries an inline
   style="color:var(--acc)" on the homepage, and inline beats any selector.

   Buttons are excluded. They are gold or plum PILLS, not body links — an
   earlier version of this rule repainted "Get a Solar Quote" ember on its
   own gold pill, which measured 3.40:1. */
.article a:not([class*="btn"]):not([class*="cta"]):not(.start-btn):not(.service-more),
.art-lead a:not([class*="btn"]):not([class*="cta"]),
.legal-doc a:not([class*="btn"]):not([class*="cta"]),
.section-inner > p a:not([class*="btn"]):not([class*="cta"]),
.art-block a:not([class*="btn"]):not([class*="cta"]):not(.service-more),
.fit a:not([class*="btn"]):not([class*="cta"]),
.srow a:not([class*="btn"]):not([class*="cta"]),
.step a:not([class*="btn"]):not([class*="cta"]),
.faq-wrap a:not([class*="btn"]):not([class*="cta"]),
.guide-lede a:not([class*="btn"]):not([class*="cta"]),
p.ctaline a:not([class*="btn"]):not([class*="cta"]),
.legal-toc a{
  color:var(--zn-link) !important;
}

/* ---------------------------------------------------------------------------
   3. LEFTOVER DARK-THEME GREYS
   #D7D3CB, #C6C2BA and #E8DCEC were body colours when the site was dark. On
   the paper ground they measure 1.38, 1.65 and 1.23 to one. They survived the
   light conversion on the guide lede, the closing ctaline and the stat band
   captions. --zn-body is 10.22:1 on the same ground.
   ------------------------------------------------------------------------ */
.guide-lede, p.ctaline,
.article p, .article li,
.section-inner > p:not(.section-subtitle):not(.land-eyebrow):not(.land-note){
  color:var(--zn-body) !important;
}

/* The greys above are not stray values — they are still DEFINED as variables
   in the page-level inline CSS and used by about twenty-five selectors:

     --tint   #D7D3CB   index, solar-battery-guide
     --mist   #E8DCEC   terms, privacy-policy
     --cold-t #D7D3CB   index, solar-battery-guide
     --grid   #A5A199   index, solar-battery-guide

   On the homepage they are correct: every one of those selectors sits on the
   configurator's plum panel. On the guide and the legal pages the same
   variables land on paper, at 1.23-1.65:1. Only the light-ground uses are
   corrected here — redefining the variables globally would break the dark
   panels that rely on them. */
.guide-toc a{color:var(--zn-link) !important;}
.guide-toc{--tint:var(--zn-body);}
body.legal .callout,
body.legal .callout p,
body.legal table.cookies th,
body.legal table.cookies td,
body.legal .doc p,
body.legal .doc ul,
body.legal .doc li{color:var(--zn-body) !important;}
/* but never repaint text that is sitting on one of the dark bands.
   Scoped to the band's OWN paragraphs — an earlier version used a descendant
   selector, which reached inside the white cards standing on those bands and
   made the Nord Group card copy inherit the band's light text onto white. */
footer .guide-lede, footer p.ctaline,
.cta-panel > p, .chero > p, .chero-in > p, .lc-hero > p,
section[style*="#1B1E22"] > .section-inner > p,
section[style*="#231A44"] > .section-inner > p{
  color:inherit;
}

/* cards keep their own ink wherever they stand */
.gw .gw-body p,.gw .gw-body,
.art-block p,.art-block li,
.fit p,.srow p,.step p,.service-card p,.why-item p,.num-card p,
.contact-block p{color:var(--zn-body) !important;}
.gw h3,.art-block h2,.art-block h3,.fit b,.srow h3,.step b,
.service-card h3,.why-item b,.num-card b,.contact-block h4{color:var(--zn-ink) !important;}
/* except the one card that is deliberately dark */
.gw--field .gw-body p,.gw--field .gw-body{color:#C7D9F0 !important;}
.gw--field h3,.gw--field .gw-fb{color:#fff !important;}

/* ---------------------------------------------------------------------------
   4. FOOTER — layout only. The colours are already correct.

   an-motion.css repaints the footer as a gold gradient with !important, and
   the footer logo was swapped to the dark variant to suit it (that PNG
   averages #231A44). Reading the stylesheets alone suggested the text had
   been left on the old dark-footer greys — but measuring the live page
   showed the cascade already resolves footer text to #3A2A10, which is
   7.42:1 on the darker gold stop. It is fine. Overriding it to plum would
   have LOWERED it to 5.91:1, so this file deliberately does not touch
   footer text colour.

   What is actually wrong is structural: an-town.css declares four columns
   for five children, which drops Nord Group onto a row of its own.
   ------------------------------------------------------------------------ */
.foot-inner{max-width:1200px;margin:0 auto;}
.foot-cols{
  display:grid;
  grid-template-columns:1.6fr 1fr 1fr 1fr 1.2fr;   /* five children, five columns */
  gap:2rem;align-items:start;
}
@media(max-width:1200px){.foot-cols{grid-template-columns:1.6fr 1fr 1fr;}}
@media(max-width:900px) {.foot-cols{grid-template-columns:1fr 1fr;}}
@media(max-width:560px) {.foot-cols{grid-template-columns:1fr;}}
.foot-logo{height:52px;width:auto;margin-bottom:1rem;}
.foot-brand p{font-size:.88rem;max-width:340px;line-height:1.7;}
.foot-col h5{font-family:'Montserrat',sans-serif;font-size:.95rem;font-weight:800;margin-bottom:.8rem;}
.foot-col p{font-size:.86rem;margin-bottom:.6rem;line-height:1.65;}
.foot-links-v{display:flex;flex-direction:column;gap:.5rem;}
.foot-links-v a{font-size:.86rem;text-decoration:none;}
.foot-links-v a:hover{text-decoration:underline;}
.foot-bottom{border-top:1px solid rgba(35,26,68,.28);margin-top:2.25rem;padding-top:1.4rem;}
.foot-legal{font-size:.74rem !important;margin-top:.6rem;line-height:1.6;opacity:.92;}

/* Nord Group column: the five entries wrapped 1,2,2,2,1 lines — ragged,
   because the descriptors are different lengths in a 214px column. Each
   entry is now a fixed two-line block: brand, then descriptor beneath, so
   all five are the same height. Both lines keep the footer's own ink;
   the descriptor is lifted 15% toward the gold, which measures 5.40:1. */
.foot-links-v a .fg-b{display:block;font-weight:700;line-height:1.35;}
.foot-links-v a .fg-d{
  display:block;font-size:.78rem;line-height:1.35;margin-top:1px;
  color:#553E13;                                   /* 5.40:1 on #F0B429 */
}
.foot-links-v a:hover .fg-d{color:#3A2A10;}

/* ---------------------------------------------------------------------------
   6. CARD GRIDS — equal heights, equal rows
   .art-grid carried align-items:start, so cards on the same row ended up
   583/825/610px tall. Measured on the live build: three grids, eight uneven
   rows between them.
   ------------------------------------------------------------------------ */
.art-grid,.fitgrid,.services-grid,.gw-grid,.areas-cards{
  align-items:stretch;
}
.art-grid>*,.fitgrid>*,.services-grid>*,.gw-grid>*,.areas-cards>*{
  height:100%;
  display:flex;flex-direction:column;
}
/* the trailing paragraph takes up the slack so the card feet line up */
.art-block>p:last-child,.fit>p:last-child,.service-card>p:last-child{
  margin-bottom:0;
}
.service-card .service-more,.gw .gw-go{margin-top:auto;}

/* ---- SITE RULE: every line of a card grid carries the same number of cards.
   No ragged last row, at any breakpoint.

   A fixed column count cannot do this, because the right number depends on how
   many cards the grid actually holds. So each grid is stamped at build time
   with zn-c{desktop}-{tablet}, chosen so that the count divides exactly:

       6 cards -> 3 across, then 2 across, then 1   (3+3 / 2+2+2 / 6x1)
       4 cards -> 4, then 2, then 1                 (4 / 2+2 / 4x1)
       3 cards -> 3, then 3, then 1                 (3 / 3 / 3x1)   never 2+1
       2 cards -> 2, then 2, then 1
       9 cards -> 3, then 3, then 1

   auto-fit is deliberately not used anywhere on a card grid: it picks the
   column count from the viewport width, so it produces a short final row at
   whatever widths happen to fall badly. This was giving 4+2 on .steps across
   57 pages and 3+1 on .fitgrid.                                            */
[class*="zn-c"]{display:grid;}
.zn-c1-1,.zn-c1-1{grid-template-columns:1fr !important;}
@media(min-width:1080px){
  .zn-c2-1,.zn-c2-2{grid-template-columns:repeat(2,1fr) !important;}
  .zn-c3-1,.zn-c3-2,.zn-c3-3{grid-template-columns:repeat(3,1fr) !important;}
  .zn-c4-1,.zn-c4-2,.zn-c4-4{grid-template-columns:repeat(4,1fr) !important;}
}
@media(min-width:700px) and (max-width:1079px){
  .zn-c2-1,.zn-c3-1,.zn-c4-1{grid-template-columns:1fr !important;}
  .zn-c2-2,.zn-c3-2,.zn-c4-2{grid-template-columns:repeat(2,1fr) !important;}
  .zn-c3-3{grid-template-columns:repeat(3,1fr) !important;}
  .zn-c4-4{grid-template-columns:repeat(4,1fr) !important;}
}
@media(max-width:699px){
  [class*="zn-c"]{grid-template-columns:1fr !important;}
}

/* ---------------------------------------------------------------------------
   7. NORD GROUP CARDS
   The brand accents were sampled straight from each logo and land at
   3.24-3.40:1 on the white card, below AA for 11.5px type. Darkened just
   enough to clear 4.5:1; the 5px top rule keeps the original hue.
   ------------------------------------------------------------------------ */
.gw--arctic{--gw-c:#5292B9;--gw-tagc:#457C9D;}   /* 3.40 -> 4.54 */
.gw--ember {--gw-c:#E06C2D;--gw-tagc:#BC5A25;}   /* 3.31 -> 4.54 */
.gw--aura  {--gw-c:#12A093;--gw-tagc:#0E847A;}   /* 3.24 -> 4.57 */
.gw--zenith{--gw-c:#ECB53E;--gw-tagc:var(--zn-gold-dk);}
.gw        {--gw-tagc:var(--zn-gold-dk);}        /* 1.58 -> 4.50 */
.gw::before{background:var(--gw-c);}

/* SOLARFIELD is deliberately a DARK navy card, so its tag is light blue on
   navy and already correct. Darkening it here would have made it unreadable —
   it must be excluded, not corrected. */
.gw:not(.gw--field) .gw-tag{color:var(--gw-tagc) !important;}

/* ---------------------------------------------------------------------------
   8. PARTNER LOGO STRIP
   There were two strips doing the same job: .cfg-brands on the homepage with
   grayscale(1) brightness(1.55) at 40px, and .lc-badges everywhere else with
   no filter at 60px. The grayscale one washes a white logo out almost to the
   background. One treatment now, on both.
   ------------------------------------------------------------------------ */
/* Only the row is laid out here. .cfg-brands also holds its own label, so it
   must NOT become a flex row itself — that would put the label beside the
   logos. The homepage keeps its own container; only the marks are normalised. */
.lc-badges,.cfg-brandrow{
  display:flex;flex-wrap:wrap;justify-content:center;align-items:center;
  gap:1.4rem 3rem;margin-top:1.4rem;
}
.cfg-brand{display:inline-flex;align-items:center;}
.lc-badges img,.cfg-brands img{
  height:56px;width:auto;max-width:200px;
  object-fit:contain;display:block;
  filter:none !important;      /* was grayscale(1) brightness(1.55) on index */
  opacity:.95;                 /* was .82 on index, .92 on the town pages    */
  transition:opacity .25s ease,transform .25s ease;
}
.lc-badges img:hover,.cfg-brands img:hover{opacity:1;transform:translateY(-3px);}
@media(max-width:700px){
  .lc-badges,.cfg-brandrow{gap:1.1rem 1.9rem;}
  .lc-badges img,.cfg-brands img{height:42px;max-width:140px;}
}
/* The strip must sit on a dark ground — these are white-on-transparent marks.
   an-motion.css already paints section[aria-label="Equipment partners"], and
   the rebuilt content pages reuse that exact label, so they inherit it. This
   restates it so the ground cannot go missing if that file is reordered. */
section[aria-label="Equipment partners"]{
  background:linear-gradient(180deg,var(--zn-plum-deep),var(--zn-plum));
  border-top:1px solid rgba(255,197,51,.18);
  border-bottom:1px solid rgba(255,197,51,.18);
}
section[aria-label="Equipment partners"] .land-eyebrow{color:var(--zn-gold-lt) !important;}

/* ---------------------------------------------------------------------------
   8b. NAVIGATION — the same bar on every page
   The nav resolves to rgba(10,14,34,.94) everywhere, which is correct. But
   an-motion.css carries `body.legal a{color:var(--warm) !important}`, and
   that is not scoped to the document — it repaints the TOP NAV links ember
   on the dark navy bar, measured at 2.08:1 on /terms. The document keeps the
   ember link; the chrome does not.

   The over-broad rule has been scoped at source in an-motion.css. Two rules
   had to be beaten, not one: removing `body.legal a` alone still left the nav
   ember, because the legal pages' own inline CSS carries `a{color:var(--blue)}`
   and --blue resolves to the ember there. The nav carries an id, so an
   id-based selector settles it for good. Verified against the rendered page,
   not the computed style.
   ------------------------------------------------------------------------ */

/* First, the nav is inconsistent with ITSELF on every page: the dropdown
   toggles ("What we fit", "Learn") are <button> at #D7D3CB, while the plain
   items ("Areas", "FAQs", "How We Work", "Contact") are <a> at #F1E9F4. Two
   colours, one row. One colour now. */
nav#topnav .topnav-links a,
nav#topnav .topnav-links > li > a,
nav#topnav .has-drop > button.drop-toggle,
nav#topnav .topnav-right > a:not(.start-btn):not(.quote-nav-btn){
  color:#F1E9F4 !important;
}
nav#topnav .topnav-links a:hover,
nav#topnav .has-drop > button.drop-toggle:hover{color:#FFFFFF !important;}
nav#topnav .caret{color:#C9BCD2 !important;}
/* the gold pill in the nav: its label was rendering ember on gold */
nav#topnav a.quote-nav-btn,
nav#topnav a.start-btn,
a.quote-nav-btn{color:var(--zn-plum-deep) !important;}

body.legal nav#topnav a:not(.start-btn):not(.quote-nav-btn):not(.nav-logo),
body.legal nav#topnav .topnav-links a,
body.legal nav#topnav .topnav-right a:not(.start-btn):not(.quote-nav-btn),
body.legal nav#topnav .drop-menu a,
body.legal #mobile-menu a:not(.mm-cta),
body.legal #mobile-menu nav a:not(.mm-cta){
  color:#F1E9F4 !important;
}
body.legal nav#topnav a.start-btn,
body.legal nav#topnav a.quote-nav-btn,
body.legal a.quote-nav-btn,
body.legal .mm-cta{
  color:var(--zn-plum-deep) !important;
}
body.legal footer a,
body.legal .foot-links-v a,
body.legal .foot-col a{color:#3A2A10 !important;}   /* 7.42:1 on the gold footer */
body.legal .caret{color:#D7D3CB !important;}

/* ---------------------------------------------------------------------------
   9. SECTION RHYTHM — the alternating ground, one definition
   ------------------------------------------------------------------------ */
section.band{background:var(--zn-band);}
.title-rule{
  display:block;width:64px;height:4px;border-radius:2px;
  background:var(--zn-gold);margin:.1rem 0 1rem;
}
section[style*="#1B1E22"] .section-title,
section[style*="#231A44"] .section-title,
section[aria-label="Equipment partners"] .section-title{color:#fff;}

/* ---------------------------------------------------------------------------
   10. STAT BAND — gold numerals need a dark ground; captions were #D7D3CB
   ------------------------------------------------------------------------ */
.statband{
  display:flex;flex-wrap:wrap;gap:2.5rem;justify-content:space-between;
  border-top:1px solid rgba(255,197,51,.25);
  border-bottom:1px solid rgba(255,197,51,.25);
  padding:2rem 0;margin:0;
}
.statband div{flex:1 1 180px;}
.statband b{
  display:block;font-size:clamp(1.6rem,3.4vw,2.4rem);font-weight:900;
  color:var(--zn-gold);line-height:1.1;letter-spacing:-1px;
}
.statband b[data-to]{font-variant-numeric:tabular-nums;}
.statband span{display:block;color:#D7D3CB;font-size:.9rem;margin-top:.4rem;line-height:1.5;}

/* ---------------------------------------------------------------------------
   11. FIGURES — the reason every diagram off the homepage looked foggy
   an-town.css set .lc-art{opacity:.62} (and .7 at mobile), so every figure on
   the town pages and the content pages rendered at just over half strength.
   an-motion.css then thinned them again from inside: fill-opacity .72 on the
   panels and stroke-opacity .65 on the lines. The homepage does not use
   .lc-art, which is why it alone looked right.
   ------------------------------------------------------------------------ */
.lc-art{opacity:1 !important;}
@media(max-width:760px){.lc-art{opacity:1 !important;}}
.figr .p rect{fill-opacity:.96 !important;}
.figr .p path[fill-opacity]{fill-opacity:.96 !important;}
.figr .p line,.figr .p path[stroke]{stroke-opacity:1 !important;}
.figr .shade path[fill-opacity]{fill-opacity:.34 !important;}
.lc-art .figr,.lc-art svg{opacity:1 !important;}

/* ---------------------------------------------------------------------------
   12. DARK CARDS THAT WERE GIVEN LIGHT-THEME TEXT
   an-town.css styles the accreditation card for its dark ground — white
   heading, #D7D3CB body. an-light.css loads after it and repaints both with
   --ink and --body, which are dark plum, ON a dark plum card. The MCS panel
   was rendering as an empty box with a barely visible heading.
   ------------------------------------------------------------------------ */
.fgas-accred b,
.mcs-accred b{color:#FFFFFF !important;}
.fgas-accred span,
.fgas-accred p,
.mcs-accred span,
.mcs-accred p{color:#EDE7F2 !important;}
.fgas-accred,
.mcs-accred{color:#EDE7F2 !important;border-color:rgba(255,197,51,.45) !important;}

/* ---------------------------------------------------------------------------
   13. THE REST OF THE UNREADABLE TEXT
   My earlier scans skipped any element sitting on a gradient, which is most of
   the dark bands — so they systematically missed every dark-on-dark case. This
   pass approximates each gradient by averaging its stops and checks both
   directions. Fifteen distinct failures, all listed with their measured ratio.
   ------------------------------------------------------------------------ */

/* on the paper ground — gold and the old dark-theme greys */
p.land-note a{color:var(--zn-link) !important;}            /* 1.27 -> 5.90 */
.guide-lede{color:var(--zn-body) !important;}              /* 1.38 -> 10.22 */
.guide-toc a{color:var(--zn-link) !important;}             /* 1.39 -> 5.90 */
.section-inner > p a{color:var(--zn-link) !important;}     /* 1.47 -> 5.90 */
p.ctaline{color:var(--zn-body) !important;}                /* 1.78 -> 11.02 */

/* the footer's gold ground — the ember link is a light-ground colour */
footer a,
footer .foot-col a,
footer .foot-links-v a,
footer .foot-col p a{color:#3A2A10 !important;}            /* 3.71 -> 8.11 */
footer a:hover,footer .foot-col a:hover{color:#231A44 !important;text-decoration:underline;}

/* the nav's navy ground */
nav#topnav .topnav-links a,
nav#topnav .topnav-links > li > a,
nav#topnav .has-drop > button.drop-toggle{color:#F1E9F4 !important;}   /* 2.65 -> 14.23 */

/* the Nord Group tag on its white card */
.gw:not(.gw--field) .gw-tag{color:var(--gw-tagc,#93721D) !important;}  /* 3.24 -> 4.57 */

/* the legacy cookie banner's own buttons and link, on its charcoal ground.
   That banner is removed from the pages in this folder, but the rules stay
   in case an older copy of a page is ever restored. */
.cookie-banner{background:#231A44 !important;color:#F2ECF5 !important;}
.cookie-banner p{color:#F2ECF5 !important;}
.cookie-banner a{color:var(--zn-gold-lt) !important;}      /* 2.08 -> 11.8 */
.cookie-banner .acc{background:var(--zn-gold) !important;color:#231A44 !important;
                    border:1px solid var(--zn-gold) !important;}   /* 2.27 -> 10.2 */
.cookie-banner .dec{background:transparent !important;color:#F2ECF5 !important;
                    border:1px solid rgba(255,197,51,.55) !important;} /* 1.04 -> 13.9 */
a.back{color:var(--zn-gold-lt) !important;}                /* 1.03 -> readable */

/* ---------------------------------------------------------------------------
   14. THE SPLIT BLOCKS — white and near-white text left on the paper ground
   solar-battery-guide's own inline CSS still carries the dark-theme values:
       .split p    #D7D3CB   1.38:1 on the paper
       .split .spec #FFFFFF  1.05:1 on the paper   ("Where it changes",
                                                    "In practice", and the
                                                    rest of the pull-outs)
   The kicker inside them is already ember and stays.
   ------------------------------------------------------------------------ */
.split p,.psplit p,
.split .spec,.psplit .spec,p.spec,
.split li,.psplit li,
.split .spec-body{color:var(--zn-body) !important;}
.split .spec em,.psplit .spec em,p.spec em,
.split-kicker,.psplit-kicker{color:var(--zn-link) !important;}
/* but the ones that genuinely sit on a dark plate keep their light text */
.split-art .spec,.psplit-art .spec,
.split-art p,.psplit-art p,
[style*="#231A44"] .spec,[style*="#1B1E22"] .spec{color:#EDE7F2 !important;}

/* ---------------------------------------------------------------------------
   15. CONTACT COLUMN
   The column runs to the same height as the enquiry form, so the first card
   lines up with the top of the form and the last with the bottom. The space
   left over is shared EQUALLY between the cards.

   Two things were fighting that. The cards carried flex:1, so the spare
   height went INSIDE each card as a dead band rather than between them; and
   .hours-card carried margin-top:auto, which shoved the whole remainder into
   the single gap above it. Cards now size to their content, and
   space-between distributes what is left evenly.
   ------------------------------------------------------------------------ */
.contact-content{align-items:stretch !important;}
.contact-info{
  height:100% !important;
  display:flex !important;
  flex-direction:column !important;
  justify-content:space-between !important;
  gap:1.5rem !important;
}
/* natural height — the slack belongs between the cards, not inside them */
.contact-info > *{flex:0 0 auto !important;}
.contact-info .hours-card{margin-top:0 !important;}

/* stacked, there is no form to line up with, so just space them evenly */
@media(max-width:900px){
  .contact-content{align-items:start !important;}
  .contact-info{height:auto !important;justify-content:flex-start !important;}
}

/* ---------------------------------------------------------------------------
   16. STAT BAND CAPTIONS
   The gold numerals are right on either ground, but the caption under each
   one was left on #D7D3CB — a dark-theme grey, 1.38:1 on the paper. Purple
   by default; light only where the band genuinely sits on a dark section.
   ------------------------------------------------------------------------ */
/* The numerals stay gold on both grounds — they are large display type and
   that is the brand. Only the caption beneath changes. */
.statband span{color:var(--zn-body) !important;}
section[style*="#1B1E22"] .statband span,
section[style*="#231A44"] .statband span,
section[style*="#1A1030"] .statband span,
.chero .statband span,
.lc-hero .statband span{color:#D7D3CB !important;}

/* ---------------------------------------------------------------------------
   17. SCROLL REVEAL — left alone.
   A previous version of this file switched the reveal off across the whole
   site after a note about how-we-work. That was too blunt: the card reveal is
   wanted and only that one page was at issue. an-motion.js keeps its
   behaviour, including its prefers-reduced-motion bail-out.
   ------------------------------------------------------------------------ */

/* ---------------------------------------------------------------------------
   18. THE SLIM HERO — make sure it has a floor
   With the cycling layers hidden, the panel needs its own solid ground so it
   can never render as a bare strip if a layer fails to paint.
   ------------------------------------------------------------------------ */
.chero.chero--slim{
  background:linear-gradient(150deg,#231A44 0%,#3E2246 52%,#5C2E4A 100%) !important;
  min-height:0 !important;height:auto !important;
}
.chero.chero--slim .chero-fx{opacity:1;}
.chero.chero--slim .chero-scrim{background:none !important;}

/* ---------------------------------------------------------------------------
   19. NORD GROUP CARD LOGOS
   SOLARFIELD's wordmark is a wide lockup; at the shared 70px cap it towered
   over the three Nord marks. Capped on width so all four read at the same
   optical weight.
   ------------------------------------------------------------------------ */
.gw-logo{height:56px;}
.gw-logo img{max-height:46px;max-width:170px;}
.gw--field .gw-logo img{max-height:30px;max-width:150px;}

/* ---------------------------------------------------------------------------
   20. THE NUMBERED SPINE, WHEREVER IT APPEARS
   .spine began as a vertical timeline: a rule down the left, and each .num
   hung outside its row at left:-3.4rem. an-motion.css later turned it into a
   card grid, but ONLY inside section[aria-label="Why choose ZenithNord"] —
   the town pages. Every other spine kept the timeline offsets while being
   laid out as a grid, which is why the numbers sit on top of the text on
   how-we-work. Same treatment everywhere now; the dark town rules are more
   specific and still win on those pages.
   ------------------------------------------------------------------------ */
.spine{padding-left:0 !important;margin-top:2rem;}
.spine::before{display:none !important;}
.srow{
  position:relative !important;
  background:var(--zn-card);
  border:1.5px solid var(--zn-line);
  border-radius:16px;
  padding:1.5rem 1.4rem !important;
  display:flex;flex-direction:column;
  overflow:hidden;isolation:isolate;
  transition:transform .3s ease,box-shadow .3s ease,border-color .3s ease;
}
.srow:last-child{padding-bottom:1.5rem !important;}
.srow:hover{
  transform:translateY(-6px);
  box-shadow:0 26px 56px rgba(62,34,70,.18);
  border-color:var(--zn-gold-dk);
}
/* the number becomes a chip in the flow, not a disc hanging off the side */
.srow .num{
  position:static !important;
  left:auto !important;top:auto !important;
  display:inline-flex;align-items:center;justify-content:center;
  width:38px;height:38px;min-width:38px;
  border-radius:11px;
  margin:0 0 .9rem;
  font-size:.82rem;font-weight:800;
  background:var(--zn-gold) !important;
  color:var(--zn-plum-deep) !important;
  border:0 !important;
}
.srow h3{margin:0 0 .55rem;font-size:1.1rem;font-weight:800;}
.srow p{margin:0;flex:1;}

/* ---------------------------------------------------------------------------
   21. THE SLIM HERO — remove the sun disc entirely
   .h-solar positions and scales .chero-disc with its own transforms
   (left:52%, top:30px, margin-left:-34px, plus a baked translate/scale from
   the animation). The slim hero repositions the same element. The two sets
   fight, and on a short hero the result is a stray part-clipped disc over the
   headline. The slim hero does not need it: the plum gradient and the skyline
   carry it. Index keeps the full cycling hero, disc and all.
   ------------------------------------------------------------------------ */
.chero--slim .chero-disc,
.chero--slim .sun-rays,
.chero--slim .chero-moon,
.chero--slim .chero-stars,
.chero--slim .glow-warm{display:none !important;}
.chero--slim .chero-skyline{opacity:.26;}
.chero--slim .chero-in{position:relative;z-index:5;}

/* ---------------------------------------------------------------------------
   22. CONTACT FORM STATUS
   The form now reports in the page instead of via alert(). A blocked alert
   looks exactly like a form that did nothing, which is part of why failed
   enquiries went unnoticed.
   ------------------------------------------------------------------------ */
.cf-status{
  margin:1rem 0 0;padding:.8rem 1rem;border-radius:10px;
  font-size:.92rem;line-height:1.55;font-weight:600;
}
.cf-info{background:rgba(62,34,70,.06);color:var(--zn-body);}
.cf-ok{background:rgba(110,234,155,.16);color:#155C36;border:1px solid rgba(21,92,54,.35);}
.cf-err{background:rgba(168,58,42,.10);color:#8C2C34;border:1px solid rgba(140,44,52,.35);}

/* ---------------------------------------------------------------------------
   23. ANCHOR JUMPS
   Every page carried html{scroll-behavior:smooth}. On a long page that means
   an in-page link animates the whole way down — from the hero to the contact
   section it races through the entire homepage, which reads as a glitch
   rather than as navigation. Anchors jump instantly instead.

   scroll-padding-top keeps the target clear of the sticky header. It was set
   on the town pages via an-town.css and inline on a few others, but the
   homepage and cookie-policy had none, so their anchors landed underneath the
   nav. Declared here so all 69 are covered from one place.
   ------------------------------------------------------------------------ */
html{
  scroll-behavior:auto !important;
  scroll-padding-top:88px;
}
@media(max-width:768px){html{scroll-padding-top:70px;}}

/* Anyone who has asked for reduced motion gets the same instant jump — which
   is what that preference means here. */
@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto !important;}
}

/* ---------------------------------------------------------------------------
   24. COOKIE BANNER — the shared Nord Group one, re-skinned
   Consent is handled by assets/consent.js with the IDs in assets/tags.js, so
   every Nord site runs the same UK-compliant banner from one file. That file
   is never edited, so the ZenithNord palette is applied here instead: it
   ships in FoxFace Studio's navy and amber, and this site is plum and gold.
   ZenithNord's own #cc-* banner has been removed — leaving it would have put
   two banners on every page.
   ------------------------------------------------------------------------ */
#ff-cc{
  background:linear-gradient(180deg,var(--zn-plum-deep),#1A1030) !important;
  border-top:3px solid var(--zn-gold) !important;
}
#ff-cc p{color:#F2ECF5 !important;}
#ff-cc a,#ff-cc-modal a{color:var(--zn-gold-lt) !important;}
#ff-cc,#ff-cc-modal{font-family:'Montserrat',-apple-system,Segoe UI,Roboto,Arial,sans-serif !important;}
.ff-b-p{
  background:var(--zn-gold) !important;color:var(--zn-plum-deep) !important;
  border-color:var(--zn-gold) !important;
}
.ff-b-p:hover{background:var(--zn-gold-lt) !important;}
.ff-b-s{
  background:transparent !important;color:#F2ECF5 !important;
  border-color:rgba(255,197,51,.55) !important;
}
.ff-b-s:hover{background:rgba(255,197,51,.16) !important;color:#fff !important;}
#ff-cc-modal .ff-box{border-top:4px solid var(--zn-gold) !important;}
#ff-cc-reopen{
  background:var(--zn-plum-deep) !important;color:#F2ECF5 !important;
  border:1px solid rgba(255,197,51,.55) !important;
}
#ff-cc-reopen:hover{background:var(--zn-gold) !important;color:var(--zn-plum-deep) !important;}

/* ---------------------------------------------------------------------------
   25. "FOLLOW THE ELECTRICITY ACROSS A DAY" — the .auto panel
   That panel is dark charcoal (#202128), but an-motion.css forces the light
   theme's ink and mute onto the type inside it:

       .phase b                 --ink  #3E2246   1.16:1
       .phase span              --mute #6B5477   2.41:1
       .dg-cap b                --ink  #3E2246   1.16:1
       .phase[aria-selected] b  --ink on the gold-olive active chip  1.72:1

   Same fault as the MCS card: a component styled for its own dark ground,
   then repainted by the light-theme layer that loads after it.
   ------------------------------------------------------------------------ */
.auto .phase b,
.auto .phase[aria-selected=true] b,
.phase b{color:#FFFFFF !important;}                    /* 16.04:1 on the panel */
.auto .phase span,
.phase span{color:#C9BCD2 !important;}                 /*  8.86:1 */
.auto .phase[aria-selected=true] span{color:#F0E6D2 !important;}  /* 6.48:1 on the chip */
.auto .dg-cap,
.auto .dg-cap b,
.dg-cap{color:#EDE7F2 !important;}                     /* 13.22:1 */
/* The caption is <p class="dg-cap" id="sv-cap">, and an-light.css carries
   #sv-cap b{color:var(--ink)!important} — ID specificity (1,0,1), which beats
   any class-based rule however many classes it chains. The leading word of
   every caption ("Midday.", "Evening.", "Night.") was rendering in dark plum
   on the dark panel because of it. Matched on the id to win. The JS also
   writes these with an inline style="color:var(--acc)", so --acc is set on
   the panel too — belt and braces if that rule is ever relaxed. */
#sv-cap b,
.auto #sv-cap b,
.auto .dg-cap b{color:#FFD873 !important;}             /* 11.70:1 */
.auto{--acc:#FFD873;}
.auto .dg-legend,
.auto .dg-legend b,
.auto .dg-legend span{color:#EDE7F2 !important;}
.auto .auto-head,
.auto .auto-head b{color:#FFFFFF !important;}
.auto .auto-head p{color:#C9BCD2 !important;}
.auto .auto-ctl button{color:#FFD873 !important;border-color:rgba(255,197,51,.5) !important;}
.auto .auto-ctl button:hover{background:var(--zn-gold) !important;color:var(--zn-plum-deep) !important;}
