/*
Theme Name: Octopus Energy Hub
Theme URI: https://octopusenergyhub.co.uk
Author: Trailhead Digital Services
Description: An independent editorial theme for a content site about Octopus Energy. Left-aligned editorial article layout, Schibsted Grotesk typography, responsive comparison tables, aubergine and lilac colour system. Not affiliated with Octopus Energy Group Limited.
Version: 1.2.2
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: octopus-energy-hub
Tags: education, energy, blog, custom-menu, featured-images, translation-ready
*/

/* ── Variables ──────────────────────────────── */
/* v1.0.0 — the colour system is an AUBERGINE + LILAC palette, taken as
   inspiration from Octopus Energy's deep purple and magenta without copying
   their brand colours: the purples are darker and less saturated than theirs,
   the accent is a lilac rather than their signature pink, and the pink that
   does appear is reserved for small accents. The site should read as an
   independent publication about Octopus, never as Octopus's own site.

   TOKEN NAMES ARE HISTORICAL. `--brand-mint`, `--brand-zebra`, `--c-navy`,
   `--c-sun*` and friends are named after earlier palettes; hundreds of rules
   below reference them, so they have been RE-POINTED at the new palette
   rather than renamed. Change a value here and every surface follows. The
   authoritative palette is §1 of assets/css/soeb-system.css (--soeb-*); the
   values here mirror it.

   All foreground/background pairs in this palette clear WCAG AA. */
:root{
  /* Darks — header, footer, dark bands, table header bar */
  --c-navy:#1B0A38;           /* darkest aubergine ground                 */
  --c-navy-light:#26124C;      /* hover step on the dark ground            */
  --c-heading:#1F1733;         /* heading ink                              */
  --c-text:#3A3350;            /* body ink                                 */
  --c-text-light:#57506B;      /* muted body ink                           */
  --c-accent:#C2187A;          /* magenta accent — small details only      */
  --c-accent-hover:#A31164;
  --c-link:#4B1F8C;            /* plum — links and primary buttons         */
  --c-link-hover:#2E1059;
  --c-white:#fff;--c-off-white:#F7F4FC;
  --c-light-grey:#E9E3F3;--c-mid-grey:#A79CBD;--c-border:#DDD5EE;
  --c-footer-bg:#EDE7F7;--c-footer-bar:#E2D9F2;--c-tag-bg:#F1ECFA;
  /* Retained accent ramp — was the "Sunlight" palette, now plum-family */
  --c-sun:#C9A8FF;--c-sun-deep:#4B1F8C;--c-sun-text:#1F1733;
  --c-sun-soft:#F0E8FF;--c-charcoal:#241B3D;
  --c-sand:#F7F4FC;--c-slate:#57506B;
  /* Light table + card system */
  --brand:#4B1F8C;            /* plum — eyebrow dot, table links          */
  --brand-deep:#2E1059;       /* deeper plum — pill text, link hover      */
  --brand-tint:#F0E8FF;       /* row hover wash                           */
  --brand-tint-2:#E2D3FB;     /* pill background, eyebrow dot ring        */
  --brand-zebra:#FBF9FE;      /* faint zebra stripe                       */
  --table-head:#1B0A38;       /* dark table header bar                    */
  --table-head-label:#ffffff; /* mono label on the header bar             */
  --line:#E3DCF0;             /* hairline row divider                     */
  --invert-bg:#1B0A38;        /* dark wash for inverted surfaces          */
  --brand-mint:#C9A8FF;       /* lilac — the on-dark accent + CTA fill    */
  --brand-mint-soft:#DCC6FF;  /* lighter lilac — on-dark accent word      */
  --octo-cream:#F7F4FC;       /* light card surface                       */
  --octo-cream-line:#E3DCF0;  /* hairline/border for light cards          */
  --octo-cream-muted:#57506B; /* muted body text on light cards           */
  --octo-cream-tile:#EDE4FB;  /* light icon tile on light cards           */
  --r-lg:16px;                /* large card radius — tables, hero, TOC    */
  --shadow-card:0 10px 30px rgba(27,10,56,.08); /* system card shadow     */
  --font:'Schibsted Grotesk',-apple-system,BlinkMacSystemFont,'Segoe UI','Helvetica Neue',Arial,sans-serif;
  --s-xs:.25rem;--s-sm:.5rem;--s-md:1rem;--s-lg:1.5rem;--s-xl:2rem;
  --s-2xl:3rem;--s-3xl:4rem;--s-4xl:5.5rem;
  --w-site:1320px;--w-content:820px;--w-wide:960px;
  --radius:6px;--radius-lg:10px;--ease:200ms ease;
}

/* ── Reset ──────────────────────────────────── */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{font-size:18px;scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
body{font-family:var(--font);font-size:1rem;font-weight:400;line-height:1.8;color:var(--c-text);background:var(--c-white)}
img{max-width:100%;height:auto;display:block}
a{color:var(--c-link);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;transition:color var(--ease)}
a:hover{color:var(--c-link-hover)}
ul,ol{list-style:none;padding:0;margin:0}
nav ul,nav ol,.main-nav,.main-nav ul,.main-nav li,.footer-col ul,.footer-col li,.footer-bar__links,.footer-bar__links li{list-style:none!important;padding:0;margin:0}
button{font-family:var(--font);cursor:pointer}

/* ── Typography ─────────────────────────────── */
h1,h2,h3,h4,h5,h6{font-family:var(--font);color:var(--c-heading);line-height:1.3;font-weight:600}
h1{font-size:clamp(1.75rem,3.5vw,2.4rem);margin-bottom:var(--s-lg)}
h2{font-size:clamp(1.35rem,2.5vw,1.65rem);margin-bottom:var(--s-md)}
h3{font-size:clamp(1.1rem,2vw,1.3rem);margin-bottom:var(--s-md)}
h4{font-size:1.05rem;margin-bottom:var(--s-sm)}
p{margin-bottom:var(--s-lg)}

.tag{font-size:.78rem;font-weight:500;letter-spacing:.02em}
.tag-box{display:inline-block;font-size:.72rem;font-weight:500;padding:3px 12px;background:var(--c-tag-bg);border-radius:3px;color:var(--c-text);text-decoration:none;transition:background var(--ease)}
.tag-box:hover{background:var(--c-light-grey);color:var(--c-heading)}

/* ── Layout ─────────────────────────────────── */
.site-container{width:100%;max-width:var(--w-site);margin:0 auto;padding:0 var(--s-xl)}
.constrained{max-width:var(--w-content)}

/* ── Header ─────────────────────────────────── */
/* ── Floating rounded header (v3.18.0) ─────────────────────────── */
.site-header{position:sticky;top:0;z-index:1000;border:0;padding:0;background:rgba(27,10,56,.92);-webkit-backdrop-filter:blur(20px) saturate(150%);backdrop-filter:blur(20px) saturate(150%);border-bottom:1px solid rgba(255,255,255,.07);box-shadow:0 1px 0 rgba(255,255,255,.03),0 10px 30px rgba(0,0,0,.22);transition:background var(--ease),box-shadow var(--ease),border-color var(--ease)}
.site-header__inner{max-width:var(--w-site);margin:0 auto;width:100%;padding:0 32px}
.header-shell{display:flex;align-items:center;justify-content:space-between;gap:var(--s-xl);padding:14px 0;border-radius:0;background:none;box-shadow:none;border:0}
.site-header.scrolled{background:rgba(19,6,40,.95);border-bottom-color:rgba(255,255,255,.09);box-shadow:0 1px 0 rgba(255,255,255,.04),0 14px 38px rgba(0,0,0,.4)}
.site-header.scrolled .header-shell{box-shadow:none}
.site-logo{display:flex;align-items:center;text-decoration:none;flex:0 0 auto;line-height:0}
.site-logo__img{height:42px;width:auto;display:block}
.site-logo__icon{width:38px;height:38px;background:var(--c-navy);border-radius:6px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:1.15rem}
.site-logo__text{font-size:1rem;font-weight:600;color:#fff;line-height:1.2}
.site-logo__text span{color:var(--c-accent)}
.header-right{display:flex;align-items:center;gap:var(--s-md);flex:0 0 auto}
.main-nav{display:flex;align-items:center;flex:1 1 auto;justify-content:center}
.main-nav__list{display:flex!important;flex-direction:row!important;align-items:center;gap:8px;list-style:none!important;margin:0!important;padding:0!important}
.main-nav__list li{list-style:none!important;list-style-type:none!important;margin:0;padding:0;position:relative}
.main-nav__list li::before,.main-nav__list li::marker{display:none!important;content:none!important}
.main-nav a,.main-nav__list a{display:block;padding:8px 14px;color:rgba(255,255,255,.82);font-weight:500;font-size:.9rem;text-decoration:none;border-radius:6px;transition:color var(--ease),background var(--ease);white-space:nowrap}
.main-nav a:hover,.main-nav__list .current-menu-item>a,.main-nav__list .current_page_item>a,.main-nav__list .current-menu-ancestor>a{color:#C9A8FF;background:transparent}
.main-nav a:focus-visible{outline:2px solid #fff;outline-offset:3px}
.main-nav__list .sub-menu{display:none;position:absolute;top:calc(100% + 14px);left:50%;transform:translateX(-50%);background:rgba(20,7,42,.92);-webkit-backdrop-filter:blur(20px) saturate(150%);backdrop-filter:blur(20px) saturate(150%);border:1px solid rgba(255,255,255,.08);border-radius:0 0 8px 8px;box-shadow:0 18px 44px rgba(0,0,0,.5);min-width:248px;padding:10px;z-index:100;list-style:none!important;align-items:stretch!important}
.main-nav__list li:hover>.sub-menu,.main-nav__list li:focus-within>.sub-menu{display:block}
.main-nav__list .sub-menu li{list-style:none!important}
.main-nav__list .sub-menu a{padding:11px 14px;font-size:.9rem;font-weight:500;text-indent:0;margin-left:0;color:rgba(255,255,255,.82);border-radius:10px;transition:color .18s ease,background .18s ease,box-shadow .18s ease}
.main-nav__list .sub-menu a:hover{background:transparent;color:#C9A8FF;box-shadow:none}
.header-cta{display:inline-flex;align-items:center;justify-content:center;gap:10px;padding:12px 24px;border-radius:999px;font-family:'Schibsted Grotesk',-apple-system,'Helvetica Neue',Arial,sans-serif;font-weight:500;font-size:.9rem;line-height:1;text-decoration:none;white-space:nowrap;cursor:pointer;border:none;transition:background var(--ease),transform var(--ease),color var(--ease)}
.header-cta--ghost{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.45)}
.header-cta--ghost:hover,.header-cta--ghost:focus{background:rgba(255,255,255,.10);color:#fff;transform:translateY(-1px);text-decoration:none}
.header-cta--primary{background:#DE5CF1;color:#1B0A38;border:1px solid #DE5CF1}
.header-cta--primary:hover,.header-cta--primary:focus{background:#C846DC;border-color:#C846DC;color:#1B0A38;transform:translateY(-1px);text-decoration:none}
.header-cta:focus-visible{outline:2px solid var(--brand-mint);outline-offset:3px}
.header-cta__icon{flex-shrink:0}
.menu-toggle{display:none;background:transparent;border:1px solid rgba(255,255,255,.18);border-radius:10px;padding:8px;color:#fff;cursor:pointer;width:42px;height:42px;align-items:center;justify-content:center}
.menu-toggle svg{width:24px;height:24px}
.menu-toggle:focus-visible{outline:2px solid #fff;outline-offset:3px}
.header-search-btn{background:none;border:none;padding:8px;color:var(--c-text-light);display:flex;align-items:center;transition:color var(--ease)}
.header-search-btn:hover{color:var(--c-heading)}
.header-search-btn svg{width:20px;height:20px}

/* ── Breadcrumbs ────────────────────────────── */
.breadcrumbs{padding:var(--s-md) 0;font-size:.8rem;color:var(--c-mid-grey)}
.breadcrumbs a{color:var(--c-text-light);text-decoration:none}
.breadcrumbs a:hover{color:var(--c-link)}
.breadcrumbs .sep{margin:0 6px;opacity:.5}

/* ── Buttons ────────────────────────────────── */
.btn{display:inline-flex;align-items:center;gap:8px;padding:12px 28px;font-family:var(--font);font-size:.9rem;font-weight:500;border:none;border-radius:4px;cursor:pointer;text-decoration:none;transition:all var(--ease)}
.btn--primary{background:var(--c-charcoal);color:#fff}
.btn--primary:hover{background:#140430;color:#fff}
.btn--outline{background:transparent;color:var(--c-heading);border:2px solid var(--c-heading)}
.btn--outline:hover{background:var(--c-heading);color:#fff}
.btn--small{padding:8px 18px;font-size:.82rem}
.btn--white{background:#fff;color:var(--c-heading)}
.btn--white:hover{background:var(--c-off-white);color:var(--c-heading)}
.text-link{font-size:.88rem;font-weight:500;color:var(--c-heading);text-decoration:none;display:inline-flex;align-items:center;gap:6px;transition:gap var(--ease)}
.text-link:hover{gap:10px;color:var(--c-heading)}
.text-link::after{content:'›';font-size:1.1em}

/* Progress bar */
.progress-bar{position:sticky;top:0;z-index:999;height:3px;background:transparent}
.progress-bar progress{display:block;width:100%;height:3px;border:none;appearance:none;-webkit-appearance:none;background:transparent}
.progress-bar progress::-webkit-progress-bar{background:transparent}
.progress-bar progress::-webkit-progress-value{background:var(--c-accent);transition:width 100ms linear}
.progress-bar progress::-moz-progress-bar{background:var(--c-accent)}
/* --c-accent is the magenta. It is used HERE and on the in-table callout pill
   only: a little of it reads as a nod to Octopus, a lot of it reads as an
   impersonation of them. */

/* ── In-table callout pill — e.g. "Best for EV charging" in a comparison
 * table. Use <span class="tag">…</span> inside a cell. Scoped to table cells
 * so it never collides with the sitewide .tag used on cards. */
.soeb-article__body table .tag{
    display:inline-block;
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.7rem;
    font-weight:500;
    line-height:1.25;
    letter-spacing:.01em;
    text-transform:none;
    color:var(--brand-deep);
    background:var(--brand-tint-2);
    border-radius:999px;
    padding:4px 10px;
    white-space:nowrap;
    vertical-align:baseline;
}
/* Prevent horizontal page scroll — use both hidden (fallback) and clip (modern, more reliable on iOS) */
html,body{max-width:100%;overflow-x:hidden}
@supports (overflow-x:clip){
    html,body{overflow-x:clip}
}
body{position:relative}
/* Comment form fields must not exceed their container (WP defaults to cols=45) */
#comments input[type="text"],
#comments input[type="email"],
#comments input[type="url"],
#comments textarea{max-width:100%;box-sizing:border-box}

/* ── Blog Listing / Cards ───────────────────── */
.posts-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s-xl)}

.blog-card{display:flex;flex-direction:column}
.blog-card__image{
    position:relative;
    aspect-ratio:16/10;
    margin-bottom:var(--s-md);
    display:block;
    overflow:hidden;
    border-radius:4px;
}
.blog-card__image img{
    width:100%;
    height:100%;
    object-fit:cover;
    transition:transform 300ms ease;
    display:block;
}
.blog-card:hover .blog-card__image img{transform:scale(1.02)}
.blog-card__categories{display:flex;gap:6px;margin-bottom:var(--s-sm);flex-wrap:wrap}
.blog-card__title{font-size:1.05rem;font-weight:600;line-height:1.35;margin-bottom:var(--s-sm);margin-top:var(--s-sm)}
.blog-card__title a{color:var(--c-heading);text-decoration:none}
.blog-card__title a:hover{text-decoration:underline}
.blog-card__meta{font-size:.78rem;color:var(--c-text-light);margin-bottom:var(--s-sm)}
.blog-card__excerpt{font-size:.88rem;color:var(--c-text-light);line-height:1.6;margin-bottom:var(--s-md)}

/* Card-context category badge — sharp dark pill matching .page-hero__kicker, so
   every eyebrow of this kind looks identical. Scoped to cards only so inline
   category lists keep their soft grey style. */
.blog-card .tag-box{
    background:var(--c-charcoal);
    color:#fff;
    border-radius:3px;
    padding:4px 10px;
    font-size:.7rem;
    font-weight:700;
    letter-spacing:.08em;
    text-transform:uppercase;
}
.blog-card .tag-box:hover{
    background:var(--c-charcoal);
    color:#fff;
}
/* "Read more →" text link inside grid cards — replaces the old hidden version with an
   editorial-style underline link in body charcoal. The whole card is already a link;
   this is just the explicit affordance. */
.blog-card .text-link{
    display:inline-flex;
    align-items:center;
    gap:6px;
    font-size:.85rem;
    font-weight:500;
    color:var(--c-charcoal);
    text-decoration:none;
    margin-top:auto;
}
.blog-card .text-link::after{content:"→";font-size:1rem;line-height:1;}
.blog-card .text-link:hover{text-decoration:underline;text-underline-offset:3px}

/* ── Archive / Search Header ────────────────── */
.archive-header{padding:var(--s-3xl) 0 var(--s-xl);border-bottom:1px solid var(--c-light-grey);margin-bottom:var(--s-2xl)}
.archive-header h1{margin-bottom:var(--s-sm)}
.archive-header p{color:var(--c-text-light);max-width:560px}

/* ── Search Form ────────────────────────────── */
.search-form{display:flex;gap:var(--s-sm)}
.search-form__input{flex:1;padding:10px 16px;border:2px solid var(--c-light-grey);border-radius:4px;font-family:var(--font);font-size:.9rem;outline:none;transition:border-color var(--ease)}
.search-form__input:focus{border-color:var(--c-navy)}

/* ── 404 ────────────────────────────────────── */
.error-404{text-align:center;padding:var(--s-4xl) 0}
.error-404__number{font-size:clamp(5rem,12vw,10rem);font-weight:600;color:var(--c-light-grey);line-height:1}

/* ── Pagination ─────────────────────────────── */
.pagination{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:8px;padding:var(--s-3xl) 0}
.pagination .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:44px;height:44px;padding:0;border:1px solid var(--c-border);border-radius:999px;font-weight:500;font-size:.95rem;color:#241B3D;text-decoration:none;transition:all var(--ease)}
.pagination a.page-numbers:hover{border-color:#B48DF5;color:#B48DF5;background:transparent}
.pagination a.page-numbers:focus-visible{outline:2px solid var(--brand-mint);outline-offset:2px}
.pagination .current{background:var(--brand-mint);border-color:var(--brand-mint);color:#1B0A38}
.pagination .next,.pagination .prev{padding:0 20px;gap:6px}
.pagination .dots{border:0;background:transparent;color:var(--c-mid-grey);min-width:auto;padding:0 4px}

/* ── Scroll Top ─────────────────────────────── */
.scroll-top{position:fixed;bottom:24px;right:24px;width:42px;height:42px;border-radius:50%;background:var(--c-navy);color:#fff;border:none;display:flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;transform:translateY(8px);transition:all var(--ease);box-shadow:0 2px 10px rgba(0,0,0,.15);z-index:999}
.scroll-top.visible{opacity:1;visibility:visible;transform:translateY(0)}
.scroll-top:hover{background:var(--c-navy-light);transform:translateY(-2px)}

/* ── Responsive ─────────────────────────────── */
@media(max-width:1024px){
  .posts-grid{grid-template-columns:1fr 1fr}
}
@media(max-width:768px){
  :root{--s-3xl:2.5rem;--s-4xl:3.5rem}
  .site-header{padding:0}
  .site-header__inner{padding:0 16px}
  .header-shell{padding:10px 0;border-radius:0;gap:12px}
  .site-logo__img{height:34px;max-width:170px}
  .menu-toggle{display:inline-flex}
  .header-cta--ghost{display:none}
  .header-cta--primary{padding:10px 18px;font-size:.9rem}
  .main-nav{display:none;position:absolute;top:calc(100% + 8px);left:16px;right:16px;background:rgba(20,7,42,.92);-webkit-backdrop-filter:blur(20px) saturate(150%);backdrop-filter:blur(20px) saturate(150%);border:1px solid rgba(255,255,255,.10);border-radius:18px;box-shadow:0 14px 32px rgba(0,0,0,.45);padding:12px;z-index:100}
  .main-nav.open{display:block}
  .main-nav__list{flex-direction:column!important;align-items:stretch!important;gap:2px!important;width:100%}
  .main-nav__list>li{width:100%}
  .main-nav__list>li>a{padding:12px 14px;font-size:1rem;border-radius:10px}
  .main-nav__list .sub-menu{position:static!important;transform:none!important;background:transparent!important;border:none!important;box-shadow:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:0!important;padding:4px 0 4px 14px!important;min-width:0}
  .posts-grid{grid-template-columns:1fr}
  .site-container{padding:0 var(--s-md)}
}

/* ── Accessibility ──────────────────────────── */
.screen-reader-text{clip:rect(1px,1px,1px,1px);position:absolute!important;height:1px;width:1px;overflow:hidden;word-wrap:normal!important}
.screen-reader-text:focus{background:var(--c-white);border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,.6);clip:auto!important;color:var(--c-heading);display:block;font-size:.9rem;font-weight:600;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}
:focus-visible{outline:2px solid var(--c-link);outline-offset:2px}

/* WP defaults */
.wp-block-image{margin:var(--s-xl) 0}
.aligncenter{text-align:center}
.alignleft{float:left;margin-right:var(--s-lg)}
.alignright{float:right;margin-left:var(--s-lg)}

/* ── Page hero ─────────────────────────────────────────────────
 * Default hero for standalone pages (page.php) and the Tools hub.
 * Clean white background, charcoal pill kicker, large headline, muted
 * subhead, optional meta line. Pillar/topic-hub pages still use
 * Used by the category archive (category.php).
 *
 * Kicker uses the shared mono eyebrow treatment so
 * the brand thread is consistent across page heroes.
 */
.page-hero{
    background:#fff;
    padding:var(--s-3xl) 0;
    color:var(--c-charcoal);
}
.page-hero__content{max-width:760px}
.page-hero__kicker{
    display:inline-block;
    background:var(--c-charcoal);
    color:#fff;
    font-size:.7rem;
    font-weight:700;
    letter-spacing:.08em;
    text-transform:uppercase;
    padding:4px 10px;
    border-radius:3px;
    margin-bottom:var(--s-md);
}
.page-hero__title{
    font-size:clamp(2rem,4vw,3rem);
    font-weight:700;
    line-height:1.18;
    letter-spacing:-.025em;
    color:var(--c-charcoal);
    margin:0 0 var(--s-md);
}
.page-hero__subtitle{
    font-size:1.05rem;
    line-height:1.6;
    color:var(--c-text-light);
    margin:0 0 var(--s-lg);
    max-width:600px;
}
.page-hero__meta{
    display:flex;
    align-items:center;
    gap:var(--s-sm);
    font-size:.85rem;
    color:var(--c-text-light);
}
.page-hero__meta-sep{color:var(--c-light-grey)}

/* Breadcrumb trail inside the page hero — mirrors the structure and
 * size of the article hero breadcrumbs, but with
 * colours adapted for the white page-hero background.
 */
.page-hero__breadcrumbs{
    font-size:.8rem;
    color:var(--c-text-light);
    display:flex;
    align-items:center;
    gap:6px;
    flex-wrap:wrap;
    margin-top:var(--s-lg);
}
.page-hero__breadcrumbs a{color:var(--c-charcoal);text-decoration:none;font-weight:500}
.page-hero__breadcrumbs a:hover{text-decoration:underline}
.page-hero__breadcrumbs .sep{color:var(--c-mid-grey)}
.page-hero__breadcrumbs-current{color:var(--c-text-light)}

@media(max-width:600px){
    .page-hero{padding:var(--s-2xl) 0}
}

/* ── Nuclear nav fix — overrides all WP menu markup ── */
#menu-main-menu,
.site-header ul,
.main-header ul,
#primary-nav ul,
#primary-nav > ul,
.main-nav > ul,
.main-nav__list {
    display: flex !important;
    flex-direction: row !important;
    flex-wrap: wrap !important;
    align-items: center !important;
    gap: 2px !important;
    list-style: none !important;
    list-style-type: none !important;
    padding: 0 !important;
    margin: 0 !important;
}
#menu-main-menu li,
.site-header li,
.main-header li,
#primary-nav li,
.main-nav li,
.main-nav__list li {
    list-style: none !important;
    list-style-type: none !important;
    padding: 0 !important;
    margin: 0 !important;
    position: relative;
}
#menu-main-menu li::before,
#menu-main-menu li::marker,
.site-header li::before,
.site-header li::marker,
#primary-nav li::before,
#primary-nav li::marker {
    display: none !important;
    content: none !important;
}
/* Sub-menus should still be vertical */
.main-nav__list>li.menu-item-has-children::after{content:"";position:absolute;top:100%;left:0;right:0;height:14px;background:transparent}
.main-nav .sub-menu,
.main-nav__list .sub-menu,
#primary-nav .sub-menu {
    display: none !important;
    flex-direction: column !important;
    align-items: stretch !important;
    position: absolute;
    top: calc(100% + 14px);
    left: 50%;
    transform: translateX(-50%);
    background: rgba(20,7,42,.92) !important;
    -webkit-backdrop-filter: blur(20px) saturate(150%);
    backdrop-filter: blur(20px) saturate(150%);
    border: 1px solid rgba(255,255,255,.08) !important;
    border-radius: 0 0 8px 8px !important;
    box-shadow: 0 18px 44px rgba(0,0,0,.5) !important;
    min-width: 248px;
    padding: 10px !important;
    z-index: 100;
}
.main-nav .sub-menu li,
.main-nav__list .sub-menu li,
#primary-nav .sub-menu li {
    padding: 0 !important;
    margin: 0 !important;
    text-indent: 0 !important;
}
.main-nav .sub-menu a,
.main-nav__list .sub-menu a,
#primary-nav .sub-menu a {
    padding: 11px 14px !important;
    margin: 0 !important;
    text-indent: 0 !important;
    font-size: .9rem;
    font-weight: 500;
    color: rgba(255,255,255,.82) !important;
    background: transparent !important;
    border-radius: 10px !important;
    display: block !important;
    transition: color .18s ease, background .18s ease, box-shadow .18s ease;
}
.main-nav .sub-menu a:hover,
.main-nav__list .sub-menu a:hover,
#primary-nav .sub-menu a:hover,
.main-nav .sub-menu a:focus,
.main-nav__list .sub-menu a:focus,
#primary-nav .sub-menu a:focus {
    color: #C9A8FF !important;
    background: transparent !important;
    box-shadow: none !important;
}
.main-nav .sub-menu a:focus-visible,
.main-nav__list .sub-menu a:focus-visible,
#primary-nav .sub-menu a:focus-visible {
    color: #C9A8FF !important;
    background: transparent !important;
    box-shadow: none !important;
    outline: 2px solid #C9A8FF !important;
    outline-offset: 2px;
}
.main-nav .sub-menu .current-menu-item > a,
.main-nav__list .sub-menu .current-menu-item > a,
#primary-nav .sub-menu .current-menu-item > a {
    color: #C9A8FF !important;
    background: transparent !important;
}
.main-nav li:hover > .sub-menu,
.main-nav__list li:hover > .sub-menu,
#primary-nav li:hover > .sub-menu {
    display: flex !important;
}
/* Footer lists — also no bullets */
.site-footer ul,
.site-footer li,
.footer-col ul,
.footer-col li,
.footer-bar__links li {
    list-style: none !important;
    list-style-type: none !important;
    padding: 0 !important;
    margin: 0 !important;
}
.footer-bar__links li::before,
.footer-bar__links li::marker,
.footer-col li::before,
.footer-col li::marker {
    display: none !important;
    content: none !important;
}
/* v3.19.3 — Removed a stale @media(max-width:768px) .main-nav override
   that set background:var(--c-white) and beat the proper navy-gradient
   rule earlier in this file (line ~652). With white-on-white link text
   the open mobile drawer rendered completely blank. The earlier rule
   (aubergine gradient + white text) is the source of truth and now wins. */
@media(max-width:768px){
    .main-nav.open ul,
    .main-nav.open .main-nav__list,
    #primary-nav.open ul {
        flex-direction: column !important;
        align-items: stretch !important;
    }
}

/* ── Logo images ───────────────────────────── */
.site-logo__img{height:48px;width:auto;display:block}
.site-logo--footer .site-logo__img{height:44px}

/* ── Table of Contents (article sidebar — soft white card) ───────────────────
 * Editorial-feeling card that anchors the sticky sidebar. White background,
 * 1px border, rounded corners and a very subtle drop shadow. Numbered list
 * with subtle dividers between items. Sticks to viewport on desktop; layout
 * media query below 1080px restacks it above the body content. */
.soeb-toc{
    background:#ffffff;
    border:1px solid var(--line);
    border-radius:var(--r-lg);
    padding:20px 18px 12px;
    box-shadow:var(--shadow-card);
    position:static; /* sticky behaviour is owned by .soeb-article__sidebar */
}
.soeb-toc__header{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    padding:2px 6px 14px;
    margin-bottom:8px;
    border-bottom:1px solid var(--line);
    cursor:pointer;
    -webkit-user-select:none;
    user-select:none;
}
.soeb-toc__title{
    display:inline-flex;
    align-items:center;
    gap:11px;
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.82rem; /* ~15px */
    font-weight:600;
    text-transform:uppercase;
    letter-spacing:.1em;
    color:#1F1733;
    margin:0;
}
.soeb-toc__title svg{
    flex-shrink:0;
    color:var(--brand);
}
.soeb-toc__toggle{
    background:none;
    border:none;
    padding:4px;
    color:#A79CBD;
    transition:transform var(--ease), color var(--ease);
    display:flex;
    align-items:center;
}
.soeb-toc__toggle:hover{color:var(--brand)}
.soeb-toc__toggle.collapsed{
    transform:rotate(-180deg);
}
.soeb-toc__list{
    list-style:none!important;
    padding:0!important;
    margin:0!important;
}
.soeb-toc__list li{
    list-style:none!important;
    margin:0!important;
    padding:0!important;
    border:0;
}
.soeb-toc__list li::before,
.soeb-toc__list li::marker{
    display:none!important;
    content:none!important;
}
.soeb-toc__list a{
    display:grid;
    grid-template-columns:30px 1fr;
    gap:14px;
    align-items:center;
    padding:9px 10px;
    border-radius:10px;
    font-size:.86rem; /* ~15.5px */
    line-height:1.4;
    font-weight:500;
    color:#57506B;
    text-decoration:none;
    transition:background .15s ease, color .15s ease;
}
.soeb-toc__list a:focus-visible{
    outline:2px solid var(--brand);
    outline-offset:2px;
}
.soeb-toc__list a:hover{
    background:var(--brand-tint);
    color:#1F1733;
}
.soeb-toc__list a.active{
    background:var(--brand-tint);
    color:#1F1733;
    font-weight:700;
}
.soeb-toc__list a .soeb-toc__num{
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.74rem; /* ~13px */
    font-weight:600;
    color:var(--brand);
    width:30px;height:30px;
    border:0;
    border-radius:8px;
    display:inline-grid;
    place-items:center;
    background:var(--brand-tint-2);
    flex-shrink:0;
    transition:background .15s ease, color .15s ease;
}
.soeb-toc__list a:hover .soeb-toc__num{
    background:var(--brand);
    color:#fff;
}
.soeb-toc__list a.active .soeb-toc__num{
    background:var(--brand);
    color:#fff;
}
.soeb-toc__list--h3 a{
    padding-left:26px;
    font-size:.8rem;
}
@media(max-width:1080px){
    .soeb-toc{
        padding:20px 20px 6px;
    }
}

/* ─────────────────────────────────────────────────────────────
   Mobile hamburger toggle — defensive visibility fix
   Forces the menu-toggle visible under 768px with high specificity
   so nothing from a plugin, the Customizer, or a cached stylesheet
   can override it. Updated for the floating header (v3.18.0).
   ───────────────────────────────────────────────────────────── */
@media (max-width: 768px) {
    .site-header .header-shell .menu-toggle,
    #site-header #menu-toggle,
    button.menu-toggle {
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
        visibility: visible !important;
        opacity: 1 !important;
        background: transparent !important;
        border: 1px solid rgba(255,255,255,.18) !important;
        padding: 8px !important;
        color: #fff !important;
        z-index: 1001;
        flex: 0 0 auto;
    }
    .site-header .header-shell .menu-toggle svg,
    #menu-toggle svg {
        width: 24px !important;
        height: 24px !important;
        display: block !important;
    }
    /* Make sure the header-right is allowed to shrink to fit */
    .header-shell .header-right {
        flex: 0 0 auto;
    }
    /* Prevent the logo from hogging all horizontal space */
    .header-shell .site-logo {
        flex: 0 1 auto;
        min-width: 0;
    }
    .header-shell .site-logo__img {
        max-width: 170px !important;
    }
}

/* ── v3.8.1 Privacy policy / legal page background ──────────────────────────
 * Mirrors the .category-archive / Tools Hub treatment: soft #F7F4FC below
 * the hero, hero itself stays white (its own background:#fff in .page-hero).
 * Body class added by soeb_legal_page_body_class() in functions.php — keyed
 * off WordPress's built-in privacy-policy page setting (Settings → Privacy)
 * so it doesn't depend on slug.
 */
body.legal-page{background:#F7F4FC}

/* ─────────────────────────────────────────────────────────────
 * Hub article cards (v3.34.0)
 *
 * Curated "guide tile" treatment for hub-page article groups. A
 * featured (image-led, navy-gradient) lead card plus white-bodied
 * supporting cards, in a layout that adapts to how many cards the
 * group holds: .hub-article-grid--count-1 / -2 / -3 / -4(+).
 *
 * Deliberately namespaced .hub-article-* and used only inside the
 * editorial hub template parts, so the home page's .octo-article-
 * card grid (above) is left completely untouched. Built on the
 * existing --octo-* tokens — no global rules changed. Labels are
 * text-only (no icons), per the brief.
 * ───────────────────────────────────────────────────────────── */

.hub-article-grid{
    --hub-card-radius:22px;
    --hub-card-border:#E3DCF0;
    --hub-card-navy:#1B0A38;
    display:grid;
    gap:22px;
    grid-template-columns:repeat(3,minmax(0,1fr));
    align-items:stretch;
}

/* Shared card shell — image-led, so an aubergine fallback + min-height. */
.hub-article-grid .hub-article-card{
    position:relative;
    min-height:300px;
    background:var(--hub-card-navy);
    border:1px solid var(--hub-card-border);
    border-radius:var(--hub-card-radius);
    overflow:hidden;
    text-decoration:none;
    box-shadow:0 8px 22px rgba(15,23,42,.05);
    transition:transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.hub-article-grid .hub-article-card:hover{
    transform:translateY(-3px);
    border-color:#D5C9EE;
    box-shadow:0 16px 36px rgba(15,23,42,.10);
    color:inherit;
}
/* All cards share the image-led look: the photo fills the whole card, a
 * dark-blue gradient fades up from the bottom, and the label/title/excerpt/
 * link sit over it. Featured cards are simply larger (per count below);
 * supporting cards are smaller but visually identical. */
.hub-article-grid .hub-article-card__media{
    position:absolute;
    inset:0;
    overflow:hidden;
    background:#F1ECFA;
}
.hub-article-grid .hub-article-card__media img{
    width:100%;height:100%;
    object-fit:cover;
    display:block;
    transition:transform .4s ease;
}
.hub-article-grid .hub-article-card:hover .hub-article-card__media img{transform:scale(1.04)}
.hub-article-grid .hub-article-card__scrim{
    position:absolute;
    inset:0;
    background:linear-gradient(180deg,
        rgba(7,23,42,0) 26%,
        rgba(7,23,42,.55) 62%,
        rgba(7,23,42,.92) 100%);
}
.hub-article-grid .hub-article-card__body{
    position:absolute;
    inset:0;
    z-index:1;
    display:flex;
    flex-direction:column;
    justify-content:flex-end;
    gap:10px;
    padding:26px;
}
.hub-article-grid .hub-article-card__label{
    position:absolute;
    top:20px;left:24px;
    margin:0;
    width:fit-content;
    padding:7px 13px;
    border-radius:999px;
    background:rgba(7,23,42,.42);
    border:1px solid rgba(255,255,255,.45);
    color:#fff;
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.64rem;
    font-weight:600;
    letter-spacing:.06em;
    text-transform:uppercase;
    backdrop-filter:blur(3px);
}
.hub-article-grid .hub-article-card__title{
    display:block;
    color:#fff;
    font-weight:700;
    letter-spacing:-.02em;
    line-height:1.3;
    font-size:1.18rem;
}
.hub-article-grid .hub-article-card__excerpt{
    margin:0;
    color:rgba(255,255,255,.86);
    font-size:.92rem;
    line-height:1.5;
    max-width:54ch;
}
.hub-article-grid .hub-article-card__link{
    font-weight:900;
    font-size:.8rem;
    color:#fff;
}
/* Missing featured image — fall back to an aubergine gradient so text stays legible. */
.hub-article-grid .hub-article-card--noimg .hub-article-card__media{
    background:linear-gradient(135deg,#2E1059,#1B0A38);
}

/* Featured cards: same treatment, just larger type + roomier padding. */
.hub-article-grid .hub-article-card--featured .hub-article-card__body{padding:30px}
.hub-article-grid .hub-article-card--featured .hub-article-card__label{top:22px;left:30px}
.hub-article-grid .hub-article-card--featured .hub-article-card__title{font-size:1.45rem}
.hub-article-grid .hub-article-card--featured .hub-article-card__excerpt{font-size:.96rem}

/* ── Count-driven layouts ─────────────────────────────────────── */
/* 1 card — one large, constrained editorial featured card. */
.hub-article-grid--count-1{
    grid-template-columns:minmax(0,1fr);
    max-width:920px;
    margin-inline:auto;
}
.hub-article-grid--count-1 .hub-article-card--featured{min-height:380px}

/* 2 cards — larger featured beside a single supporting card. */
.hub-article-grid--count-2{grid-template-columns:1.7fr 1fr}
.hub-article-grid--count-2 .hub-article-card--featured{min-height:360px}

/* 3 cards — a single row of three, the lead styled as the featured
 * (image-led, aubergine gradient) card and the other two as supporting. */
.hub-article-grid--count-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.hub-article-grid--count-3 .hub-article-card--featured{min-height:340px}

/* Uniform — every card the same size, no featured lead (used by the
 * "All energy bill guides" index). Responsive steps come from the base
 * .hub-article-grid media queries below. */
.hub-article-grid--uniform{grid-template-columns:repeat(3,minmax(0,1fr))}

/* 4+ cards — full-width featured over a three-up supporting grid. */
.hub-article-grid--count-4{grid-template-columns:repeat(3,minmax(0,1fr))}
.hub-article-grid--count-4 .hub-article-card--featured{
    grid-column:1 / -1;
    min-height:360px;
}

/* Stack — every card full container width, one per row. Used by the
 * homepage "Home upgrades" cards, which reuse the featured image-led
 * treatment but read as a vertical stack rather than a grid row. */
.hub-article-grid--stack{grid-template-columns:minmax(0,1fr)}
.hub-article-grid--stack .hub-article-card--featured{min-height:320px}

/* ── Tablet ───────────────────────────────────────────────────── */
@media (max-width:1080px){
    .hub-article-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
    .hub-article-grid--count-1,
    .hub-article-grid--count-2{grid-template-columns:minmax(0,1fr)}
    .hub-article-grid--count-3,
    .hub-article-grid--count-4{grid-template-columns:repeat(2,minmax(0,1fr))}
    .hub-article-grid--count-3 .hub-article-card--featured,
    .hub-article-grid--count-4 .hub-article-card--featured{
        grid-column:1 / -1;
        min-height:320px;
    }
}

/* ── Mobile ───────────────────────────────────────────────────── */
@media (max-width:640px){
    .hub-article-grid,
    .hub-article-grid--count-1,
    .hub-article-grid--count-2,
    .hub-article-grid--count-3,
    .hub-article-grid--count-4{
        grid-template-columns:minmax(0,1fr);
        max-width:none;
        margin-inline:0;
        gap:16px;
    }
    .hub-article-grid .hub-article-card--featured{min-height:300px}
    .hub-article-grid .hub-article-card--featured .hub-article-card__title{font-size:1.25rem}
    .hub-article-grid .hub-article-card--featured .hub-article-card__body{padding:22px}
    .hub-article-grid .hub-article-card--featured .hub-article-card__label{top:18px;left:18px}
}

/* ─────────────────────────────────────────────────────────────
 * SOEB Article — site-wide default for single posts and standard pages
 * v3.14.0
 *
 * Scoped under .soeb-article so it can't leak into the landing-page
 * templates (.octo-page / .sat-page) or any of the bespoke page
 * templates (Hub, Tools, Newsletter, About, Octopus Energy). Every
 * regular blog post (single.php) and every standard page (page.php,
 * non-tool branch) wraps its content in .soeb-article and inherits
 * this design system automatically — no per-post editor changes
 * required for existing content.
 *
 * Architecture mirrors the .octo-page / .sat-page approach: design
 * tokens defined on the wrapper, all component classes prefixed with
 * .soeb-article and most NOT scoped to the wrapper so they can be
 * combined freely. Helper components (callouts, FAQ, stats, CTA card,
 * ranked table) work inside .the_content() output by adding the
 * relevant class via the Gutenberg "Custom HTML" block.
 * ──────────────────────────────────────────────────────────── */

.soeb-article{
    /* Editorial token scale — softer than v3.14.0, refined for the
     * v3.15.0 article redesign. Body/ink/muted move closer to slate
     * scale (#1F1733 / #3A3350 / #6A6180) for a calmer read.
     *
     * v1.0.0 — the accent scale is the aubergine/lilac palette:
     * --sa-blue (a historical name) is now plum #6D3BC4 with #4B1F8C as
     * its hover, #F0E8FF as the soft tint and #E2D3FB as the accent
     * border. Neutral surfaces carry a faint violet cast so they sit on
     * the same scale as the rest of the site. The amber/yellow caution
     * ramp is deliberately UNCHANGED: warning colour has to stay
     * recognisably warning-coloured. */
    --sa-ink:#1F1733;
    --sa-text:#3A3350;
    --sa-muted:#6A6180;
    --sa-line:#E3DCF0;
    --sa-line-soft:#EBE4F7;
    --sa-soft:#F7F4FC;
    --sa-blue:#6D3BC4;
    --sa-blue-dark:#4B1F8C;
    --sa-blue-tint:#F0E8FF;
    --sa-blue-line:#E2D3FB;
    --sa-yellow:#f5a623;       /* warmer, less buttercup than v3.14 */
    --sa-yellow-soft:#fff8eb;
    --sa-yellow-line:#f7d99b;
    --sa-yellow-text:#7c5500;
    --sa-green:#4B1F8C;
    --sa-green-soft:#F0E8FF;
    --sa-green-line:#E2D3FB;
    --sa-amber:#b45309;
    --sa-amber-soft:#fff3e0;
    --sa-amber-line:#f9b878;
    --sa-amber-text:#7c3a00;
    --sa-shadow:0 20px 50px rgba(27,10,56,.07);
    --sa-shadow-soft:0 8px 22px rgba(27,10,56,.05);
    --sa-radius-card:22px;
    --sa-radius-small:16px;
    --sa-reading-w:800px;
    --sa-container-w:1256px;

    background:#fff;
    color:var(--sa-ink);
    line-height:1.65;
    overflow:hidden; /* contain side-card shadows from causing horizontal scroll */
}

/* Reset baseline so editor-output prose adopts the design tokens. */
.soeb-article :where(h1,h2,h3,h4){
    color:var(--sa-ink);
    letter-spacing:-.025em;
    line-height:1.15;
    font-weight:800;
    margin:0;
}

/* ── Hero ─────────────────────────────────────────────────── */
/* v3.17.0: hero is now a defined card-style panel. The card edges
 * sit flush with the header by filling the full .site-container
 * width — the previous --sa-container-w constraint on the inner
 * wrapper has been removed so it matches the header's content edges.
 * Breadcrumbs sit ABOVE the card in the .site-container (normal
 * flow); the card starts with the category badge. */
.soeb-article__hero{
    /* v3.17.4: bumped top padding 32 → 40px to give the breadcrumbs
     * + card a clearer breathing space above. */
    padding:40px 0 0;
    background:#fff;
}
.soeb-article__hero .site-container{
    max-width:var(--w-site);
}

/* Breadcrumbs — sit above the card, on the white page background.
 * margin-bottom creates the clear gap between the breadcrumb row
 * and the top edge of the card. */
.soeb-article__hero > .site-container > .soeb-article__crumbs{
    margin-bottom:22px;
}

/* The card itself: neutral off-white surface, soft cool grey-blue
 * border, premium long-throw shadow.
 * v3.19.4: replaced the v3.17.5 pale blue treatment (#f5f9fc / #d8e8ee
 * / 0 18px 50px rgba shadow). The earlier blue read slightly too
 * "template" against the dark aubergine header. The new neutral palette
 * (#F7F4FC surface, #EBE4F7 hairline, longer/softer shadow) feels
 * cleaner and more editorial without changing any structure,
 * padding, radius, layout or typography. */
.soeb-article__hero-inner{
    background:#F7F4FC;
    border:1px solid #EBE4F7;
    border-radius:32px;
    box-shadow:0 24px 60px rgba(15,23,42,.08);
    padding:29px 34px;
}
/* v3.16.0: when a featured image is present, the hero is a 2-column
 * grid — text content on the left, featured image on the right.
 * v3.17.4: image column is now `minmax(420px, 0.9fr)` — it stays at
 * least 420px wide so the image reads confidently, but is slightly
 * narrower than the text column on wide viewports so the editorial
 * content remains the visual lead. */
.soeb-article__hero-inner--has-image{
    display:grid;
    grid-template-columns:minmax(0,1fr) minmax(420px,.9fr);
    gap:48px;
    align-items:center;
}
.soeb-article__hero-content{
    min-width:0; /* allow grid item to shrink so long words don't overflow */
}
.soeb-article__crumbs{
    font-size:.78rem; /* ~14px */
    color:var(--sa-muted);
    display:flex;
    align-items:center;
    gap:6px;
    flex-wrap:wrap;
    margin-bottom:18px;
    letter-spacing:.005em;
}
.soeb-article__crumbs a{
    color:var(--sa-muted);
    text-decoration:none;
    transition:color .15s ease;
}
.soeb-article__crumbs a:hover{color:var(--sa-blue-dark)}
.soeb-article__crumbs .sep{opacity:.45}
.soeb-article__crumbs-current{color:var(--sa-ink);font-weight:600}

.soeb-article__eyebrow{
    display:inline-flex;align-items:center;gap:9px;
    /* On the blue-tinted card the eyebrow is more legible against
     * white than the same tint as the card itself. */
    border:1px solid rgba(139,92,246,.22);
    background:#fff;
    color:var(--sa-blue-dark);
    border-radius:999px;
    padding:6px 12px;
    font-size:.68rem; /* ~12px */
    font-weight:800;letter-spacing:.05em;
    text-transform:uppercase;
    text-decoration:none;
    width:fit-content;
    margin-bottom:18px;
}
.soeb-article__eyebrow::before{
    content:"";width:6px;height:6px;border-radius:50%;
    background:var(--sa-blue);
    flex-shrink:0;
}
/* v3.35.13: no leading dot on the category tag in the hero (both the light
 * and Spotlight heroes). Scoped to .soeb-article__hero-content so the
 * "Keep reading" related-posts label, which reuses .soeb-article__eyebrow,
 * keeps its dot. */
.soeb-article__hero-content .soeb-article__eyebrow::before{
    content:none;
}

.soeb-article__title{
    /* v3.17.4: scaled back to read as an article title rather than a
     * homepage hero — 38px floor, 3.3vw fluid mid, 52px ceiling, with
     * a 720px cap so it doesn't get wide on full-bleed viewports. */
    font-size:clamp(38px, 3.3vw, 52px);
    line-height:1.08;
    letter-spacing:-.04em;
    font-weight:700;
    color:var(--sa-ink);
    margin:0 0 16px;
    max-width:720px;
}
/* When there's no featured image, the hero is a single text column —
 * give the title back the larger original sizing it had pre-v3.16.0
 * so wide hero panels don't look sparse. */
.soeb-article__hero-inner:not(.soeb-article__hero-inner--has-image) .soeb-article__title{
    font-size:clamp(2.333rem, 5vw, 4rem);
    line-height:1.05;
    max-width:880px;
}
/* Optional inline highlight on a phrase within the H1 or H2. */
.soeb-article .soeb-highlight{
    background:linear-gradient(180deg,transparent 60%,var(--sa-yellow) 60%);
    padding-inline:4px;
    margin-inline:-4px;
}

/* v3.17.0: short accent line that sits between the H1 and the lead
 * paragraph. Matches the inline link / H2 accent colour so the whole
 * editorial system reads as one. */
.soeb-article__accent-line{
    display:block;
    width:64px;
    height:3px;
    border-radius:999px;
    background:var(--sa-blue);
    margin:0 0 20px;
}

.soeb-article__lead{
    /* v3.17.5: nudged down — 17 → 20px instead of 18 → 22px so the
     * lead sits a bit more subordinate to the H1. */
    font-size:clamp(17px, 1.3vw, 20px);
    line-height:1.55;
    color:var(--sa-text);
    font-weight:400;
    margin:0 0 20px;
    max-width:640px;
}

.soeb-article__meta{
    display:flex;
    flex-wrap:wrap;
    gap:14px 22px;
    align-items:center;
    /* v3.17.4: more generous space above the divider; subtle 10%
     * slate rule. No bottom border so the card stays open at its
     * base edge.
     * v3.19.4: divider colour swapped to slate-200 (#E3DCF0) so it
     * reads cleanly against the new #F7F4FC card surface — subtle
     * but visible. */
    padding:20px 0 0;
    margin-top:24px;
    border-top:1px solid #E3DCF0;
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.78rem; /* ~14px, mono runs a touch wider */
    letter-spacing:.01em;
    color:var(--sa-muted);
    font-weight:500;
    max-width:640px;
}
.soeb-article__meta-item{display:inline-flex;align-items:center;gap:8px}
.soeb-article__meta b{color:var(--sa-ink);font-weight:700}
.soeb-article__meta-dot{opacity:.4}
.soeb-article__avatar{
    width:26px;height:26px;border-radius:50%;
    background:var(--sa-blue-tint);
    color:var(--sa-blue-dark);
    display:inline-flex;align-items:center;justify-content:center;
    font-weight:800;font-size:.7rem;letter-spacing:.02em;
}
.soeb-article__byline{color:var(--sa-ink);font-weight:600}

/* Featured image — v3.16.0: now lives inside the right column of the
 * hero grid. Fills its grid cell, keeps the rounded corners + soft
 * shadow. The legacy .soeb-article__featured wrapper (full-bleed band
 * below the hero) is no longer rendered by single.php / page.php but
 * the .soeb-article__featured-img class is reused inside the new
 * .soeb-article__hero-featured column. */
.soeb-article__hero-featured{
    min-width:0; /* allow shrinking inside the grid cell */
}
.soeb-article__featured-img{
    margin:0;
    border-radius:24px;
    overflow:hidden;
    box-shadow:0 20px 50px rgba(27,10,56,.07);
}
.soeb-article__featured-img img{
    display:block;width:100%;height:auto;
}
/* v3.17.3: when the hero is in the 2-column grid (has-image variant),
 * give the featured image a fixed height + object-fit: cover so the
 * image column reads with equal visual weight to the text column.
 * v3.17.4: trimmed from 420 → 380px to keep the overall card from
 * feeling like a homepage hero. Reset back to natural aspect ratio
 * at the tablet breakpoint when the grid stacks (see the
 * max-width:1080px block below). */
.soeb-article__hero-inner--has-image .soeb-article__featured-img{
    height:380px;
}
.soeb-article__hero-inner--has-image .soeb-article__featured-img img{
    height:100%;
    object-fit:cover;
}
.soeb-article__featured-img figcaption{
    font-size:.78rem;color:var(--sa-muted);
    padding:12px 16px;
    background:var(--sa-soft);
    border-top:1px solid var(--sa-line);
    text-align:center;
}

/* ── Body layout (main + sidebar) ───────────────────────── */
.soeb-article__layout{
    display:grid;
    grid-template-columns:minmax(0,var(--sa-reading-w)) 300px;
    gap:80px;
    max-width:var(--sa-container-w);
    /* v3.17.4: 64px below the hero card per design spec — enough
     * separation to read as two distinct sections without making
     * the article feel disconnected from the header. */
    margin:64px auto 0;
    align-items:start;
}
.soeb-article__main{
    min-width:0; /* allow grid item to shrink so wide tables don't blow it out */
}
.soeb-article__body{
    max-width:var(--sa-reading-w);
    font-size:1rem; /* 18px @ html font-size:18px */
    line-height:1.75;
    color:var(--sa-text);
}
.soeb-article__sidebar{
    position:sticky;
    top:110px;
    align-self:start;
}

/* ── Tool feature section (v3.24.2) ─────────────────────────
 * Wider, centred wrapper used by tool pages (e.g. the Direct
 * Debit Calculator) for the first content block after the hero.
 * Breaks out of the .soeb-article__layout grid so a calculator
 * block can sit centred on the page with no TOC/sidebar, while
 * the explanatory copy below it stays in the normal reading
 * column. Activated by the page template (page.php) on a small
 * allow-list of pages — never global. */
.tool-feature-section{
    max-width:1140px;
    margin:64px auto 0;
    padding:0 24px;
}
.tool-feature-section > *{
    max-width:100%;
}
@media (max-width:900px){
    .tool-feature-section{
        margin:48px auto 0;
        padding:0 20px;
    }
}
@media (max-width:720px){
    .tool-feature-section{
        margin:36px auto 0;
        padding:0 16px;
    }
}

/* ── Prose: H2 with subtle blue vertical accent ─────────── */
.soeb-article__body h2{
    position:relative;
    /* 30px → 46px clamp — strong but controlled, not the old inflated H2. */
    font-size:clamp(1.667rem, 3.5vw, 2.556rem);
    line-height:1.12;
    letter-spacing:-.025em;
    font-weight:800;
    color:var(--sa-ink);
    margin:64px 0 22px;
    /* v3.35.10: blue left accent bar removed per request. Heading now sits
     * flush-left with the body text (was padding-left:22px to clear the bar). */
    padding-left:0;
    border:0;
    scroll-margin-top:110px;
}
.soeb-article__body h2:first-child{margin-top:8px}

/* H3 — calmer than v3.14 (no cyan left rule). */
.soeb-article__body h3{
    font-size:1.333rem; /* ~24px */
    line-height:1.25;
    letter-spacing:-.015em;
    font-weight:800;
    color:var(--sa-ink);
    margin:36px 0 14px;
    padding-left:0;
    border-left:0;
    scroll-margin-top:110px;
}
.soeb-article__body h4{
    font-size:1.111rem; /* ~20px */
    line-height:1.3;
    letter-spacing:-.01em;
    font-weight:700;
    color:var(--sa-ink);
    margin:28px 0 10px;
}

/* Content heading colour — blog posts and standard pages both render
 * inside .soeb-article__body, so this covers both (v3.35.53). The hero
 * H1 (.soeb-article__title) is unaffected — it stays white on the hero. */
.soeb-article__body h1,
.soeb-article__body h2,
.soeb-article__body h3,
.soeb-article__body h4,
.soeb-article__body h5,
.soeb-article__body h6{
    color:#1F1733;
}

.soeb-article__body p{
    font-size:1rem;
    line-height:1.75;
    color:var(--sa-text);
    margin:0 0 1.45em;
}
.soeb-article__body p a,
.soeb-article__body li a,
.soeb-article__body blockquote a{
    color:var(--brand);
    text-decoration:underline;
    text-decoration-thickness:1px;
    text-underline-offset:3px;
    font-weight:500;
    transition:text-decoration-thickness .15s ease, color .15s ease;
}
.soeb-article__body p a:hover,
.soeb-article__body li a:hover,
.soeb-article__body blockquote a:hover{
    color:var(--brand-deep);
    text-decoration-thickness:2px;
}
.soeb-article__body p a:focus-visible,
.soeb-article__body li a:focus-visible,
.soeb-article__body blockquote a:focus-visible{
    outline:2px solid var(--brand);
    outline-offset:2px;
    border-radius:3px;
}
.soeb-article__body strong,
.soeb-article__body b{color:var(--sa-ink);font-weight:700}
.soeb-article__body em,
.soeb-article__body i{font-style:italic}

/* Lists — native markers in muted brand blue (was warm yellow in
 * v3.14 → v3.26; the yellow read as "template" rather than editorial
 * and clashed with the wider site palette). Comfortable item spacing
 * without huge gaps. Override the global `ul,ol{list-style:none}`
 * reset so editor-output bullets are visible. */
.soeb-article__body ul{
    list-style:disc;
    margin:1.2em 0 1.8em;
    padding-left:1.4em;
}
.soeb-article__body ul > li{
    margin:0 0 .65em;
    padding-left:.3em;
    font-size:1rem;
    line-height:1.7;
    color:var(--sa-text);
}
.soeb-article__body ul > li::marker{
    color:var(--brand);
}
.soeb-article__body ul ul{
    margin:.4em 0 .6em;
    list-style:circle;
}

.soeb-article__body ol{
    list-style:decimal;
    margin:1.2em 0 1.8em;
    padding-left:1.6em;
    counter-reset:none;
}
.soeb-article__body ol > li{
    margin:0 0 .65em;
    padding-left:.3em;
    font-size:1rem;
    line-height:1.7;
    color:var(--sa-text);
}
.soeb-article__body ol > li::marker{
    color:var(--brand);
    font-weight:700;
}
/* Reset old counter-based ::before bullets from v3.14 — they'd
 * double up with the native markers above. */
.soeb-article__body ul > li::before,
.soeb-article__body ol > li::before{
    content:none;
}

/* Blockquote / pull quote */
.soeb-article__body blockquote{
    background:var(--sa-soft);
    border-left:4px solid var(--sa-yellow);
    border-radius:14px;
    padding:22px 26px;
    margin:32px 0;
    position:relative;
}
.soeb-article__body blockquote p{
    font-size:1.083rem; /* ~19.5px */
    line-height:1.55;
    font-weight:500;
    color:var(--sa-ink);
    letter-spacing:-.01em;
    margin:0 0 8px;
}
.soeb-article__body blockquote p:last-child{margin-bottom:0}
.soeb-article__body blockquote cite{
    font-size:.78rem;
    color:var(--sa-muted);
    font-weight:700;
    text-transform:uppercase;
    letter-spacing:.05em;
    font-style:normal;
    display:block;
}

/* Horizontal rule */
.soeb-article__body hr{
    border:0;
    height:1px;
    background:var(--sa-line);
    margin:40px 0;
}

/* Inline figures and images */
.soeb-article__body figure,
.soeb-article__body img{margin:36px 0;max-width:100%}
.soeb-article__body figure img,
.soeb-article__body > img,
.soeb-article__body p > img{
    display:block;
    width:100%;
    height:auto;
    border-radius:18px;
}
.soeb-article__body figure figcaption,
.soeb-article__body .wp-caption-text{
    font-size:.78rem; /* ~14px */
    color:var(--sa-muted);
    margin-top:10px;
    text-align:center;
    font-style:normal;
    line-height:1.5;
}

/* ── Tables (auto styling for the_content() output) ──────── *
 * Soft editorial card look — used by every table inside an article
 * body, regardless of how the editor wrapped it. Three possible
 * outer-container shapes are handled:
 *
 *   1. <figure class="wp-block-table"><table>…</table></figure>
 *      (block-editor default)
 *   2. <div class="table-wrap"><table>…</table></div>
 *      (added by soeb_wrap_tables_in_content() in functions.php
 *       for bare <table> tags pasted into the editor)
 *   3. <figure class="wp-block-table"><div class="table-wrap">
 *        <table>…</table></div></figure>
 *      (block-editor table that's then been wrapped by the PHP
 *       filter — the most common case in practice)
 *
 * Whichever shape, the OUTER element gets the card chrome (border,
 * radius, soft shadow, white background). When both a figure and an
 * inner .table-wrap exist, the inner one collapses to transparent so
 * we don't double up.
 *
 * Cell rules use border-collapse:separate with bottom-only borders for
 * a clean editorial look (no vertical column rules). A 2px yellow
 * accent underlines the header row to echo the brand highlight used
 * in the article hero.
 *
 * v3.28.1: previous version's `.soeb-article__body > table` rule never
 * matched in production because the PHP filter wraps every bare table
 * in .table-wrap. .table-wrap is now in the wrapper selector list so
 * those tables pick up the card chrome correctly. */
.soeb-article__body .wp-block-table,
.soeb-article__body figure.wp-block-table,
.soeb-article__body .table-wrap,
.soeb-article__body .soeb-table,
.soeb-article__body table{
    --sa-ink:#1F1733;                 /* near-black — bold labels / first column */
    --sa-text:#3A3350;                /* body cell text */
    --sa-line:var(--line);            /* hairline divider */
    --sa-line-soft:#F1ECFA;           /* fainter hairline */
    --sa-soft:var(--table-head);      /* deep aubergine header bar */
    --sa-blue:var(--brand);           /* links → brand green */
    --sa-blue-dark:var(--brand-deep); /* link hover */
    --sa-shadow-soft:0 10px 30px rgba(27,10,56,.08);
}
.soeb-article__body .wp-block-table,
.soeb-article__body figure.wp-block-table,
.soeb-article__body .table-wrap,
.soeb-article__body .soeb-table{
    margin:32px 0;
    background:#ffffff;
    border:1px solid var(--sa-line);
    border-radius:16px;
    overflow-x:auto;
    overflow-y:hidden;
    -webkit-overflow-scrolling:touch;
    box-shadow:var(--sa-shadow-soft);
    position:relative;
    max-width:100%;
}
/* Nested case: figure > .table-wrap — the figure already provides the
 * card chrome, so the inner wrapper goes transparent. */
.soeb-article__body figure.wp-block-table > .table-wrap{
    background:transparent;
    border:0;
    border-radius:0;
    box-shadow:none;
    margin:0;
    overflow:visible;
}
/* Neutralise WP block-editor figure defaults that would otherwise leak
 * through (padding, dotted borders, etc). */
.soeb-article__body figure.wp-block-table{padding:0}

.soeb-article__body table,
.soeb-article__body .wp-block-table table,
.soeb-article__body .table-wrap table{
    width:100%;
    min-width:100%;
    border-collapse:separate;
    border-spacing:0;
    font-family:var(--font);
    font-size:.92rem;
    margin:0;
    background:transparent;
    border:0;
}
/* Header row — light editorial style for the data-column headers.
 * The first column gets the dark aubergine treatment (see the first-column
 * rules below) so the table reads as a row-labelled matrix: dark
 * "spine" down the left, light data area to the right.
 *
 * v3.28.3: aubergine treatment moved from the entire header row to the
 * leftmost column only (both header and body). Yellow underline
 * removed — the aubergine spine is the visual anchor now. */
.soeb-article__body table thead th,
.soeb-article__body table thead td{
    text-align:left;
    padding:15px 18px;
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.68rem; /* ~12px */
    font-weight:500;
    color:var(--table-head-label);
    text-transform:uppercase;
    letter-spacing:.1em;
    background:var(--sa-soft);
    border:0;
    border-bottom:0;
    vertical-align:top;
}
/* No-thead fallback: row 1 with <th> cells gets the same header look. */
.soeb-article__body table > tr:first-child > th,
.soeb-article__body table > tbody > tr:first-child > th{
    text-align:left;
    padding:15px 18px;
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.68rem;
    font-weight:500;
    color:var(--table-head-label);
    text-transform:uppercase;
    letter-spacing:.1em;
    background:var(--sa-soft);
    border:0;
    border-bottom:0;
    vertical-align:top;
}
/* Body rows. */
.soeb-article__body table td{
    padding:16px 18px;
    color:var(--sa-text);
    background:transparent;
    border:0;
    border-bottom:1px solid var(--sa-line-soft);
    vertical-align:top;
    line-height:1.55;
    font-size:.92rem;
}
/* Row-header <th> (scope="row") in the body — picked up by the
 * first-column rules below, but if it's NOT the first cell (rare)
 * still keep it light/ink. */
.soeb-article__body table tbody th{
    padding:16px 18px;
    color:var(--sa-ink);
    background:transparent;
    border:0;
    border-bottom:1px solid var(--sa-line-soft);
    vertical-align:top;
    line-height:1.55;
    font-size:.92rem;
    font-weight:600;
    text-align:left;
}
/* Zebra striping — faint lilac on even rows; lilac wash on hover. */
.soeb-article__body table tbody tr:nth-child(even){background:var(--brand-zebra)}
.soeb-article__body table tbody tr:hover{background:var(--brand-tint)}
.soeb-article__body table tbody tr:last-child td{border-bottom:0}

/* ── First-column "spine" — the leftmost cell in every row (header
 * and body) gets the dark aubergine gradient and white text. Only the
 * top-left cell carries the radial teal glow; every other spine cell
 * is solid aubergine so the highlight reads as a single anchor point,
 * matching the .octo-card--dark treatment (where the glow appears
 * once in the corner, not repeated). */
/* ── First column = the row label (e.g. Supplier). On the new light
 * card there is no dark spine: the column sits on the same white / zebra
 * / hover surface as the rest of the row, and bold near-black text is the
 * only emphasis. The header-row first cell keeps the green-bar mono label
 * styling from the thead rules above (nothing to override here). */
.soeb-article__body table tbody tr td:first-child,
.soeb-article__body table tbody tr th:first-child{
    color:var(--sa-ink);
    font-weight:700;
}
.soeb-article__body table td:first-child strong,
.soeb-article__body table td:first-child b,
.soeb-article__body table th:first-child strong,
.soeb-article__body table th:first-child b{color:var(--sa-ink)}
.soeb-article__body table strong,
.soeb-article__body table b{color:var(--sa-ink)}
/* Link colours follow the new "dark spine" pattern:
 *   - Cells in the dark first column → yellow links (for contrast on aubergine)
 *   - All other cells (header data cells + body data cells) → teal blue
 *   - First-column body <b>/<strong> stays white (set in spine rule above) */
.soeb-article__body table a{
    color:var(--sa-blue);
    text-decoration:underline;
    text-underline-offset:2px;
    text-decoration-thickness:1px;
}
.soeb-article__body table a:hover{color:var(--sa-blue-dark)}
.soeb-article__body table td:first-child a,
.soeb-article__body table th:first-child a{
    color:var(--brand-deep);
}
.soeb-article__body table td:first-child a:hover,
.soeb-article__body table th:first-child a:hover{color:var(--brand)}

/* Scroll-hint fade — a subtle white gradient on the right edge tells
 * readers a wide table can scroll. Hidden by default on desktop; the
 * mobile media query below shows it unconditionally. */
.soeb-article__body .wp-block-table::after,
.soeb-article__body figure.wp-block-table::after,
.soeb-article__body .table-wrap::after{
    content:'';
    position:absolute;
    top:0;right:0;bottom:0;
    width:32px;
    background:linear-gradient(to right,rgba(255,255,255,0),#ffffff);
    pointer-events:none;
    opacity:0;
    transition:opacity var(--ease,180ms);
    border-radius:0 16px 16px 0;
}
.soeb-article__body .wp-block-table.is-scrollable::after,
.soeb-article__body figure.wp-block-table.is-scrollable::after,
.soeb-article__body .table-wrap.is-scrollable::after{opacity:1}
.soeb-article__body .wp-block-table.scrolled-end::after,
.soeb-article__body figure.wp-block-table.scrolled-end::after,
.soeb-article__body .table-wrap.scrolled-end::after{opacity:0}
/* If the figure wraps an inner .table-wrap, only the outer figure
 * should show the fade. */
.soeb-article__body figure.wp-block-table > .table-wrap::after{content:none}

/* Desktop wide-table break-out (v3.28.5).
 * Opt-in per table. Article-body tables default to
 * staying within the article reading column (which is naturally narrow
 * for readability); only tables explicitly marked .is-wide-table or
 * .wide-table break out to a centred, viewport-anchored max-width.
 * main.js auto-adds .is-wide-table to tables with 4+ columns. */
@media(min-width:1025px){
    .soeb-article__body .table-wrap.is-wide-table,
    .soeb-article__body .table-wrap.wide-table,
    .soeb-article__body .wp-block-table.is-wide-table,
    .soeb-article__body .wp-block-table.wide-table,
    .soeb-article__body figure.wp-block-table.is-wide-table,
    .soeb-article__body figure.wp-block-table.wide-table,
    .soeb-article__body .table-wrap:has(> table.is-wide-table),
    .soeb-article__body .table-wrap:has(> table.wide-table),
    .soeb-article__body .wp-block-table:has(> table.is-wide-table),
    .soeb-article__body .wp-block-table:has(> table.wide-table),
    .soeb-article__body figure.wp-block-table:has(> table.is-wide-table),
    .soeb-article__body figure.wp-block-table:has(> table.wide-table),
    .soeb-article__body figure.wp-block-table:has(> .table-wrap > table.is-wide-table),
    .soeb-article__body figure.wp-block-table:has(> .table-wrap > table.wide-table){
        /* Left-aligned with the article text; extends rightward into
         * the sidebar's empty space. JS clamps via --soeb-wt-maxw on
         * narrow desktops. */
        width:var(--soeb-wt-maxw, min(1100px, 92vw));
        max-width:var(--soeb-wt-maxw, 92vw);
        margin-left:0;
    }
    .soeb-article__body figure.wp-block-table.is-wide-table .table-wrap,
    .soeb-article__body figure.wp-block-table.wide-table .table-wrap,
    .soeb-article__body figure.wp-block-table:has(> .table-wrap > table.is-wide-table) .table-wrap,
    .soeb-article__body figure.wp-block-table:has(> .table-wrap > table.wide-table) .table-wrap{
        width:100%;
        max-width:100%;
        margin-left:0;
    }
}

/* Mobile: stacked row-card layout (v3.28.5).
 * Replaces the prior min-width:560px forced-scroll pattern. Each
 * <tbody> row becomes a card; each <td> shows the matching column
 * header text as a label above its value (label is injected via
 * data-label by main.js). The dark aubergine spine and zebra striping are
 * stripped on mobile because they don't translate to vertical stacks
 * — each card already reads as a self-contained block. */
@media(max-width:720px){
    /* Wrapper: strip the outer card chrome — row cards carry their own. */
    .soeb-article__body .wp-block-table,
    .soeb-article__body figure.wp-block-table,
    .soeb-article__body .table-wrap,
    .soeb-article__body .soeb-table{
        margin:24px 0;
        overflow:visible;
        background:transparent;
        border:0;
        border-radius:0;
        box-shadow:none;
        padding:0;
    }
    .soeb-article__body .wp-block-table::after,
    .soeb-article__body figure.wp-block-table::after,
    .soeb-article__body .table-wrap::after{content:none}

    /* Table: drop table semantics so children can stack as block elements. */
    .soeb-article__body .wp-block-table table,
    .soeb-article__body figure.wp-block-table table,
    .soeb-article__body .table-wrap table,
    .soeb-article__body > table{
        display:block;
        width:100%;
        min-width:0;
        background:transparent;
        font-size:.92rem;
    }
    /* Hide thead — labels are repeated per-cell via data-label. */
    .soeb-article__body .wp-block-table table thead,
    .soeb-article__body figure.wp-block-table table thead,
    .soeb-article__body .table-wrap table thead,
    .soeb-article__body > table thead{display:none}

    .soeb-article__body .wp-block-table table tbody,
    .soeb-article__body .wp-block-table table tfoot,
    .soeb-article__body figure.wp-block-table table tbody,
    .soeb-article__body figure.wp-block-table table tfoot,
    .soeb-article__body .table-wrap table tbody,
    .soeb-article__body .table-wrap table tfoot,
    .soeb-article__body > table tbody,
    .soeb-article__body > table tfoot{display:block}

    /* Each row → card. */
    .soeb-article__body .wp-block-table table tbody tr,
    .soeb-article__body .wp-block-table table tfoot tr,
    .soeb-article__body figure.wp-block-table table tbody tr,
    .soeb-article__body figure.wp-block-table table tfoot tr,
    .soeb-article__body .table-wrap table tbody tr,
    .soeb-article__body .table-wrap table tfoot tr,
    .soeb-article__body > table tbody tr,
    .soeb-article__body > table tfoot tr{
        display:block;
        background:#ffffff;
        border:1px solid var(--sa-line);
        border-radius:14px;
        box-shadow:var(--sa-shadow-soft);
        padding:6px 0;
        margin:0 0 14px;
        overflow:hidden;
    }
    .soeb-article__body .wp-block-table table tbody tr:last-child,
    .soeb-article__body figure.wp-block-table table tbody tr:last-child,
    .soeb-article__body .table-wrap table tbody tr:last-child,
    .soeb-article__body > table tbody tr:last-child{margin-bottom:0}

    /* Each cell → stacked label/value. */
    .soeb-article__body .wp-block-table table tbody td,
    .soeb-article__body .wp-block-table table tbody th,
    .soeb-article__body .wp-block-table table tfoot td,
    .soeb-article__body figure.wp-block-table table tbody td,
    .soeb-article__body figure.wp-block-table table tbody th,
    .soeb-article__body figure.wp-block-table table tfoot td,
    .soeb-article__body .table-wrap table tbody td,
    .soeb-article__body .table-wrap table tbody th,
    .soeb-article__body .table-wrap table tfoot td,
    .soeb-article__body > table tbody td,
    .soeb-article__body > table tbody th,
    .soeb-article__body > table tfoot td{
        display:block;
        width:100%;
        padding:10px 16px;
        border:0;
        border-bottom:1px solid var(--sa-line-soft);
        background:transparent !important;
        color:var(--sa-text) !important;
        text-align:left;
        font-weight:400;
        text-transform:none;
        letter-spacing:normal;
        font-size:.92rem;
        line-height:1.55;
    }
    .soeb-article__body .wp-block-table table tbody tr > *:last-child,
    .soeb-article__body figure.wp-block-table table tbody tr > *:last-child,
    .soeb-article__body .table-wrap table tbody tr > *:last-child,
    .soeb-article__body > table tbody tr > *:last-child{border-bottom:0}

    /* First cell — the row label (supplier). On mobile it anchors the
     * card with a faint lilac tint and bold near-black text. */
    .soeb-article__body .wp-block-table table tbody tr td:first-child,
    .soeb-article__body .wp-block-table table tbody tr th:first-child,
    .soeb-article__body figure.wp-block-table table tbody tr td:first-child,
    .soeb-article__body figure.wp-block-table table tbody tr th:first-child,
    .soeb-article__body .table-wrap table tbody tr td:first-child,
    .soeb-article__body .table-wrap table tbody tr th:first-child,
    .soeb-article__body > table tbody tr td:first-child,
    .soeb-article__body > table tbody tr th:first-child{
        background:var(--brand-tint) !important;
        color:var(--sa-ink) !important;
        font-weight:700;
    }
    .soeb-article__body table tbody td:first-child strong,
    .soeb-article__body table tbody td:first-child b,
    .soeb-article__body table tbody th:first-child strong,
    .soeb-article__body table tbody th:first-child b{color:var(--sa-ink) !important}
    /* Restore link colour in the first cell now that the aubergine bg is gone. */
    .soeb-article__body table tbody td:first-child a,
    .soeb-article__body table tbody th:first-child a{color:var(--sa-blue)}
    .soeb-article__body table tbody td:first-child a:hover,
    .soeb-article__body table tbody th:first-child a:hover{color:var(--sa-blue-dark)}

    /* The label, injected from data-label. */
    .soeb-article__body table tbody td[data-label]::before,
    .soeb-article__body table tfoot td[data-label]::before{
        content:attr(data-label);
        display:block;
        font-family:'IBM Plex Mono',ui-monospace,monospace;
        font-size:.62rem;
        font-weight:500;
        text-transform:uppercase;
        letter-spacing:.1em;
        color:var(--brand);
        margin-bottom:4px;
    }
    .soeb-article__body table tbody td:first-child:not([data-label])::before{content:none}

    /* Ranked-table winner tint — on mobile, paint the card itself, not
     * the individual td backgrounds (which are transparent now). */
    .soeb-article__body .soeb-table--ranked tr.soeb-table-winner,
    .soeb-article__body table.soeb-table--ranked tr.soeb-table-winner{
        background:var(--brand-tint-2);border-color:var(--brand);
    }
}

/* Ranked table modifier — adds winner-row tint and richer chrome.
 * Add `soeb-table--ranked` class to the table or its wrapper. The
 * featured row uses the `soeb-table-winner` class.
 * v3.28.2: tint applied to <td> cells (not the <tr>) so it overrides
 * the new td-level zebra-stripe rule. */
.soeb-article__body .soeb-table--ranked tr.soeb-table-winner td,
.soeb-article__body table.soeb-table--ranked tr.soeb-table-winner td{
    background:var(--brand-tint);
}
.soeb-article__body .soeb-winner-pill{
    display:inline-flex;align-items:center;gap:5px;
    background:var(--brand);
    border-radius:999px;
    padding:3px 9px;
    font-size:.62rem;
    font-weight:700;
    color:#ffffff;
    text-transform:uppercase;
    letter-spacing:.06em;
    margin-left:8px;
    vertical-align:middle;
}
.soeb-article__body .soeb-rating-chip{
    display:inline-block;
    background:var(--brand-zebra);
    border:1px solid var(--sa-line);
    color:var(--sa-ink);
    border-radius:999px;
    padding:5px 11px;
    font-size:.75rem;
    font-weight:800;
    line-height:1;
}
.soeb-article__body .soeb-rating-chip--gold{
    background:rgba(245,166,35,.16);border-color:rgba(245,166,35,.42);color:#f3c980;
}
.soeb-article__body .soeb-rating-chip--green{
    background:rgba(201,168,255,.16);border-color:rgba(201,168,255,.45);color:#C9A8FF;
}

/* ── Optional helper components (added via Custom HTML block) ─
 * Drop these snippets into a post via Gutenberg's "Custom HTML"
 * block. Class names are stable and won't change. */

/* ── Default reusable callouts ──────────────────────────── *
 * Generic class names suitable for any article. Use plain HTML:
 *   <div class="article-note"><strong>Note</strong> Useful info…</div>
 *   <div class="article-tip"><strong>Tip</strong> Something to try…</div>
 *   <div class="article-warning"><strong>Heads up</strong> Caution…</div>
 * These complement the heavier .soeb-callout variants below — pick
 * .article-* when you just need a clean inline note, .soeb-callout
 * when you want the labelled-icon chrome. */
.soeb-article__body .article-note,
.soeb-article__body .article-tip,
.soeb-article__body .article-warning{
    margin:32px 0;
    padding:18px 20px;
    border-radius:16px;
    border:1px solid var(--sa-line);
    background:#fff;
    color:var(--sa-text);
    font-size:.97rem;
    line-height:1.6;
}
.soeb-article__body .article-note > *:last-child,
.soeb-article__body .article-tip > *:last-child,
.soeb-article__body .article-warning > *:last-child{margin-bottom:0}
.soeb-article__body .article-note strong,
.soeb-article__body .article-tip strong,
.soeb-article__body .article-warning strong{
    color:var(--sa-ink);
    margin-right:.35em;
}
.soeb-article__body .article-note{
    background:var(--sa-yellow-soft);
    border-color:var(--sa-yellow-line);
    color:var(--sa-yellow-text);
}
.soeb-article__body .article-note strong{color:#5a3d00}
.soeb-article__body .article-tip{
    background:var(--sa-blue-tint);
    border-color:rgba(31,133,167,.2);
    color:var(--sa-ink);
}
.soeb-article__body .article-warning{
    background:var(--sa-amber-soft);
    border-color:var(--sa-amber-line);
    color:var(--sa-amber-text);
}

/* Callout box — info / tip / warning / takeaway. */
.soeb-article__body .soeb-callout{
    margin:24px 0;
    padding:18px 22px;
    border-radius:18px;
    border:1px solid var(--sa-line);
    background:#fff;
}
.soeb-article__body .soeb-callout > *:last-child{margin-bottom:0}
.soeb-article__body .soeb-callout .soeb-callout__label{
    display:inline-flex;align-items:center;gap:9px;
    font-size:.7rem;
    font-weight:900;
    text-transform:uppercase;
    letter-spacing:.06em;
    margin:0 0 8px;
}
.soeb-article__body .soeb-callout .soeb-callout__label::before{
    content:"i";
    display:inline-flex;align-items:center;justify-content:center;
    width:24px;height:24px;border-radius:8px;
    font-size:.78rem;font-weight:900;
    color:#fff;
}
.soeb-article__body .soeb-callout--info{
    background:var(--sa-blue-tint);
    border-color:rgba(139,92,246,.18);
}
.soeb-article__body .soeb-callout--info .soeb-callout__label{color:var(--sa-blue-dark)}
.soeb-article__body .soeb-callout--info .soeb-callout__label::before{background:var(--sa-blue)}
.soeb-article__body .soeb-callout--info p{color:var(--sa-text)}

.soeb-article__body .soeb-callout--tip{
    background:var(--sa-yellow-soft);
    border-color:var(--sa-yellow-line);
}
.soeb-article__body .soeb-callout--tip .soeb-callout__label{color:#8a5a00}
.soeb-article__body .soeb-callout--tip .soeb-callout__label::before{
    content:"\2605";
    background:var(--sa-yellow);
    color:#241B3D;
}
.soeb-article__body .soeb-callout--tip p{color:var(--sa-yellow-text)}

.soeb-article__body .soeb-callout--warning{
    background:var(--sa-amber-soft);
    border-color:var(--sa-amber-line);
}
.soeb-article__body .soeb-callout--warning .soeb-callout__label{color:var(--sa-amber-text)}
.soeb-article__body .soeb-callout--warning .soeb-callout__label::before{
    content:"!";
    background:var(--sa-amber);
}
.soeb-article__body .soeb-callout--warning p{color:#5a2900}

.soeb-article__body .soeb-callout--takeaway{
    background:var(--sa-green-soft);
    border-color:var(--sa-green-line);
}
.soeb-article__body .soeb-callout--takeaway .soeb-callout__label{color:#2E1059}
.soeb-article__body .soeb-callout--takeaway .soeb-callout__label::before{
    content:"\2713";
    background:var(--sa-green);
}
.soeb-article__body .soeb-callout--takeaway p{color:#3A3350}

/* FAQ accordion — uses native <details>/<summary> so no JS needed
 * and content remains accessible even with scripts disabled. */
.soeb-article__body .soeb-faq{
    display:grid;
    gap:10px;
    margin:24px 0;
}
.soeb-article__body .soeb-faq details{
    background:#fff;
    border:1px solid var(--sa-line);
    border-radius:18px;
    box-shadow:var(--sa-shadow-soft);
    overflow:hidden;
    transition:border-color .2s ease;
}
.soeb-article__body .soeb-faq details[open]{
    border-color:rgba(139,92,246,.25);
}
.soeb-article__body .soeb-faq summary{
    display:flex;
    justify-content:space-between;
    align-items:center;
    gap:14px;
    padding:18px 22px;
    font-size:1.02rem;
    font-weight:700;
    letter-spacing:-.015em;
    color:var(--sa-ink);
    cursor:pointer;
    list-style:none;
}
.soeb-article__body .soeb-faq summary::-webkit-details-marker{display:none}
.soeb-article__body .soeb-faq summary::after{
    content:"+";
    width:26px;height:26px;
    border-radius:9px;
    background:var(--sa-soft);
    border:1px solid var(--sa-line);
    color:var(--sa-text);
    display:inline-flex;align-items:center;justify-content:center;
    font-weight:900;
    font-size:1rem;
    flex-shrink:0;
    line-height:1;
    transition:background .2s ease, color .2s ease, transform .2s ease;
}
.soeb-article__body .soeb-faq details[open] summary::after{
    content:"\2212";
    background:var(--sa-blue);
    color:#fff;
    border-color:transparent;
}
.soeb-article__body .soeb-faq details > *:not(summary){
    padding:0 22px 18px;
    color:var(--sa-text);
    line-height:1.65;
    font-size:.95rem;
}

/* Stats row — small inline metric grid. */
.soeb-article__body .soeb-stats{
    display:grid;
    grid-template-columns:repeat(auto-fit, minmax(150px,1fr));
    gap:10px;
    margin:24px 0;
}
.soeb-article__body .soeb-stats__item{
    background:var(--sa-soft);
    border:1px solid var(--sa-line);
    border-radius:14px;
    padding:14px 16px;
}
.soeb-article__body .soeb-stats__item small{
    display:block;
    color:var(--sa-muted);
    font-size:.66rem;
    text-transform:uppercase;
    letter-spacing:.06em;
    font-weight:900;
    margin-bottom:4px;
}
.soeb-article__body .soeb-stats__item strong{
    display:block;
    font-size:1.4rem;
    letter-spacing:-.04em;
    color:var(--sa-ink);
    font-weight:800;
    line-height:1.1;
}
.soeb-article__body .soeb-stats__item .soeb-stats__meta{
    display:block;
    color:var(--sa-blue-dark);
    font-size:.72rem;
    font-weight:800;
    margin-top:4px;
}

/* Inline CTA card — for mid-article conversions. */
.soeb-article__body .soeb-cta-card{
    background:linear-gradient(180deg,var(--sa-blue-tint) 0%,#fff 100%);
    border:1px solid rgba(139,92,246,.25);
    border-radius:var(--sa-radius-card);
    padding:22px 24px;
    display:flex;
    justify-content:space-between;
    align-items:center;
    gap:20px;
    flex-wrap:wrap;
    margin:28px 0;
}
.soeb-article__body .soeb-cta-card > div{flex:1;min-width:220px}
.soeb-article__body .soeb-cta-card .soeb-cta-card__pill{
    display:inline-flex;align-items:center;gap:8px;
    background:#fff;
    border:1px solid rgba(139,92,246,.18);
    color:var(--sa-blue-dark);
    border-radius:999px;
    padding:5px 11px;
    font-size:.66rem;
    font-weight:900;
    letter-spacing:.04em;
    text-transform:uppercase;
    margin-bottom:10px;
}
.soeb-article__body .soeb-cta-card .soeb-cta-card__pill::before{
    content:"";width:6px;height:6px;border-radius:50%;background:var(--sa-blue);
}
.soeb-article__body .soeb-cta-card h4{
    font-size:1.15rem;
    letter-spacing:-.035em;
    font-weight:800;
    color:var(--sa-ink);
    margin:0 0 4px;
}
.soeb-article__body .soeb-cta-card p{font-size:.92rem;color:var(--sa-text);margin:0}
.soeb-article__body .soeb-cta-card .soeb-cta-card__btn,
.soeb-article__body a.soeb-cta-card__btn{
    background:var(--sa-blue);
    color:#fff !important;
    border-radius:999px;
    padding:12px 22px;
    font-weight:800;
    font-size:.9rem;
    text-decoration:none !important;
    white-space:nowrap;
    box-shadow:0 10px 22px rgba(139,92,246,.22);
    transition:background .15s ease, transform .15s ease;
}
.soeb-article__body .soeb-cta-card .soeb-cta-card__btn:hover,
.soeb-article__body a.soeb-cta-card__btn:hover{
    background:var(--sa-blue-dark);
    transform:translateY(-1px);
}

/* Key-takeaways callout — a richer variant for "what to know" boxes.
 * Drop this near the top of an article for a quick summary panel. */
.soeb-article__body .soeb-key-takeaways{
    background:linear-gradient(180deg,var(--sa-yellow-soft) 0%,#fffbea 100%);
    border:1px solid var(--sa-yellow-line);
    border-radius:var(--sa-radius-card);
    padding:22px 24px;
    margin:28px 0;
}
.soeb-article__body .soeb-key-takeaways__label{
    display:inline-flex;align-items:center;gap:10px;
    font-size:.72rem;
    color:#8a5a00;
    font-weight:900;
    text-transform:uppercase;
    letter-spacing:.06em;
    margin:0 0 12px;
}
.soeb-article__body .soeb-key-takeaways__label::before{
    content:"\2605";
    width:30px;height:30px;border-radius:10px;
    background:var(--sa-yellow);color:#241B3D;
    display:grid;place-items:center;
    font-size:.95rem;font-weight:900;
}
.soeb-article__body .soeb-key-takeaways ul{margin:0}
.soeb-article__body .soeb-key-takeaways ul > li{color:var(--sa-yellow-text)}
.soeb-article__body .soeb-key-takeaways ul > li::before{background:var(--sa-amber)}
.soeb-article__body .soeb-key-takeaways ul > li strong{color:var(--sa-ink)}

/* ── Article footer (tags, author, related, newsletter) ─── */
.soeb-article__footer{
    background:#fff;
    padding:48px 0 0;
}
.soeb-article__footer-inner{
    max-width:1100px;
    margin:0 auto;
}

.soeb-article__tags{
    display:flex;
    align-items:center;
    gap:10px;
    flex-wrap:wrap;
    padding:22px 0;
    border-top:1px solid var(--sa-line);
    max-width:var(--sa-reading-w);
}
.soeb-article__tags-label{
    font-size:.7rem;
    text-transform:uppercase;
    letter-spacing:.06em;
    font-weight:900;
    color:var(--sa-muted);
}
.soeb-article__tag{
    display:inline-flex;align-items:center;
    background:#241B3D;
    color:#fff;
    border-radius:999px;
    padding:6px 13px;
    font-family:'IBM Plex Mono',ui-monospace,monospace;
    font-size:.74rem;
    font-weight:600;
    letter-spacing:.02em;
    text-decoration:none;
    transition:background .15s ease, transform .15s ease;
}
.soeb-article__tag:hover{background:#2E1059;color:#fff;transform:translateY(-1px)}
.soeb-article__tag--soft{
    background:#F1ECFA;
    color:#57506B;
}
.soeb-article__tag--soft:hover{background:#e6ebe4;color:#57506B}

/* ── Responsive ─────────────────────────────────────────── */
@media (max-width:1080px){
    .soeb-article__layout{
        grid-template-columns:1fr;
        gap:0;
        margin:48px auto 0;
        padding:0 24px;
    }
    .soeb-article__sidebar{
        position:static;
        order:-1;
        margin-bottom:36px;
        max-width:var(--sa-reading-w);
    }
    /* v3.16.0: stack the 2-column hero on tablets — text first, image
     * below. Reduce vertical gap a touch so the stacked image doesn't
     * push the body content too far down the page.
     * v3.17.0: shrink card padding and radius slightly on narrower
     * screens so the card doesn't dominate the viewport.
     * v3.17.3: also reset the desktop fixed-height image so it
     * returns to natural aspect ratio when stacked.
     * v3.17.5: padding scaled down to match the tighter desktop
     * card. */
    .soeb-article__hero-inner{
        padding:24px 28px;
        border-radius:24px;
    }
    .soeb-article__hero-inner--has-image{
        grid-template-columns:1fr;
        gap:32px;
    }
    .soeb-article__hero-inner--has-image .soeb-article__featured-img{
        height:auto;
    }
    .soeb-article__hero-inner--has-image .soeb-article__featured-img img{
        height:auto;
        object-fit:initial;
    }
    .soeb-article__featured-img{
        border-radius:20px;
        margin:0 auto;
    }
}
@media (max-width:900px){
    .soeb-article__layout{padding:0 20px}
    .soeb-article__sidebar{margin-bottom:32px}
}
@media (max-width:720px){
    .soeb-article__hero{padding:24px 0 0}
    /* v3.17.0: tighter card padding + smaller radius on phones. */
    .soeb-article__hero-inner{
        padding:28px 22px;
        border-radius:20px;
    }
    .soeb-article__hero-inner--has-image{gap:24px}
    .soeb-article__title{font-size:2rem} /* 36px — leaves headroom for long titles in the narrower mobile column */
    .soeb-article__hero-inner:not(.soeb-article__hero-inner--has-image) .soeb-article__title{font-size:2.222rem} /* 40px */
    .soeb-article__lead{font-size:1.056rem;line-height:1.55} /* ~19px */
    .soeb-article__meta{gap:10px 14px;font-size:.78rem;padding:0}
    .soeb-article__meta-dot{display:none}
    .soeb-article__featured-img{
        border-radius:16px;
        margin:0 auto;
        box-shadow:0 12px 30px rgba(27,10,56,.07);
    }
    .soeb-article__layout{margin:36px auto 0;padding:0 16px} /* v3.35.10: narrower side gutters → wider text column on mobile */
    .soeb-article__body,
    .soeb-article__body p,
    .soeb-article__body ul > li,
    .soeb-article__body ol > li{font-size:.889rem;line-height:1.7} /* v3.35.10: 17px → 16px */
    .soeb-article__body h2{
        font-size:1.556rem; /* ~28px */
        margin-top:48px;
        padding-left:0; /* v3.35.10: bar removed, heading sits flush-left */
    }
    .soeb-article__body h3{font-size:1.222rem;margin-top:32px} /* ~22px */
    .soeb-article__body blockquote{padding:18px 20px}
    .soeb-article__body blockquote p{font-size:1.025rem}
    .soeb-article__body figure,
    .soeb-article__body img{margin:28px 0}
    .soeb-article__body .article-note,
    .soeb-article__body .article-tip,
    .soeb-article__body .article-warning{padding:16px 18px;margin:24px 0}
    .soeb-article__body .soeb-faq summary{font-size:.95rem;padding:16px 18px}
    .soeb-article__body .soeb-cta-card{flex-direction:column;align-items:flex-start;padding:18px 20px}
    .soeb-article__body .soeb-cta-card .soeb-cta-card__btn{width:100%;text-align:center;justify-content:center}
    .soeb-article__author-card{flex-direction:column;gap:12px;padding:18px 20px}
    .soeb-article__author-avatar{width:48px;height:48px;font-size:.95rem}
}

/* ── Floating dark aubergine footer (v3.19.0) ─────────────────────────────────
   Companion to the floating header. Wider than the header so it feels
   grounded at the bottom of the page. Scoped under .site-footer--floating
   to win the cascade over the legacy footer rules above. */
.site-footer--floating{
    background:transparent;
    color:#57506B;
    font-size:.95rem;
    margin:64px auto 0;
    padding:0;
}
.site-footer--floating .footer-shell{
    max-width:var(--w-site);
    margin:0 auto;
    padding:44px 32px 32px;
    border-radius:0;
    background:transparent;
    border:0;
    box-shadow:none;
}

/* Top row: brand stack on left (logo + tagline) · subscribe CTA on right */
.site-footer--floating .footer-top{
    display:flex;
    align-items:flex-start;
    justify-content:space-between;
    gap:48px;
}
.site-footer--floating .footer-brand{
    display:flex;
    flex-direction:column;
    align-items:flex-start;
    gap:12px;
    min-width:0;
}
.site-footer--floating .site-logo--footer .site-logo__img{
    height:34px;width:auto;max-width:240px;
}
.site-footer--floating .footer-tagline{
    margin:0;
    color:#57506B;
    font-size:.9rem;
    line-height:1.55;
    max-width:400px;
}

/* Footer CTA button ("Switch to Octopus" as of 1.0.1) */
.site-footer--floating .footer-subscribe-button{
    display:inline-flex;
    align-items:center;
    gap:8px;
    padding:11px 20px;
    border-radius:999px;
    background:var(--invert-bg);
    color:#fff;
    border:1px solid var(--invert-bg);
    font-weight:500;
    font-size:.9rem;
    text-decoration:none;
    line-height:1;
    white-space:nowrap;
    box-shadow:none;
    transition:background var(--ease),transform var(--ease),box-shadow var(--ease);
}
.site-footer--floating .footer-subscribe-button:hover,
.site-footer--floating .footer-subscribe-button:focus{
    background:#2E1059;
    border-color:#2E1059;
    color:#fff;
    transform:translateY(-2px);
    text-decoration:none;
}
.site-footer--floating .footer-subscribe-button:focus-visible{
    outline:2px solid var(--brand-mint);outline-offset:3px;
}
.site-footer--floating .footer-subscribe-button__icon{flex-shrink:0}

/* Subtle dividers */
.site-footer--floating .footer-divider{
    height:1px;
    background:#dbe7de;
    margin:28px 0;
    border:0;
}

/* Three compact link columns */
.site-footer--floating .footer-links{
    /* v1.0.0 — auto-fit rather than a fixed 1.4fr 1fr 1fr, because the columns
       are now menu-driven and a site may have one, two or three of them. */
    display:grid;
    grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
    gap:48px;
}
.site-footer--floating .footer-column-title{
    color:var(--brand-deep);
    font-family:'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;
    font-size:.72rem;
    letter-spacing:.1em;
    text-transform:uppercase;
    font-weight:600;
    margin:0 0 14px;
}
.site-footer--floating .footer-links ul{
    list-style:none;
    padding:0;
    margin:0;
}
.site-footer--floating .footer-links li{
    list-style:none;
    margin:0 0 9px;
    padding:0;
}
.site-footer--floating .footer-links li::before,
.site-footer--floating .footer-links li::marker{
    content:none;
    display:none;
}
.site-footer--floating .footer-links a{
    display:inline-block;
    color:#4F4766;
    text-decoration:none;
    font-size:.9rem;
    line-height:1.5;
    transition:color var(--ease);
}
.site-footer--floating .footer-links a:hover,
.site-footer--floating .footer-links a:focus{
    color:var(--brand-deep);
    text-decoration:none;
}
.site-footer--floating .footer-links a:focus-visible{
    outline:2px solid #8B5CF6;outline-offset:3px;border-radius:3px;
}

/* Bottom row */
.site-footer--floating .footer-bottom{
    display:flex;
    justify-content:space-between;
    gap:24px;
    color:#A79CBD;
    font-size:.82rem;
}
.site-footer--floating .footer-bottom__copyright,
.site-footer--floating .footer-bottom__statement{
    color:#6A6180;
    font-family:'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;
    font-size:.78rem;
    letter-spacing:.01em;
}

/* v3.39.14 — Site-wide compliance small print. Positions Save On Energy
   Bills as an information/guides publisher (not a comparison/switching
   service) and carries the standing affiliate disclosure. Full-width block
   above the copyright row, shown on every page. The inline link points to
   /affiliate-disclosure/ (1.1.2) — keep that slug in sync with the
   WordPress page. */
.site-footer--floating .footer-disclaimer{
    margin:0 0 20px;
}
.site-footer--floating .footer-disclaimer__text{
    margin:0;
    max-width:none;
    color:#6A6180;
    font-size:.72rem;
    line-height:1.65;
    letter-spacing:.01em;
}
.site-footer--floating .footer-disclaimer__text a{
    color:inherit;
    text-decoration:underline;
    text-underline-offset:2px;
}
.site-footer--floating .footer-disclaimer__text a:hover,
.site-footer--floating .footer-disclaimer__text a:focus{
    color:#57506B;
}

/* Tablet: stack the top row (logo/tagline above the button) */
@media(max-width:1024px){
    .site-footer--floating .footer-top{
        flex-direction:column;
        align-items:flex-start;
        gap:28px;
    }
    .site-footer--floating .footer-tagline{max-width:none}
    .site-footer--floating .footer-links{
        grid-template-columns:1fr 1fr;
        gap:40px 48px;
    }
}

/* Mobile: smaller padding, smaller radius, single column */
@media(max-width:768px){
    .site-footer--floating{
        margin:56px 0 0;
        padding:0;
    }
    .site-footer--floating .footer-shell{
        padding:40px 16px 32px;
        border-radius:0;
    }
    .site-footer--floating .footer-top,
    .site-footer--floating .footer-links,
    .site-footer--floating .footer-bottom{
        display:grid;
        grid-template-columns:1fr;
        gap:24px;
    }
    /* v3.19.3 — Subscribe button was overflowing the narrow mobile
       column at 14px/22px padding + .95rem text. Tighten it so it
       sits comfortably under the tagline without dominating. */
    .site-footer--floating .footer-subscribe-button{
        padding:11px 16px;
        font-size:.88rem;
        gap:8px;
        border-radius:12px;
        align-self:flex-start;
        justify-self:start;
    }
    .site-footer--floating .footer-subscribe-button__icon{
        width:16px;
        height:16px;
    }
    .site-footer--floating .footer-divider{margin:28px 0}
    .site-footer--floating .footer-bottom{
        gap:8px;
        font-size:.85rem;
    }
}

/* ============================================================
   v3.35.38 — MOBILE MENU FIX (drawer + submenus)
   Fixes three reported issues on the open mobile nav:
   (a) Drawer floated below the header with all-round 18px radius.
       It now attaches to the header bottom (top:100%) and is full
       bleed with a square top edge + rounded bottom, matching the
       desktop dropdown's "0 0 8px 8px" square-top aesthetic.
   (b) Submenu items overflowed off the right because the desktop
       block (#primary-nav .sub-menu, ~line 1466) wins on ID
       specificity and forced min-width:248px + a bordered box, while
       .main-nav a (~line 77) set white-space:nowrap. Submenus are now
       forced static, full width, no min-width, no border box, and
       labels wrap.
   (c) Expanded submenus pushed the drawer below the viewport. The
       drawer now has a capped height and scrolls internally.
   Selectors are scoped with #primary-nav so they match the ID
   specificity of the desktop block and, being later in the file,
   take the cascade. Reveal logic (hover/focus display) is left
   untouched so tap-to-open still works.
   ============================================================ */
@media(max-width:768px){

  /* (a) + (c) The drawer itself */
  #primary-nav.main-nav{
    top:100% !important;
    left:0 !important;
    right:0 !important;
    border:1px solid rgba(255,255,255,.08) !important;
    border-top:none !important;
    border-radius:0 0 14px 14px !important;
    background:rgba(10,13,16,.97) !important;
    box-shadow:0 16px 34px rgba(0,0,0,.5) !important;
    padding:8px 16px 14px !important;
    max-height:calc(100vh - 70px) !important;
    max-height:calc(100dvh - 70px) !important;
    overflow-y:auto !important;
    overflow-x:hidden !important;
    -webkit-overflow-scrolling:touch;
    overscroll-behavior:contain;
  }

  /* Let every nav label wrap instead of running off the right edge */
  #primary-nav a,
  #primary-nav .main-nav__list a,
  #primary-nav .sub-menu a{
    white-space:normal !important;
    overflow-wrap:break-word;
    word-break:break-word;
  }

  /* (b) Submenus: kill the desktop absolute/min-width/bordered box and
     render them as a simple indented in-flow list */
  #primary-nav .sub-menu{
    position:static !important;
    transform:none !important;
    top:auto !important;
    left:auto !important;
    right:auto !important;
    min-width:0 !important;
    width:auto !important;
    max-width:100% !important;
    background:transparent !important;
    border:none !important;
    border-left:2px solid rgba(201,168,255,.3) !important; /* 1.2.0 — lilac, matches the desktop nested-menu rule (was an old green) */
    border-radius:0 !important;
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    margin:2px 0 6px 6px !important;
    padding:2px 0 2px 10px !important;
  }
  #primary-nav .sub-menu li{
    width:100% !important;
  }
  #primary-nav .sub-menu a{
    padding:10px 10px !important;
    font-size:.95rem !important;
    line-height:1.35 !important;
  }
}

/* ============================================================
   Site chrome typography (v3.35.41)
   Header + footer use the Schibsted Grotesk display face, which is
   now also the sitewide body face (font-family:var(--font)), so the
   chrome and the rest of the site share one consistent type system.
   ============================================================ */
.site-header,
.site-header *,
.site-footer,
.site-footer *{
  font-family:'Schibsted Grotesk',-apple-system,'Helvetica Neue',Arial,sans-serif;
}

/* ============================================================================
 * v3.35.71 — Mobile fixes.
 *   (a) Move "Build my plan" out of the header (where it overlapped the logo)
 *       and show it as the first item inside the slide-out menu.
 *   (b) Hub hero CTAs: full-width + centred labels on phones, matching the
 *       homepage (the plain width rule was being dropped by Remove-Unused-CSS,
 *       so this is forced with !important). */

/* Desktop: the in-menu CTA is hidden; Build my plan stays in the header. */
.main-nav a.main-nav__cta{display:none}

@media(max-width:768px){
    /* Pull the primary CTA out of the header bar to stop the logo overlap. */
    .header-cta--primary{display:none !important}

    /* Show it at the top of the menu panel, styled to match (pink pill). */
    .main-nav a.main-nav__cta{
        display:flex !important;
        align-items:center;
        justify-content:center;
        gap:10px;
        margin:10px 0 0 !important;
        padding:13px 18px !important;
        border-radius:999px !important;
        background:#DE5CF1 !important;
        color:#1B0A38 !important;
        font-family:'Schibsted Grotesk',-apple-system,'Helvetica Neue',Arial,sans-serif;
        font-weight:600;
        font-size:1rem;
        line-height:1;
        text-decoration:none;
    }
    .main-nav a.main-nav__cta:hover,
    .main-nav a.main-nav__cta:focus{
        background:#C846DC !important;
        color:#1B0A38 !important;
        text-decoration:none;
    }
}

/* ============================================================================
 * v3.35.72 — Category archives + blog index: deep aubergine hero to match the
 * homepage / hubs. Scoped to body.category-archive and body.blog only, so the
 * shared .page-hero on legal/default pages keeps its white treatment.
 * H1 text + icon meta are set in category.php / index.php. !important is used
 * so the overrides survive LiteSpeed's Remove-Unused-CSS pass. */

/* Surface — full-bleed deep aubergine, homepage padding. */
body.category-archive .page-hero,
body.blog .page-hero{
    background:var(--invert-bg) !important;
    color:#F7F4FC !important;
    padding:96px 0 76px !important;
}

/* Content column — left-aligned, unconstrained for the big title. */
body.category-archive .page-hero__content,
body.blog .page-hero__content{
    max-width:none !important;
    text-align:left !important;
}

/* Eyebrow — drop the charcoal pill; use the homepage's mono eyebrow. */
body.category-archive .page-hero__kicker,
body.blog .page-hero__kicker{
    display:inline-block !important;
    background:none !important;
    padding:0 !important;
    border-radius:0 !important;
    color:#C0AEDD !important;
    font-family:'IBM Plex Mono',ui-monospace,'SF Mono',Menlo,Monaco,Consolas,monospace !important;
    font-size:13px !important;
    font-weight:400 !important;
    letter-spacing:.16em !important;
    text-transform:uppercase !important;
    margin-bottom:30px !important;
}

/* H1 — cream, homepage clamp + weight + tracking. */
body.category-archive .page-hero__title,
body.blog .page-hero__title{
    font-family:'Schibsted Grotesk',-apple-system,'Helvetica Neue',Arial,sans-serif !important;
    font-weight:800 !important;
    font-size:clamp(2.6rem,6.2vw,5.3rem) !important;
    line-height:1.04 !important;
    letter-spacing:-.02em !important;
    color:#F7F4FC !important;
    margin:0 !important;
}

/* Meta — hub style: lilac icons, light text, sits below the title. */
body.category-archive .page-hero__meta,
body.blog .page-hero__meta{
    display:flex !important;
    flex-wrap:wrap !important;
    align-items:center !important;
    gap:22px !important;
    margin-top:34px !important;
    font-size:.95rem !important;
}
body.category-archive .page-hero__meta-item,
body.blog .page-hero__meta-item{
    display:inline-flex !important;
    align-items:center !important;
    gap:9px !important;
    color:rgba(255,255,255,.82) !important;
    font-weight:500 !important;
}
body.category-archive .page-hero__meta-icon,
body.blog .page-hero__meta-icon{
    color:var(--brand-mint-soft) !important;
    flex-shrink:0 !important;
}

/* Breadcrumbs — light on the dark surface. */
body.category-archive .page-hero__breadcrumbs,
body.blog .page-hero__breadcrumbs{
    color:rgba(255,255,255,.72) !important;
    margin-top:30px !important;
}
body.category-archive .page-hero__breadcrumbs a,
body.blog .page-hero__breadcrumbs a{color:rgba(255,255,255,.72) !important}
body.category-archive .page-hero__breadcrumbs a:hover,
body.blog .page-hero__breadcrumbs a:hover{color:#F7F4FC !important;text-decoration:none !important}
body.category-archive .page-hero__breadcrumbs .sep,
body.blog .page-hero__breadcrumbs .sep{color:rgba(255,255,255,.4) !important}
body.category-archive .page-hero__breadcrumbs-current,
body.blog .page-hero__breadcrumbs-current{color:#F7F4FC !important}

@media(max-width:720px){
    body.category-archive .page-hero,
    body.blog .page-hero{padding:72px 0 60px !important}
}

/* ============================================================================
 * v3.35.75 — Image-led article cards (hub-article-card) brought on-brand:
 *   • green-tinted thumbnail wash (tames off-palette photos, e.g. the orange
 *     Ofgem thumb, without flattening the good photography)
 *   • plain muted mono eyebrow — the glass pill is dropped so the card label
 *     matches every hero eyebrow (#C0AEDD, IBM Plex Mono), with a text-shadow
 *     for legibility over imagery
 *   • lilac read-more link
 * Octopus cards keep their own styling: .hub-article-card--octopus is excluded
 * here, and the Octopus tariff cards use the separate .octo-card component.
 * !important so the treatment survives LiteSpeed's Remove-Unused-CSS pass. */

/* Thumbnail — gentle full-card green cast + green bottom gradient. */
.hub-article-grid .hub-article-card:not(.hub-article-card--octopus) .hub-article-card__scrim{
    background:
        linear-gradient(180deg, rgba(27,10,56,0) 24%, rgba(19,6,40,.55) 60%, rgba(20,7,42,.92) 100%),
        linear-gradient(rgba(27,10,56,.30), rgba(27,10,56,.30)) !important;
}
.hub-article-grid .hub-article-card:not(.hub-article-card--octopus) .hub-article-card__media img{
    filter:saturate(.9) !important;
}
.hub-article-grid .hub-article-card--noimg:not(.hub-article-card--octopus) .hub-article-card__media{
    background:linear-gradient(150deg,#2E1059 0%,var(--invert-bg) 60%,#140430 100%) !important;
}

/* Eyebrow — drop the glass pill; plain muted mono text like the hero eyebrows. */
.hub-article-grid .hub-article-card:not(.hub-article-card--octopus) .hub-article-card__label{
    background:none !important;
    border:0 !important;
    border-radius:0 !important;
    padding:0 !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    color:#C0AEDD !important;
    font-weight:400 !important;
    font-size:13px !important;
    letter-spacing:.16em !important;
    text-shadow:0 1px 10px rgba(8,14,10,.75) !important;
}

/* Read-more link — lilac accent. */
.hub-article-grid .hub-article-card:not(.hub-article-card--octopus) .hub-article-card__link{
    color:#DCC6FF !important;
}

/* ============================================================================
 * v3.35.76 — Article card refinements:
 *   • Add a top scrim so the muted mono label (#C0AEDD) has a consistent dark
 *     backdrop on any photo — fixes it washing out over bright skies, without
 *     changing the label colour (stays matched to the hero eyebrows).
 *   • Featured/wide cards get their own lighter, lower gradient — the standard
 *     card gradient over-darkened them because they're much shorter, so the
 *     tint climbed too high up the image.
 * Octopus cards remain excluded. !important to survive Remove-Unused-CSS. */

/* Standard cards — top scrim + existing bottom scrim + flat green wash. */
.hub-article-grid .hub-article-card:not(.hub-article-card--octopus) .hub-article-card__scrim{
    background:
        linear-gradient(180deg, rgba(9,18,13,.62) 0%, rgba(14,4,30,0) 30%),
        linear-gradient(180deg, rgba(27,10,56,0) 24%, rgba(19,6,40,.55) 60%, rgba(20,7,42,.92) 100%),
        linear-gradient(rgba(27,10,56,.30), rgba(27,10,56,.30)) !important;
}

/* Featured/wide cards — thinner top scrim, bottom gradient starts lower,
 * lighter overall wash so the middle of the big image stays clear. */
.hub-article-grid .hub-article-card--featured:not(.hub-article-card--octopus) .hub-article-card__scrim{
    background:
        linear-gradient(180deg, rgba(14,4,30,.5) 0%, rgba(14,4,30,0) 22%),
        linear-gradient(180deg, rgba(27,10,56,0) 46%, rgba(18,6,38,.84) 100%),
        linear-gradient(rgba(27,10,56,.16), rgba(27,10,56,.16)) !important;
}

