  :root {
    --ground: #04110c;
    --ground-2: #020a07;
    --panel: rgba(255, 255, 255, 0.028);
    --panel-2: rgba(255, 255, 255, 0.05);
    --line: rgba(120, 200, 160, 0.13);
    --line-strong: rgba(120, 200, 160, 0.26);

    --kwh: #2fe29a;        /* electric mint &mdash; kilowatt-hours, live current */
    --kwh-deep: #0b6e4f;   /* brand green */
    --kwacha: #e8963d;     /* copper &mdash; money, the Copperbelt, the sun */
    --kwacha-hi: #f6b25a;

    --ink: #dceae2;
    --ink-soft: #a9c2b6;
    /* Was #74897e, which frontend/src/components/Layout.tsx already flagged as
       "looks right but is 3.89:1 and fails AA". Measured against every ground
       this token actually lands on, it bottomed out at 3.40:1 over the lighter
       parts of the hero and band photographs — and it carries real body copy
       (.reality .d, .card p, .slot p, .node .sub at 0.78rem, the footer), not
       decoration.
       #93aaa0 clears AA everywhere with margin (worst case 5.14:1) and stays
       ~13% darker than --ink-soft, so "muted" still reads as a step below
       "soft" rather than merging into it. Do not darken this again without
       re-measuring against the photo bands — they are the worst case, and
       --ground flatters it. */
    --ink-mute: #93aaa0;

    --danger: #ff6b6b;

    --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    --mono: ui-monospace, "SF Mono", "JetBrains Mono", "Roboto Mono", Menlo, Consolas, monospace;

    --measure: 62ch;
    --edge: clamp(20px, 6vw, 96px);
    --maxw: 1180px;
  }

  * { box-sizing: border-box; }

  body {
    margin: 0;
    background: var(--ground);
    color: var(--ink);
    font-family: var(--sans);
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
    overflow-x: hidden;
  }

  ::selection { background: rgba(47, 226, 154, 0.28); color: #fff; }

  a { color: inherit; }

  /* ── live-wire scroll progress ─────────────────────────────── */
  .wire {
    position: fixed;
    top: 0; left: 0;
    height: 2px;
    width: 100%;
    transform: scaleX(0);
    transform-origin: 0 50%;
    background: linear-gradient(90deg, var(--kwh) 0%, var(--kwh) 55%, var(--kwacha) 100%);
    box-shadow: 0 0 12px rgba(47, 226, 154, 0.6);
    z-index: 90;
    will-change: transform;
  }

  /* ── nav ───────────────────────────────────────────────────── */
  .nav {
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 80;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 16px var(--edge);
    background: linear-gradient(180deg, rgba(4, 17, 12, 0.86), rgba(4, 17, 12, 0));
    backdrop-filter: blur(6px);
  }
  .brand { display: flex; align-items: center; gap: 11px; }
  .brand .mark {
    width: 26px; height: 26px; flex: none;
    filter: drop-shadow(0 0 8px rgba(47, 226, 154, 0.5));
  }
  .brand .name {
    font-weight: 700;
    letter-spacing: 0.14em;
    font-size: 13px;
    text-transform: uppercase;
  }
  .brand .name b { color: var(--kwh); font-weight: 700; }
  .nav .status {
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.08em;
    color: var(--ink-soft);
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    border: 1px solid var(--line);
    border-radius: 100px;
    white-space: nowrap;
  }
  .nav .status .dot {
    width: 7px; height: 7px; border-radius: 50%;
    background: var(--kwh);
    box-shadow: 0 0 0 0 rgba(47, 226, 154, 0.6);
    animation: pulse 2.6s infinite;
  }
  @keyframes pulse {
    0% { box-shadow: 0 0 0 0 rgba(47, 226, 154, 0.55); }
    70% { box-shadow: 0 0 0 7px rgba(47, 226, 154, 0); }
    100% { box-shadow: 0 0 0 0 rgba(47, 226, 154, 0); }
  }

  /* ── top navigation: section links + sign in ────────────────── */
  .brand { text-decoration: none; color: inherit; }

  .navmenu { display: flex; align-items: center; gap: clamp(12px, 1.8vw, 26px); }
  .navmenu a {
    font-family: var(--mono);
    font-size: 11.5px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-soft);
    text-decoration: none;
    white-space: nowrap;
    padding: 6px 0;
    border-bottom: 1px solid transparent;
    transition: color 0.25s ease, border-color 0.25s ease;
  }
  .navmenu a:hover { color: var(--ink); }
  .navmenu a.active { color: var(--kwh); border-bottom-color: var(--kwh); }

  .navcta { display: flex; align-items: center; gap: 12px; }
  .signin {
    font-family: var(--mono);
    font-size: 11.5px;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    text-decoration: none;
    color: #04110c;
    background: var(--kwh);
    padding: 10px 20px;
    border-radius: 100px;
    white-space: nowrap;
    box-shadow: 0 0 18px rgba(47, 226, 154, 0.26);
    transition: transform 0.2s ease, box-shadow 0.3s ease, filter 0.2s ease;
  }
  .signin:hover {
    filter: brightness(1.08);
    transform: translateY(-1px);
    box-shadow: 0 6px 22px rgba(47, 226, 154, 0.42);
  }
  .signin:focus-visible { outline: 2px solid var(--kwh); outline-offset: 3px; }

  /* hamburger — shown only below the desktop breakpoint */
  .navtoggle {
    display: none;
    position: relative;
    width: 40px; height: 36px;
    padding: 0;
    background: none;
    border: 1px solid var(--line-strong);
    border-radius: 9px;
    cursor: pointer;
    place-items: center;
    gap: 4px;
  }
  .navtoggle span {
    display: block; width: 17px; height: 1.5px;
    background: var(--ink);
    transition: transform 0.25s ease, opacity 0.2s ease;
  }
  /* Open = an X. Both bars are pinned to the button's exact centre rather than
     nudged out of their grid rows — deriving the offset from the row gap gave a
     chevron ">" instead of a cross, because the bars never shared a centre. */
  .nav.open .navtoggle span {
    position: absolute;
    top: 50%; left: 50%;
    width: 18px;
    margin: -0.75px 0 0 -9px;
  }
  .nav.open .navtoggle span:nth-child(1) { transform: rotate(45deg); }
  .nav.open .navtoggle span:nth-child(2) { opacity: 0; }
  .nav.open .navtoggle span:nth-child(3) { transform: rotate(-45deg); }

  /* anchored sections must clear the fixed nav when jumped to */
  html { scroll-behavior: smooth; }
  section[id], header[id] { scroll-margin-top: 84px; }

  /* the status chip is the first thing to go when space gets tight */
  @media (max-width: 1180px) { .nav .status { display: none; } }

  /* On a narrow phone the wordmark + Sign in + hamburger would overflow the
     bar (measured ~344px of content against ~330px of room at 375px), and
     body{overflow-x:hidden} would silently clip the hamburger off-screen.
     Shrink the three of them rather than lose the menu button. */
  @media (max-width: 560px) {
    .nav { gap: 10px; }
    .brand .mark { width: 22px; height: 22px; }
    .brand .name { font-size: 11.5px; letter-spacing: 0.1em; }
    .navcta { gap: 10px; }
    .signin { padding: 9px 14px; font-size: 11px; letter-spacing: 0.09em; }
  }

  @media (max-width: 920px) {
    .navtoggle { display: grid; }
    .navmenu {
      position: absolute;
      top: 100%; left: 0; right: 0;
      display: none;
      flex-direction: column;
      align-items: stretch;
      gap: 0;
      padding: 4px var(--edge) 14px;
      background: rgba(4, 17, 12, 0.97);
      backdrop-filter: blur(10px);
      border-bottom: 1px solid var(--line);
    }
    .nav.open .navmenu { display: flex; }
    .navmenu a { padding: 14px 0; border-bottom: 1px solid var(--line); }
    .navmenu a.active { color: var(--kwh); border-bottom-color: var(--line); }
  }

  /* ── shared shell ──────────────────────────────────────────── */
  .shell { max-width: var(--maxw); margin: 0 auto; padding: 0 var(--edge); }

  .eyebrow {
    font-family: var(--mono);
    font-size: 12px;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--kwh);
    display: inline-flex;
    align-items: center;
    gap: 10px;
  }
  .eyebrow::before {
    content: "";
    width: 22px; height: 1px;
    background: var(--kwh);
    opacity: 0.7;
  }
  .eyebrow.copper { color: var(--kwacha-hi); }
  .eyebrow.copper::before { background: var(--kwacha-hi); }

  h1, h2, h3 { font-weight: 700; text-wrap: balance; margin: 0; letter-spacing: -0.02em; }

  section { position: relative; }

  /* ── hero ──────────────────────────────────────────────────── */
  .hero {
    position: relative;
    min-height: 100svh;
    display: flex;
    align-items: center;
    padding: 120px 0 80px;
    overflow: hidden;
  }
  #field {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    z-index: 0;
  }
  .hero::after {
    content: "";
    position: absolute; inset: 0;
    background:
      radial-gradient(120% 90% at 82% 8%, rgba(232, 150, 61, 0.10), transparent 55%),
      radial-gradient(100% 80% at 6% 90%, rgba(11, 110, 79, 0.28), transparent 60%),
      linear-gradient(180deg, rgba(4, 17, 12, 0.2), var(--ground) 96%);
    z-index: 1;
    pointer-events: none;
  }
  .hero .shell { position: relative; z-index: 2; width: 100%; }

  .hero h1 {
    font-size: clamp(2.7rem, 8.4vw, 6rem);
    line-height: 0.98;
    margin: 22px 0 0;
    max-width: 15ch;
  }
  .hero h1 { transition: opacity 0.34s ease; }
  .hero h1 .kwh { color: var(--kwh); }
  .hero h1 .kwacha { color: var(--kwacha-hi); }
  .hero h1 .kwh, .hero h1 .kwacha { white-space: nowrap; }

  /* character-by-character reveal. Each word is a nowrap unit so a headline word
     never breaks mid-way; spaces stay breakable so the two lines still wrap on a
     phone. Chars pop up individually; the caret follows the typing head. */
  .hero h1 .word { white-space: nowrap; }
  .hero h1 .ch {
    opacity: 0;
    transition: opacity 0.16s ease, transform 0.3s cubic-bezier(0.2, 0.85, 0.3, 1.45);
  }
  .hero h1 .word .ch {
    display: inline-block;
    transform: translateY(0.34em) scale(0.82);
  }
  .hero h1 .ch.on { opacity: 1; transform: none; }
  .hero h1 .caret {
    display: inline-block;
    width: 0.045em;
    height: 0.8em;
    background: var(--kwh);
    border-radius: 1px;
    vertical-align: -0.07em;
    margin: 0 0.03em;
    box-shadow: 0 0 9px rgba(47, 226, 154, 0.75);
    animation: caret-blink 1.05s steps(1) infinite;
  }
  /* the caret takes the colour of the vertical being typed */
  .hero h1 .caret.c {
    background: var(--kwacha-hi);
    box-shadow: 0 0 9px rgba(232, 150, 61, 0.8);
  }
  @keyframes caret-blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }

  .hero .lede {
    margin: 26px 0 0;
    max-width: 54ch;
    font-size: clamp(1.05rem, 1.9vw, 1.3rem);
    color: var(--ink-soft);
  }
  .hero .lede b { color: var(--ink); font-weight: 600; }

  /* Hero capability lines.
     DEFAULT STATE IS ALL OF THEM, VISIBLE — no JS, a JS error, a crawler, or a
     reduced-motion visitor all get the full list. app.js adds .js-rotate to
     upgrade this to one-at-a-time. Never invert these two: the copy is
     information, and information must not depend on an animation running. */
  .hero .ticker {
    margin: 22px 0 0;
    padding: 0;
    max-width: 60ch;
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 9px;
    font-family: var(--mono);
    font-size: clamp(0.95rem, 1.6vw, 1.08rem);
    line-height: 1.65;
    color: var(--ink-soft);
    font-weight: 500;
  }
  .hero .ticker .tick {
    display: flex;
    gap: 11px;
  }
  .hero .ticker .tick::before {
    content: "\203A";           /* › */
    color: var(--kwh);
    font-weight: 700;
    flex: none;
  }

  /* Rotating mode. min-height reserves two lines so the stat strip below never
     jumps as sentence lengths change — a hero that shifts under the reader
     reads as broken, however good the words are. */
  .hero .ticker.js-rotate {
    display: block;
    min-height: 3.4em;
  }
  .hero .ticker.js-rotate .tick { display: none; }
  .hero .ticker.js-rotate .tick.on {
    display: flex;
    animation: tickIn 320ms ease both;
  }
  @keyframes tickIn {
    from { opacity: 0; transform: translateY(5px); }
    to   { opacity: 1; transform: none; }
  }

  .statstrip {
    margin-top: 44px;
    display: flex;
    flex-wrap: wrap;
    gap: 12px 36px;
    padding-top: 26px;
    border-top: 1px solid var(--line);
  }
  .stat .n {
    font-family: var(--mono);
    font-size: clamp(1.4rem, 3.4vw, 2rem);
    font-weight: 600;
    letter-spacing: -0.02em;
    color: var(--ink);
    font-variant-numeric: tabular-nums;
    line-height: 1;
  }
  .stat .n .u { color: var(--kwh); font-size: 0.62em; margin-left: 3px; }
  .stat .l {
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.13em;
    text-transform: uppercase;
    color: var(--ink-mute);
    margin-top: 9px;
  }

  .scrollcue {
    position: absolute;
    left: var(--edge); bottom: 26px;
    z-index: 2;
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--ink-mute);
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .scrollcue .rail {
    width: 1px; height: 34px;
    background: linear-gradient(var(--kwh), transparent);
    position: relative;
    overflow: hidden;
  }
  .scrollcue .rail::after {
    content: "";
    position: absolute; top: -40%; left: 0;
    width: 100%; height: 40%;
    background: var(--kwh);
    animation: drop 2.2s cubic-bezier(0.7, 0, 0.3, 1) infinite;
  }
  @keyframes drop { 0% { top: -40%; } 60%, 100% { top: 120%; } }

  /* ── section rhythm ────────────────────────────────────────── */
  .band { padding: clamp(48px, 6.5vw, 92px) 0; }
  .band-head { max-width: 60ch; }
  .band-head h2 {
    font-size: clamp(1.9rem, 4.6vw, 3.3rem);
    line-height: 1.04;
    margin-top: 20px;
  }
  .band-head p {
    margin: 20px 0 0;
    max-width: var(--measure);
    color: var(--ink-soft);
    font-size: clamp(1rem, 1.5vw, 1.12rem);
  }

  /* ── context: realities ────────────────────────────────────── */
  .realities {
    margin-top: 56px;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
    gap: 1px;
    background: var(--line);
    border: 1px solid var(--line);
  }
  .reality {
    background: var(--ground);
    padding: 26px 24px;
    display: flex;
    flex-direction: column;
    gap: 8px;
  }
  .reality .k {
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--kwacha-hi);
  }
  .reality .t { font-weight: 600; font-size: 1.06rem; color: var(--ink); }
  .reality .d { color: var(--ink-mute); font-size: 0.92rem; line-height: 1.5; }

  /* ── pipeline: meter &rarr; cash ────────────────────────────────── */
  .pipe {
    margin-top: 60px;
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: 14px;
    position: relative;
  }
  .pipe::before {
    content: "";
    position: absolute;
    top: 27px; left: 4%; right: 4%;
    height: 2px;
    background: var(--line);
    z-index: 0;
  }
  .pipe .flow {
    position: absolute;
    top: 27px; left: 4%;
    height: 2px;
    width: 0;
    background: linear-gradient(90deg, var(--kwh), var(--kwacha));
    box-shadow: 0 0 10px rgba(47, 226, 154, 0.5);
    z-index: 1;
    transition: width 1.7s cubic-bezier(0.5, 0, 0.2, 1);
  }
  .node {
    position: relative;
    z-index: 2;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 14px;
  }
  .node .orb {
    width: 54px; height: 54px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    background: var(--ground);
    border: 1.5px solid var(--line-strong);
    color: var(--ink-mute);
    transition: color 0.4s ease, border-color 0.4s ease, box-shadow 0.5s ease, transform 0.5s ease;
  }
  .node .orb svg { width: 24px; height: 24px; }
  .node.lit .orb {
    color: var(--kwh);
    border-color: var(--kwh);
    box-shadow: 0 0 0 4px rgba(47, 226, 154, 0.1), 0 0 22px rgba(47, 226, 154, 0.35);
    transform: translateY(-2px);
  }
  .node:last-child.lit .orb {
    color: var(--kwacha-hi);
    border-color: var(--kwacha-hi);
    box-shadow: 0 0 0 4px rgba(232, 150, 61, 0.12), 0 0 22px rgba(232, 150, 61, 0.4);
  }
  .node .step {
    font-family: var(--mono);
    font-size: 10px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--ink-mute);
  }
  .node .label { font-weight: 600; font-size: 0.95rem; line-height: 1.25; }
  .node .sub { font-size: 0.78rem; color: var(--ink-mute); line-height: 1.4; }

  /* ── capability groups ─────────────────────────────────────── */
  .groups { margin-top: 60px; display: flex; flex-direction: column; gap: 20px; }
  .group {
    border: 1px solid var(--line);
    background: var(--panel);
    border-radius: 4px;
    overflow: hidden;
  }
  .group-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 16px;
    padding: 24px clamp(20px, 3vw, 34px);
    border-bottom: 1px solid var(--line);
    flex-wrap: wrap;
  }
  .group-head .gi { font-family: var(--mono); font-size: 12px; color: var(--kwh); letter-spacing: 0.12em; }
  .group-head h3 { font-size: clamp(1.3rem, 3vw, 1.85rem); }
  .group-head .tag {
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--ink-mute);
  }
  .cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(255px, 1fr));
    gap: 1px;
    background: var(--line);
  }
  .card {
    background: var(--ground);
    padding: 26px clamp(20px, 3vw, 30px);
    display: flex;
    flex-direction: column;
    gap: 12px;
    transition: background 0.3s ease;
  }
  .card:hover { background: #06170f; }
  .card .ic {
    width: 34px; height: 34px;
    color: var(--kwh);
    display: grid; place-items: center;
    border: 1px solid var(--line-strong);
    border-radius: 8px;
    flex: none;
  }
  .card .ic svg { width: 19px; height: 19px; }
  .card h4 { margin: 0; font-size: 1.06rem; font-weight: 650; letter-spacing: -0.01em; }
  .card p { margin: 0; color: var(--ink-mute); font-size: 0.9rem; line-height: 1.55; }
  .card .meta {
    margin-top: 2px;
    font-family: var(--mono);
    font-size: 10.5px;
    letter-spacing: 0.06em;
    color: var(--ink-soft);
    opacity: 0.85;
  }

  /* ── fuel vertical strip ───────────────────────────────────── */
  .split {
    margin-top: 40px;
    display: grid;
    grid-template-columns: 1.05fr 1fr;
    gap: 1px;
    background: var(--line);
    border: 1px solid var(--line);
    border-radius: 4px;
    overflow: hidden;
  }
  .split > div { background: var(--ground); padding: clamp(26px, 4vw, 44px); }
  .split .chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
  .chip {
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.05em;
    color: var(--ink-soft);
    padding: 7px 12px;
    border: 1px solid var(--line);
    border-radius: 100px;
    background: var(--panel);
  }

  /* ── impact / ESG (copper) ─────────────────────────────────── */
  .impact { background: linear-gradient(180deg, var(--ground-2), #0d0a06 60%, var(--ground)); }
  .impact .grid {
    margin-top: 56px;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 40px 30px;
  }
  .impact .m .n {
    font-family: var(--mono);
    font-size: clamp(2rem, 5vw, 3.1rem);
    font-weight: 600;
    color: var(--kwacha-hi);
    line-height: 1;
    letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums;
  }
  .impact .m .n .u { font-size: 0.42em; color: var(--ink-soft); margin-left: 6px; letter-spacing: 0.05em; }
  .impact .m .l { margin-top: 12px; color: var(--ink-soft); font-size: 0.94rem; max-width: 26ch; }
  .impact .foot {
    margin-top: 44px;
    font-family: var(--mono);
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.03em;
    max-width: 70ch;
  }

  /* ── architecture / instrumentation ────────────────────────── */
  .arch .rack {
    margin-top: 54px;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 1px;
    background: var(--line);
    border: 1px solid var(--line);
    border-radius: 4px;
    overflow: hidden;
  }
  .slot { background: var(--ground); padding: 26px clamp(20px, 3vw, 30px); }
  .slot .readout {
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.1em;
    color: var(--kwh);
    display: flex;
    align-items: center;
    gap: 8px;
    text-transform: uppercase;
  }
  .slot .readout .led {
    width: 6px; height: 6px; border-radius: 50%;
    background: var(--kwh); box-shadow: 0 0 8px var(--kwh);
  }
  .slot h4 { margin: 14px 0 8px; font-size: 1.08rem; font-weight: 650; }
  .slot p { margin: 0; color: var(--ink-mute); font-size: 0.9rem; line-height: 1.55; }

  /* ── reach ─────────────────────────────────────────────────── */
  .reach .line {
    margin-top: 48px;
    display: flex;
    align-items: center;
    gap: 0;
    flex-wrap: wrap;
    font-family: var(--mono);
  }
  .reach .now, .reach .next {
    padding: 12px 18px;
    border: 1px solid var(--line);
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
  .reach .now { color: var(--kwh); border-color: var(--line-strong); border-radius: 100px 0 0 100px; }
  .reach .conn { flex: 1 1 40px; height: 1px; min-width: 30px; background: linear-gradient(90deg, var(--kwh), var(--kwacha)); }
  .reach .next { color: var(--ink-soft); border-radius: 0 100px 100px 0; }
  .reach .countries {
    margin-top: 30px;
    display: flex; flex-wrap: wrap; gap: 8px;
  }

  /* ── close ─────────────────────────────────────────────────── */
  .close {
    position: relative;
    text-align: center;
    padding: clamp(64px, 10vw, 116px) 0;
    overflow: hidden;
  }
  .close::before {
    content: "";
    position: absolute; inset: 0;
    background:
      radial-gradient(60% 70% at 50% 30%, rgba(11, 110, 79, 0.42), transparent 65%),
      radial-gradient(50% 60% at 50% 110%, rgba(232, 150, 61, 0.2), transparent 60%),
      linear-gradient(180deg, rgba(4, 17, 12, 0.6), rgba(4, 17, 12, 0.78));
    z-index: 1;
  }
  .close .shell { position: relative; z-index: 2; }
  .close h2 {
    font-size: clamp(2.1rem, 6vw, 4rem);
    line-height: 1.02;
    max-width: 18ch;
    margin: 20px auto 0;
  }
  .close h2 .kwh { color: var(--kwh); }
  .close h2 .kwacha { color: var(--kwacha-hi); }
  .close .eyebrow { justify-content: center; }
  .close .eyebrow::before { display: none; }
  .close .sub { margin: 24px auto 0; max-width: 48ch; color: var(--ink-soft); }
  .close .who {
    margin-top: 42px;
    display: inline-flex;
    flex-wrap: wrap;
    gap: 10px 12px;
    justify-content: center;
  }
  .close .who span {
    font-family: var(--mono);
    font-size: 12px;
    letter-spacing: 0.06em;
    color: var(--ink-soft);
    padding: 8px 15px;
    border: 1px solid var(--line);
    border-radius: 100px;
  }

  footer {
    border-top: 1px solid var(--line);
    padding: 34px var(--edge);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.06em;
    color: var(--ink-mute);
  }
  footer .brand .name { font-size: 11px; }

  .imgcredits {
    padding: 0 var(--edge) 30px;
    font-family: var(--mono);
    font-size: 10px;
    line-height: 1.7;
    letter-spacing: 0.03em;
    color: rgba(116, 137, 126, 0.62);
    max-width: 100%;
  }
  .imgcredits a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }

  /* ── photography, treated to match the palette ─────────────── */
  /* Real photographs, pulled into the brand: desaturated and darkened, then
     tinted — mint for electricity, copper for fuel — with a soft-light wash,
     and grounded with a dark gradient so each image sits *inside* the page
     rather than pasted on top of it. The look is authored, not stock. */
  .shot { position: relative; overflow: hidden; background: var(--ground-2); }
  .shot img {
    display: block; width: 100%; height: 100%;
    object-fit: cover;
    filter: saturate(0.5) contrast(1.06) brightness(0.62);
  }
  .shot::before {                      /* brand tint (mint by default) */
    content: ""; position: absolute; inset: 0; pointer-events: none;
    mix-blend-mode: soft-light; opacity: 0.92;
    background: linear-gradient(120deg, var(--kwh-deep), var(--kwh) 55%, #0a3a2a);
  }
  .shot.copper::before {               /* copper tint for the fuel vertical */
    background: linear-gradient(120deg, #6b3410, var(--kwacha) 55%, var(--kwacha-hi));
  }
  .shot::after {                       /* ground it + keep captions legible */
    content: ""; position: absolute; inset: 0; pointer-events: none;
    background:
      radial-gradient(120% 100% at 80% 0%, rgba(47, 226, 154, 0.10), transparent 55%),
      linear-gradient(180deg, rgba(4, 17, 12, 0.34) 0%, rgba(4, 17, 12, 0.06) 42%, rgba(4, 17, 12, 0.92) 100%);
  }
  .shot.copper::after {
    background:
      radial-gradient(120% 100% at 20% 0%, rgba(232, 150, 61, 0.13), transparent 55%),
      linear-gradient(180deg, rgba(12, 10, 6, 0.34) 0%, rgba(12, 10, 6, 0.06) 42%, rgba(12, 10, 6, 0.92) 100%);
  }
  /* a real, brand-coloured photo (Novea's own forecourt): keep the blue/red
     identity readable but pull it well down into the dark page — muted and
     darkened, with a stronger top-and-bottom wash and a faint green cast at the
     edges so it blends with the surrounding sections rather than glaring out.
     object-position biases the crop toward the canopy sign. */
  .shot.brand img {
    filter: saturate(0.72) contrast(1.04) brightness(0.6);
    object-position: center 40%;
  }
  .shot.brand::before {                /* faint green edge-cast to tie it in */
    mix-blend-mode: soft-light; opacity: 0.5;
    background: radial-gradient(120% 130% at 50% 45%, transparent 42%, rgba(4, 17, 12, 0.9) 100%);
  }
  .shot.brand::after {
    background: linear-gradient(180deg,
      rgba(4, 17, 12, 0.6) 0%, rgba(4, 17, 12, 0.14) 30%,
      rgba(12, 10, 6, 0.2) 60%, rgba(4, 17, 12, 0.95) 100%);
  }

  /* framed scene: a cinematic crop that echoes the old illustrated blocks */
  .scene {
    margin-top: 54px;
    border: 1px solid var(--line);
    border-radius: 6px;
    overflow: hidden;
    position: relative;
  }
  .scene .shot { aspect-ratio: 12 / 5; }
  .scene .cap {
    position: absolute;
    left: 18px; bottom: 13px;
    z-index: 2;
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--ink-soft);
    text-shadow: 0 1px 10px rgba(0, 0, 0, 0.6);
  }
  @media (max-width: 760px) { .scene .shot { aspect-ratio: 3 / 2; } }

  /* full-bleed dusk divider between the hero and the page — pylons at sunset,
     faded into the ground colour at top and bottom so it reads as a band of
     atmosphere, not a boxed photo. */
  .skyline-band {
    position: relative;
    height: clamp(190px, 26vw, 300px);
    overflow: hidden;
    border-top: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
    background: var(--ground);
  }
  .skyline-band img {
    width: 100%; height: 100%; object-fit: cover;
    filter: saturate(0.6) contrast(1.05) brightness(0.58);
  }
  .skyline-band::after {
    content: ""; position: absolute; inset: 0; pointer-events: none;
    background:
      radial-gradient(90% 140% at 58% 44%, rgba(232, 150, 61, 0.20), transparent 60%),
      linear-gradient(180deg, var(--ground) 0%, rgba(4, 17, 12, 0) 34%, rgba(4, 17, 12, 0) 62%, var(--ground) 100%);
  }
  /* mint-glow variant for the electricity-side transition bands */
  .skyline-band.green::after {
    background:
      radial-gradient(90% 140% at 44% 46%, rgba(47, 226, 154, 0.16), transparent 60%),
      linear-gradient(180deg, var(--ground) 0%, rgba(4, 17, 12, 0) 34%, rgba(4, 17, 12, 0) 62%, var(--ground) 100%);
  }

  /* photographic backdrop layer for the hero and the closing CTA */
  .bg-photo { position: absolute; inset: 0; z-index: 0; overflow: hidden; }
  .bg-photo img { width: 100%; height: 100%; object-fit: cover; }
  .hero .bg-photo img { filter: saturate(0.4) contrast(1.04) brightness(0.46); }
  .close .bg-photo img { filter: saturate(0.42) contrast(1.05) brightness(0.4); }

  /* ── reveal system ─────────────────────────────────────────── */
  .reveal {
    opacity: 0;
    transform: translateY(48px) scale(0.975);
    filter: blur(5px);
    transition:
      opacity 0.6s ease,
      transform 0.85s cubic-bezier(0.16, 1, 0.3, 1),
      filter 0.55s ease;
    transition-delay: calc(var(--i, 0) * 62ms);
    will-change: transform, opacity, filter;
  }
  .reveal.in {
    opacity: 1;
    transform: none;
    filter: none;
  }

  /* Capability cards cascade in after their panel — the console populating,
     rather than four blocks appearing at once. */
  .cards .card {
    opacity: 0;
    transform: translateY(30px) scale(0.96);
    transition:
      opacity 0.5s ease,
      transform 0.62s cubic-bezier(0.22, 1.12, 0.36, 1);
  }
  .group.in .cards .card { opacity: 1; transform: none; }
  .group.in .cards .card:nth-child(1) { transition-delay: 0.10s; }
  .group.in .cards .card:nth-child(2) { transition-delay: 0.19s; }
  .group.in .cards .card:nth-child(3) { transition-delay: 0.28s; }
  .group.in .cards .card:nth-child(4) { transition-delay: 0.37s; }
  .group.in .cards .card:nth-child(5) { transition-delay: 0.46s; }
  .group.in .cards .card:nth-child(6) { transition-delay: 0.55s; }
  .group.in .cards .card:nth-child(7) { transition-delay: 0.64s; }
  .group.in .cards .card:nth-child(8) { transition-delay: 0.73s; }

  /* ── fuel / OMC vertical — copper, the second business ──────── */
  .fuel-band { background: linear-gradient(180deg, var(--ground), #0c0a06 55%, var(--ground)); }
  .pipe.fuel { grid-template-columns: repeat(5, 1fr); }
  .pipe.fuel .flow {
    background: linear-gradient(90deg, var(--kwacha), var(--kwacha-hi));
    box-shadow: 0 0 10px rgba(232, 150, 61, 0.5);
  }
  .pipe.fuel .node.lit .orb {
    color: var(--kwacha-hi);
    border-color: var(--kwacha-hi);
    box-shadow: 0 0 0 4px rgba(232, 150, 61, 0.12), 0 0 22px rgba(232, 150, 61, 0.4);
  }
  /* the last fuel node is Collect — the cash, so it flips to money-green */
  .pipe.fuel .node:last-child.lit .orb {
    color: var(--kwh);
    border-color: var(--kwh);
    box-shadow: 0 0 0 4px rgba(47, 226, 154, 0.1), 0 0 22px rgba(47, 226, 154, 0.35);
  }
  .group.fuel .card .ic { color: var(--kwacha-hi); border-color: rgba(232, 150, 61, 0.32); }
  .group.fuel .card .meta { color: var(--kwacha-hi); }
  .group.fuel .card:hover { background: #17110a; }

  @media (max-width: 760px) {
    /* both the electricity and the (more specific) fuel pipe collapse to two
       columns — the .pipe.fuel selector must be named or it keeps its 5 columns
       and overflows the phone. */
    .pipe, .pipe.fuel { grid-template-columns: 1fr 1fr; gap: 26px 14px; }
    .pipe::before, .pipe .flow { display: none; }
    .split { grid-template-columns: 1fr; }
    .scrollcue { display: none; }
  }
  @media (max-width: 520px) {
    /* the status chip can't fit beside the wordmark on a phone — the wordmark
       carries the brand alone here */
    .nav .status { display: none; }
  }

  @media (prefers-reduced-motion: reduce) {
    * { animation: none !important; }
    .reveal { opacity: 1; transform: none; filter: none; transition: none; }
    .cards .card { opacity: 1; transform: none; transition: none; }
    .hero h1 .ch { opacity: 1; transform: none; }
    .hero h1 .caret { display: none; }
    .wire { display: none; }
    #field { display: none; }
  }

/* ── vertical chooser (hub) ─────────────────────────────────── */
/* The hub's job is to route: a utility buyer and an OMC buyer want different
   pages. Two equal-weight cards, each tinted to its vertical. */
.chooser {
  margin-top: 52px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 20px;
}
.pick {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: clamp(26px, 3.4vw, 40px);
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel);
  text-decoration: none;
  color: inherit;
  overflow: hidden;
  transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1),
              border-color 0.3s ease, background 0.3s ease;
}
.pick::after {                       /* vertical-coloured wash from the corner */
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(90% 70% at 88% 6%, rgba(47, 226, 154, 0.13), transparent 60%);
  transition: opacity 0.3s ease;
}
.pick.fuel-side::after {
  background: radial-gradient(90% 70% at 88% 6%, rgba(232, 150, 61, 0.15), transparent 60%);
}
.pick:hover { transform: translateY(-3px); border-color: var(--line-strong); background: var(--panel-2); }
.pick > * { position: relative; z-index: 1; }
.pick .k {
  font-family: var(--mono); font-size: 11px; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--kwh);
}
.pick.fuel-side .k { color: var(--kwacha-hi); }
.pick h3 { font-size: clamp(1.4rem, 2.6vw, 1.95rem); line-height: 1.08; }
.pick p { margin: 0; color: var(--ink-soft); font-size: 0.98rem; line-height: 1.6; }
.pick ul { margin: 6px 0 0; padding: 0; list-style: none; display: grid; gap: 7px; }
.pick li {
  font-size: 0.88rem; color: var(--ink-mute); padding-left: 18px; position: relative;
}
.pick li::before {
  content: ""; position: absolute; left: 0; top: 0.55em;
  width: 7px; height: 1px; background: var(--kwh);
}
.pick.fuel-side li::before { background: var(--kwacha-hi); }
.pick .go {
  margin-top: 8px;
  font-family: var(--mono); font-size: 12px; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--kwh);
  display: inline-flex; align-items: center; gap: 8px;
}
.pick.fuel-side .go { color: var(--kwacha-hi); }
.pick .go span { transition: transform 0.3s ease; }
.pick:hover .go span { transform: translateX(5px); }

/* ── cross-link to the other vertical (spokes) ──────────────── */
/* Stated on every spoke, not buried: the differentiator is that both verticals
   share one ledger. A visitor on either page must see the other exists. */
.crosslink a {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 18px;
  padding: clamp(24px, 3vw, 36px);
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel);
  text-decoration: none; color: inherit;
  transition: border-color 0.3s ease, background 0.3s ease, transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.crosslink a:hover { border-color: var(--line-strong); background: var(--panel-2); transform: translateY(-2px); }
.crosslink .t { max-width: 62ch; }
.crosslink .k {
  font-family: var(--mono); font-size: 11px; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--kwacha-hi); display: block; margin-bottom: 10px;
}
.crosslink.to-kwh .k { color: var(--kwh); }
.crosslink h3 { font-size: clamp(1.2rem, 2.4vw, 1.6rem); margin-bottom: 8px; }
.crosslink p { margin: 0; color: var(--ink-soft); font-size: 0.95rem; line-height: 1.6; }
.crosslink .go {
  font-family: var(--mono); font-size: 12px; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--kwacha-hi); white-space: nowrap;
  display: inline-flex; align-items: center; gap: 8px;
}
.crosslink.to-kwh .go { color: var(--kwh); }
.crosslink a:hover .go span { transform: translateX(5px); }
.crosslink .go span { transition: transform 0.3s ease; }
