/* ==========================================================================
   Degaty Solutions — site styles
   EDIT COLORS HERE:  brand green + blue come from the logo.
   ========================================================================== */
:root{
  --green:#1f7a3f;        /* logo green */
  --green-600:#176031;
  --green-050:#eaf5ee;
  --blue:#243f92;         /* logo blue  */
  --blue-600:#1b2f70;
  --blue-050:#eef1fb;
  --ink:#16202a;          /* body text  */
  --ink-soft:#4a5966;
  --ink-faint:#8493a0;
  --line:#e5e9ee;
  --bg:#ffffff;
  --bg-soft:#f6f8fa;
  --bg-dark:#0f1922;
  --amber:#e8a03a;
  --radius:14px;
  --shadow:0 10px 30px rgba(20,40,60,.08);
  --shadow-lg:0 24px 60px rgba(20,40,60,.14);
  --sans:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --display:"Sora","Inter",sans-serif;
  --wrap:1180px;
}
/* THE SAME TWO TYPEFACES AS BEFORE — Sora for headings, Inter for text — but
   served from this site instead of from Google.

   Why: one less third-party connection on a Ghanaian mobile connection (the
   Google Fonts round trip was costing more than the fonts themselves), the
   service worker can keep them for offline use, and no visitor data leaves for
   a third party just to draw a heading. Both are variable fonts under the SIL
   Open Font License — the licence files sit beside them in assets/fonts/. */
@font-face{font-family:"Sora";font-style:normal;font-weight:100 900;font-display:swap;
  src:url(../fonts/sora.woff2) format("woff2-variations"),url(../fonts/sora.woff2) format("woff2")}
@font-face{font-family:"Inter";font-style:normal;font-weight:100 900;font-display:swap;
  src:url(../fonts/inter.woff2) format("woff2-variations"),url(../fonts/inter.woff2) format("woff2")}

*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--sans);color:var(--ink);background:var(--bg);line-height:1.6;-webkit-font-smoothing:antialiased}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3,h4{font-family:var(--display);line-height:1.15;font-weight:700;color:var(--ink)}
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 24px}
.eyebrow{font-size:12.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--green)}
.muted{color:var(--ink-soft)}
section{padding:84px 0}
.center{text-align:center}

/* ---------- Buttons ---------- */
.btn{display:inline-flex;align-items:center;gap:9px;padding:13px 24px;border-radius:10px;font-weight:600;
  font-size:15px;font-family:var(--sans);cursor:pointer;border:1px solid transparent;transition:.18s;white-space:nowrap}
.btn-green{background:var(--green);color:#fff}
.btn-green:hover{background:var(--green-600);transform:translateY(-1px)}
.btn-blue{background:var(--blue);color:#fff}
.btn-blue:hover{background:var(--blue-600);transform:translateY(-1px)}
.btn-ghost{background:#fff;border-color:var(--line);color:var(--ink)}
.btn-ghost:hover{border-color:var(--green);color:var(--green)}
.btn-lg{padding:16px 30px;font-size:16px}

/* A button's text colour, restated with two classes so it outranks any
   `.some-panel a{color:…}` rule a section defines for its ordinary links.
   Those rules score one class plus one element; these score two classes, so
   they win wherever a button is dropped inside a block of text — which is
   exactly what happened to the PDF button on the calculator's thank-you
   panel. Colour only: everything else still comes from the rules above. */
.btn.btn-green,.btn.btn-green:hover{color:#fff}
.btn.btn-blue,.btn.btn-blue:hover{color:#fff}
.btn.btn-ghost{color:var(--ink)}
.btn.btn-ghost:hover{color:var(--green)}

/* ---------- Header ---------- */
.nav{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.92);backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line)}
.nav-inner{display:flex;align-items:center;gap:26px;height:74px}
.logo{display:flex;align-items:center;gap:11px;font-family:var(--display);font-weight:800;font-size:18px;letter-spacing:-.3px}
.logo .mark{width:40px;height:40px;border-radius:10px;background:linear-gradient(135deg,var(--green),var(--blue));
  color:#fff;display:grid;place-items:center;font-weight:800;font-size:19px}
/* Business logo image — swap images/logo.png for the real logo file (same name = no other edits).
   If the logo already contains the company name, delete the <span>Degaty…</span> next to it. */
.logo .mark-img{height:42px;width:auto;max-width:190px;object-fit:contain;flex-shrink:0}
footer .logo .mark-img{height:40px}
.logo small{display:block;font-family:var(--sans);font-size:10px;font-weight:600;letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink-faint);margin-top:1px}
.menu{display:flex;gap:4px;margin-left:auto;align-items:center}
.menu a{padding:9px 13px;border-radius:8px;font-size:14.5px;font-weight:500;color:var(--ink-soft)}
.menu a:hover,.menu a.active{color:var(--green);background:var(--green-050)}
/* A menu item set to "button" style in Admin -> Menu keeps its own colours. */
.menu a.btn-green,.menu a.btn-green:hover{color:#fff;background:var(--green)}
.menu a.btn-green:hover{background:var(--green-600)}
.menu a.btn-blue,.menu a.btn-blue:hover{color:#fff;background:var(--blue)}
.menu a.btn-blue:hover{background:var(--blue-600)}
.nav .btn{margin-left:6px}
.burger{display:none;margin-left:auto;background:none;border:none;cursor:pointer;padding:8px}
.burger span{display:block;width:24px;height:2px;background:var(--ink);margin:5px 0;transition:.2s}

/* ---------- Dropdown menu ---------- */
.drop{position:relative}
.drop-btn{display:inline-flex;align-items:center;gap:5px;padding:9px 13px;border-radius:8px;font-size:14.5px;
  font-weight:500;color:var(--ink-soft);background:none;border:none;font-family:var(--sans);cursor:pointer}
.drop-btn:hover,.drop.open>.drop-btn{color:var(--green);background:var(--green-050)}
.drop-btn .chev{width:13px;height:13px;fill:currentColor;transition:transform .22s}
.drop.open>.drop-btn .chev{transform:rotate(180deg)}
.drop-panel{position:absolute;top:calc(100% + 14px);left:50%;transform:translateX(-50%) translateY(-6px);
  min-width:308px;background:#fff;border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow-lg);
  padding:10px;opacity:0;visibility:hidden;transition:opacity .2s,transform .2s,visibility .2s;z-index:80}
.drop-panel::before{content:"";position:absolute;top:-7px;left:50%;transform:translateX(-50%) rotate(45deg);
  width:14px;height:14px;background:#fff;border-left:1px solid var(--line);border-top:1px solid var(--line);
  border-radius:3px 0 0 0}
.drop-panel a{display:flex;gap:12px;align-items:center;padding:10px;border-radius:11px;color:var(--ink)}
.drop-panel a:hover{background:var(--bg-soft)}
.drop-panel .di{width:38px;height:38px;border-radius:10px;display:grid;place-items:center;flex-shrink:0}
.drop-panel .di svg{width:18px;height:18px}
.drop-panel .di.g{background:var(--green-050)} .drop-panel .di.g svg{fill:var(--green)}
.drop-panel .di.b{background:var(--blue-050)} .drop-panel .di.b svg{fill:var(--blue)}
.drop-panel b{display:block;font-size:14px;font-weight:600}
.drop-panel small{display:block;font-size:12px;color:var(--ink-faint);font-weight:400;margin-top:1px}
.drop-panel .drop-all{justify-content:center;margin-top:2px;padding-top:13px;border-top:1px solid var(--line);
  font-weight:600;font-size:13.5px;color:var(--green)}
.drop-panel .drop-all:hover{background:var(--green-050)}
.drop-panel-sm{min-width:200px}
@media(min-width:641px){
  .drop:hover .drop-panel,.drop:focus-within .drop-panel,.drop.open .drop-panel{
    opacity:1;visibility:visible;transform:translateX(-50%) translateY(0)}
}

/* ---------- Hero ---------- */
.hero{background:
    radial-gradient(1100px 460px at 78% -8%, rgba(36,63,146,.10), transparent 60%),
    radial-gradient(900px 420px at 8% 0%, rgba(31,122,63,.10), transparent 55%),
    var(--bg-soft);
  border-bottom:1px solid var(--line);overflow:hidden;padding:0 0 46px}
.hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
.hero h1{font-size:clamp(32px,4.6vw,50px);font-weight:800;letter-spacing:-1px}
.hero h1 .hl{background:linear-gradient(120deg,var(--green),var(--blue));-webkit-background-clip:text;background-clip:text;color:transparent}
.hero p.lead{font-size:18px;color:var(--ink-soft);margin:22px 0 30px;max-width:540px}
.hero-cta{display:flex;gap:12px;flex-wrap:wrap}
.hero-badges{display:flex;gap:26px;flex-wrap:wrap;padding-top:26px;border-top:1px solid var(--line)}
.hero-badges div b{font-family:var(--display);font-size:26px;color:var(--ink);display:block}
.hero-badges div span{font-size:12.5px;color:var(--ink-faint)}

/* ---------- Hero slider ---------- */
.hero-slider{position:relative;overflow:hidden}
.hero-track{display:flex;transition:transform .7s cubic-bezier(.65,0,.35,1)}
.hslide{min-width:100%;padding:76px 0 74px}
.hero-copy>*{opacity:0;transform:translateY(16px)}
.hslide.is-active .hero-copy>*{animation:heroIn .62s cubic-bezier(.22,1,.36,1) forwards}
.hslide.is-active .hero-copy>*:nth-child(1){animation-delay:.05s}
.hslide.is-active .hero-copy>*:nth-child(2){animation-delay:.14s}
.hslide.is-active .hero-copy>*:nth-child(3){animation-delay:.23s}
.hslide.is-active .hero-copy>*:nth-child(4){animation-delay:.32s}
@keyframes heroIn{to{opacity:1;transform:translateY(0)}}

.hero-visual{position:relative;border-radius:20px;overflow:hidden;box-shadow:var(--shadow-lg);
  min-height:400px;display:grid;place-items:center;padding:30px}
.hero-visual img:not(.hero-front){position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1}
.hero-visual .art{position:relative;z-index:2;width:100%;max-width:430px;height:auto}
.hero-visual::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:radial-gradient(420px 300px at 78% 12%, rgba(255,255,255,.10), transparent 62%)}
.v-intro{background:linear-gradient(160deg,#12233f,#0f1922)}
.v-solar{background:linear-gradient(155deg,#0e3320,#1f7a3f 62%,#2f9c56)}
.v-track{background:linear-gradient(155deg,#111a36,#243f92 62%,#3352b4)}
.v-secure{background:linear-gradient(155deg,#0a1219,#182634 62%,#243549)}
.v-it{background:linear-gradient(155deg,#0a2f30,#0f6666 62%,#149595)}
.hero-visual .pulse{position:relative;width:100%;height:100%;display:grid;place-items:center;z-index:2}
.hero-visual .device{width:170px;height:230px;border-radius:16px;background:linear-gradient(160deg,#eef2f6,#cfd8e0);
  box-shadow:0 20px 50px rgba(0,0,0,.4);position:relative;z-index:2}
.hero-visual .device::before{content:"";position:absolute;top:20px;left:50%;transform:translateX(-50%);
  width:60px;height:60px;border-radius:50%;background:#0f1922;border:4px solid #243f92}
.hero-visual .ring{position:absolute;border:2px solid rgba(63,208,127,.4);border-radius:50%;animation:ripple 3s ease-out infinite}
.hero-visual .ring:nth-child(2){animation-delay:1s}
.hero-visual .ring:nth-child(3){animation-delay:2s}
@keyframes ripple{0%{width:180px;height:180px;opacity:.9}100%{width:460px;height:460px;opacity:0}}

.hero-arrow{position:absolute;top:46%;transform:translateY(-50%);width:46px;height:46px;border-radius:50%;
  background:#fff;border:1px solid var(--line);box-shadow:var(--shadow);color:var(--ink);font-size:22px;
  line-height:1;cursor:pointer;display:grid;place-items:center;z-index:5;transition:.18s}
.hero-arrow:hover{color:var(--green);border-color:var(--green)}
.hero-arrow.prev{left:18px}
.hero-arrow.next{right:18px}
.hero-dots{position:absolute;bottom:26px;left:0;right:0;display:flex;justify-content:center;gap:8px;z-index:5}
.hero-dots button{width:9px;height:9px;border-radius:50%;background:#c3ced8;border:none;cursor:pointer;
  padding:0;transition:.2s}
.hero-dots button:hover{background:var(--ink-faint)}
.hero-dots button.active{background:var(--green);width:26px;border-radius:5px}

@media(prefers-reduced-motion:reduce){
  .hero-visual .ring{animation:none}
  .hero-track{transition:none}
  .hero-copy>*{opacity:1;transform:none}
  .hslide.is-active .hero-copy>*{animation:none}
}

/* ---------- Service cards ---------- */
.grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:24px}
.card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:26px;transition:.2s}
.card:hover{box-shadow:var(--shadow);transform:translateY(-3px);border-color:transparent}
/* The size belongs to `.ico` itself, not to `.card .ico`.
   It was only ever written as `.card .ico`, so the same badge used anywhere
   else had NO width, NO height and an <svg> with nothing to size itself
   against — which is why the credential icons on the About page grew to fill
   their whole card. Anything that needs a different size still overrides it
   below; this is only the floor. */
.ico{width:52px;height:52px;border-radius:12px;display:grid;place-items:center}
.ico svg{width:26px;height:26px}

.card .ico{width:52px;height:52px;border-radius:12px;display:grid;place-items:center;margin-bottom:16px}
.card .ico svg{width:26px;height:26px}
.ico.g{background:var(--green-050)} .ico.g svg{fill:var(--green)}
.ico.b{background:var(--blue-050)} .ico.b svg{fill:var(--blue)}
.card h3{font-size:18px;margin-bottom:8px}
.card p{font-size:14.5px;color:var(--ink-soft)}
.card .more{display:inline-block;margin-top:14px;font-weight:600;font-size:14px;color:var(--green)}

/* ---------- Section header ---------- */
.sec-head{max-width:660px;margin:0 auto 46px}
.sec-head.center{text-align:center}
.sec-head h2{font-size:clamp(26px,3.4vw,38px);font-weight:800;letter-spacing:-.5px;margin:10px 0 12px}
.sec-head p{color:var(--ink-soft);font-size:16px}

/* ---------- Stats band ---------- */
.band{background:var(--bg-dark);color:#fff}
.band .grid-4{gap:0}
.band .stat{padding:34px 20px;text-align:center;border-right:1px solid rgba(255,255,255,.08)}
.band .stat:last-child{border-right:none}
.band .stat b{font-family:var(--display);font-size:36px;font-weight:800;background:linear-gradient(120deg,#4fe08d,#6aa8ff);
  -webkit-background-clip:text;background-clip:text;color:transparent;display:block}
.band .stat span{color:#9fb0bf;font-size:13.5px;margin-top:4px;display:block}

/* ---------- Pricing ---------- */
.price-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.price{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:26px;display:flex;flex-direction:column;position:relative;overflow:hidden}
.price.feat{border:2px solid var(--green);box-shadow:var(--shadow);position:relative}
/* Sits INSIDE the card. .price has overflow:hidden, so the old top:-11px put
   the badge outside the rounded corner where it was clipped away entirely. */
.price.feat::after{content:"Popular";position:absolute;top:14px;right:14px;background:var(--green);color:#fff;
  font-size:10.5px;font-weight:700;padding:4px 11px;border-radius:20px;letter-spacing:.06em;
  text-transform:uppercase;z-index:2}
.price h3{font-size:19px}
.price .kva{font-size:13px;color:var(--ink-faint);font-weight:600;margin-top:2px}
.price .amt{font-family:var(--display);font-size:30px;font-weight:800;margin:16px 0 4px;color:var(--ink)}
.price .amt small{font-size:14px;color:var(--ink-faint);font-weight:600}
.price ul{list-style:none;margin:16px 0 22px;display:flex;flex-direction:column;gap:9px}
.price li{font-size:14px;color:var(--ink-soft);padding-left:24px;position:relative}
.price li::before{content:"";position:absolute;left:0;top:7px;width:14px;height:8px;border-left:2px solid var(--green);
  border-bottom:2px solid var(--green);transform:rotate(-45deg)}
.price .btn{margin-top:auto}
.price-note{text-align:center;color:var(--ink-soft);margin-top:24px;font-size:14.5px}

/* --- package cards ---------------------------------------------------------
   Thirteen prices is a lot to scan, so each card carries only what a buyer
   compares at a glance — panel size, battery, inverter — as label/value rows.
   Everything else opens behind "What it can run".

   A small solar-panel mark at the top of each card. A photograph was tried here
   and took too much of the page: with thirteen packages the price is what people
   came to read, and it should be reachable without scrolling past a picture.
   Real photographs live on the product page and in the gallery instead. */
.price-icon{display:block;color:var(--green);margin:0 0 14px}
.price-icon svg{width:66px;height:66px;fill:currentColor;display:block}
.price-badge{position:absolute;top:14px;right:14px;z-index:1;background:var(--green);color:#fff;
  font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:4px 10px;border-radius:999px}
/* Solar packages carry their own .price-badge element (its wording is editable
   in admin), so THOSE cards suppress the built-in one. Scoped with :has() —
   as a blanket rule this silently removed the "Popular" badge from the vehicle
   tracker plans too, which have no .price-badge to replace it. */
.price.feat:has(.price-badge)::after{content:none}
.price-best{font-size:13.5px;color:var(--ink-soft);margin:2px 0 0;line-height:1.5}

.price-specs{list-style:none;margin:16px 0 14px;padding:0;display:flex;flex-direction:column;gap:0}
.price-specs li{display:flex;justify-content:space-between;gap:14px;align-items:baseline;
  font-size:13.5px;padding:8px 0;border-bottom:1px solid var(--line);position:static}
.price-specs li::before{content:none}
.price-specs li:last-child{border-bottom:0}
.price-specs li span{color:var(--ink-faint);flex:0 0 auto}
.price-specs li b{color:var(--ink);font-weight:600;text-align:right}
.price-more .small{margin-top:8px}
.price-more .small b{color:var(--ink)}

.price-more{margin:0 0 18px;font-size:13.5px}
.price-more summary{cursor:pointer;color:var(--green);font-weight:600;list-style:none;padding:6px 0}
.price-more summary::-webkit-details-marker{display:none}
.price-more summary::after{content:" +";font-weight:700}
.price-more[open] summary::after{content:" −"}
.price-more p{color:var(--ink-soft);line-height:1.6;margin:6px 0 0}

.price-actions{margin-top:auto;display:flex;gap:10px;flex-wrap:wrap}
.price-actions .btn{flex:1 1 auto;text-align:center;margin-top:0}
.price-help{text-align:center;color:var(--ink-soft);margin-top:22px;font-size:14.5px}
.price-help a{color:var(--green);font-weight:600}

/* ---------- Notices ---------- */
.flash-wrap{padding-top:18px}
.notice{padding:14px 18px;border-radius:12px;font-size:14.5px;margin-bottom:16px;border:1px solid}
.notice-success{background:var(--green-050);border-color:#c7e5d2;color:var(--green-600)}
.notice-error{background:#fdeceb;border-color:#f5c6c2;color:#a32720}
.notice-info{background:var(--blue-050);border-color:#ccd6f5;color:var(--blue-600)}
.notice-warn{background:#fdf4e3;border-color:#f0dcae;color:#8a6416}
.field-error{display:block;color:#c0392b;font-size:12.5px;margin-top:5px}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ---------- Cart link in the nav ---------- */
.cart-link{display:inline-flex;align-items:center;gap:7px;position:relative;padding:9px 13px;border-radius:8px;
  font-size:14.5px;font-weight:500;color:var(--ink-soft)}
.cart-link svg{width:19px;height:19px;fill:currentColor}
.cart-link:hover{color:var(--green);background:var(--green-050)}
.cart-badge{position:absolute;top:1px;right:2px;min-width:18px;height:18px;border-radius:9px;background:var(--green);
  color:#fff;font-size:11px;font-weight:700;display:grid;place-items:center;padding:0 5px}
.drop-btn.is-current{color:var(--green);background:var(--green-050)}

/* ---------- Shop layout ---------- */
.phero-shop{padding-bottom:44px}
.shop-layout{display:grid;grid-template-columns:250px 1fr;gap:34px;align-items:start}
.shop-side{position:sticky;top:96px;display:flex;flex-direction:column;gap:18px}
.shop-search{display:flex;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff}
.shop-search input{flex:1;border:none;padding:12px 14px;font-family:var(--sans);font-size:14.5px;min-width:0}
.shop-search input:focus{outline:none}
.shop-search button{border:none;background:var(--green);color:#fff;padding:0 14px;cursor:pointer;display:grid;place-items:center}
.shop-search button svg{width:17px;height:17px;fill:#fff}
.side-box{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:20px}
.side-box h4{font-size:13px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-faint);margin-bottom:12px}
.side-cats{list-style:none;display:flex;flex-direction:column;gap:2px}
.side-cats a{display:flex;justify-content:space-between;gap:10px;padding:9px 11px;border-radius:9px;
  font-size:14.5px;color:var(--ink-soft)}
.side-cats a span{color:var(--ink-faint);font-size:12.5px}
.side-cats a:hover{background:var(--bg-soft);color:var(--ink)}
.side-cats a.on{background:var(--green-050);color:var(--green);font-weight:600}
.side-help{background:var(--bg-soft)}
.side-help p{font-size:14px;color:var(--ink-soft);margin-bottom:14px}
.side-help .btn{width:100%;justify-content:center}
.side-phone{display:block;text-align:center;margin-top:10px;font-weight:700;color:var(--green);font-family:var(--display)}

.shop-toolbar{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;
  padding-bottom:18px;margin-bottom:22px;border-bottom:1px solid var(--line)}
.shop-count{font-size:14.5px;color:var(--ink-soft)}
.shop-sort{display:flex;align-items:center;gap:9px;font-size:14px;color:var(--ink-soft)}
.shop-sort select{border:1px solid var(--line);border-radius:9px;padding:9px 12px;font-family:var(--sans);
  font-size:14px;background:#fff;cursor:pointer}

/* ---------- Product cards ---------- */
.product-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.product{background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;
  display:flex;flex-direction:column;transition:.2s}
.product:hover{box-shadow:var(--shadow);transform:translateY(-3px)}
.product .shot{position:relative;display:block;height:210px;background:var(--bg-soft);border-bottom:1px solid var(--line)}
.product .shot img{width:100%;height:100%;object-fit:contain;padding:16px}
.product .shot.blue{background:var(--blue-050)}
.product .tag{position:absolute;top:12px;left:12px;z-index:3;font-size:11px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;padding:5px 11px;border-radius:20px;background:var(--green);color:#fff}
.product .tag-out{background:var(--ink-faint)}
.product .tag-sale{background:var(--amber)}
.product .body{padding:20px;display:flex;flex-direction:column;flex:1}
.product .cat{font-size:11.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.product h3{font-size:16.5px;margin:6px 0 6px;line-height:1.3}
.product h3 a:hover{color:var(--green)}
.product .blurb{font-size:13.5px;color:var(--ink-soft);margin-bottom:14px}
.product .amt{font-family:var(--display);font-size:22px;font-weight:800;color:var(--green);margin-bottom:16px}
.product .amt s{font-size:14px;color:var(--ink-faint);font-weight:600;margin-left:8px}
.product .add-row{display:flex;gap:8px;margin-top:auto}
.product .add-row .btn{flex:1;justify-content:center;padding:11px 14px;font-size:14px}
.product .btn[disabled]{opacity:.5;cursor:not-allowed}

/* ---------- Pagination ---------- */
.pager{display:flex;gap:8px;justify-content:center;margin-top:38px;flex-wrap:wrap}
.pager a{padding:10px 15px;border:1px solid var(--line);border-radius:9px;font-size:14px;color:var(--ink-soft);background:#fff}
.pager a:hover{border-color:var(--green);color:var(--green)}
.pager a.on{background:var(--green);border-color:var(--green);color:#fff;font-weight:600}

/* ---------- Empty state ---------- */
.empty-state{text-align:center;padding:60px 20px;background:var(--bg-soft);border:1px solid var(--line);
  border-radius:var(--radius)}
.empty-state h3{font-size:20px;margin-bottom:8px}
.empty-state p{color:var(--ink-soft);margin-bottom:20px}
.empty-state .btn{margin:0 5px}

/* ---------- Product detail ---------- */
.product-page{padding-top:36px}
.product-detail{display:grid;grid-template-columns:1fr 1fr;gap:44px;margin:22px 0 50px;align-items:start}
.pd-main{position:relative;background:var(--bg-soft);border:1px solid var(--line);border-radius:18px;
  height:430px;overflow:hidden}
.pd-main.blue{background:var(--blue-050)}
.pd-main img{width:100%;height:100%;object-fit:contain;padding:30px}
.pd-main .tag{position:absolute;top:16px;left:16px;background:var(--amber);color:#fff;font-size:11px;
  font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:5px 12px;border-radius:20px}
.pd-thumbs{display:flex;gap:10px;margin-top:12px;flex-wrap:wrap}
.pd-thumbs button{width:74px;height:74px;border:1px solid var(--line);border-radius:11px;background:var(--bg-soft);
  padding:6px;cursor:pointer;overflow:hidden}
.pd-thumbs button.on,.pd-thumbs button:hover{border-color:var(--green)}
.pd-thumbs img{width:100%;height:100%;object-fit:contain}
.pd-info h1{font-size:clamp(24px,3vw,34px);letter-spacing:-.5px;margin:10px 0 14px}
.pd-meta{display:flex;gap:16px;flex-wrap:wrap;font-size:13.5px;color:var(--ink-soft);
  padding-bottom:18px;border-bottom:1px solid var(--line)}
.pd-meta .in-stock{color:var(--green);font-weight:600}
.pd-meta .no-stock{color:#c0392b;font-weight:600}
.pd-price{font-family:var(--display);font-size:34px;font-weight:800;color:var(--green);margin:18px 0 6px}
.pd-price s{font-size:18px;color:var(--ink-faint);font-weight:600;margin-left:10px}
.pd-blurb{color:var(--ink-soft);font-size:15.5px;margin-bottom:22px}
.pd-buy{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:24px}
.pd-buy input[type=number]{width:84px;padding:14px;border:1px solid var(--line);border-radius:10px;
  font-family:var(--sans);font-size:15px;text-align:center}
.pd-assurance{list-style:none;display:flex;flex-direction:column;gap:9px;padding-top:20px;border-top:1px solid var(--line)}
.pd-assurance li{font-size:14px;color:var(--ink-soft);padding-left:24px;position:relative}
.pd-assurance li::before{content:"";position:absolute;left:0;top:6px;width:12px;height:7px;
  border-left:2px solid var(--green);border-bottom:2px solid var(--green);transform:rotate(-45deg)}
.pd-lower{display:grid;grid-template-columns:1.15fr .85fr;gap:44px;padding-top:42px;border-top:1px solid var(--line)}
.pd-lower h2{font-size:22px;margin-bottom:14px}
.pd-desc p{color:var(--ink-soft);font-size:15.5px}
.spec-table{width:100%;border-collapse:collapse;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.spec-table th{background:var(--bg-soft);text-align:left;padding:12px 16px;font-size:13.5px;
  font-weight:600;color:var(--ink-soft);width:45%;border-bottom:1px solid var(--line)}
.spec-table td{padding:12px 16px;font-size:14.5px;border-bottom:1px solid var(--line)}
.spec-table tr:last-child th,.spec-table tr:last-child td{border-bottom:none}
.related{margin-top:60px}

/* ---------- Cart ---------- */
.cart-layout{display:grid;grid-template-columns:1fr 340px;gap:34px;align-items:start}
.cart-table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.cart-table th{background:var(--bg-soft);text-align:left;padding:14px 16px;font-size:12.5px;text-transform:uppercase;
  letter-spacing:.05em;color:var(--ink-soft)}
.cart-table td{padding:16px;border-top:1px solid var(--line);font-size:14.5px;vertical-align:middle}
.cart-table .c-img{width:84px}
.cart-table .c-img img{width:68px;height:68px;object-fit:contain;background:var(--bg-soft);border-radius:10px;padding:6px}
.cart-table .c-name a{font-weight:600}
.cart-table .c-name a:hover{color:var(--green)}
.cart-table .c-name small{display:block;color:var(--ink-faint);font-size:12.5px;margin-top:2px}
.cart-table .c-total{font-weight:700;font-family:var(--display)}
.qty-input{width:74px;padding:9px;border:1px solid var(--line);border-radius:8px;text-align:center;
  font-family:var(--sans);font-size:14.5px}
.link-remove{background:none;border:none;font-size:22px;line-height:1;color:var(--ink-faint);cursor:pointer;padding:4px 8px}
.link-remove:hover{color:#c0392b}
.cart-actions{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:18px}
.cart-summary{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:24px;position:sticky;top:96px}
.cart-summary h3{font-size:18px;margin-bottom:16px}
.cart-summary .row{display:flex;justify-content:space-between;gap:14px;padding:10px 0;font-size:14.5px;
  color:var(--ink-soft);border-bottom:1px solid var(--line)}
.cart-summary .row b{color:var(--ink);font-weight:600}
.cart-summary .sum-item{font-size:13.5px}
.cart-summary .total{border-bottom:none;padding-top:16px;font-size:16px}
.cart-summary .total b{font-family:var(--display);font-size:22px;color:var(--green)}
.cart-summary .btn{width:100%;justify-content:center;margin-top:16px}
.pay-note{font-size:12.5px;color:var(--ink-faint);margin-top:12px;text-align:center}
.pay-note a{color:var(--green)}

/* ---------- Checkout ---------- */
.checkout-layout{display:grid;grid-template-columns:1fr 360px;gap:34px;align-items:start}
.checkout-form{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:28px}
.checkout-form h3{font-size:18px;margin-bottom:6px}
.pay-methods{margin-top:26px;padding-top:22px;border-top:1px solid var(--line)}
.pay-option{display:flex;gap:14px;align-items:flex-start;border:1px solid var(--line);border-radius:12px;
  padding:16px;cursor:pointer;margin-top:12px}
.pay-option:has(input:checked){border-color:var(--green);background:var(--green-050)}
.pay-option input{margin-top:4px}
.pay-option b{display:block;font-size:15px}
.pay-option small{display:block;color:var(--ink-soft);font-size:13.5px;margin-top:3px}

/* ---------- Order confirmation ---------- */
.order-box{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:26px;margin-top:24px}
.order-box h3{font-size:17px;margin-bottom:14px}

@media(max-width:900px){
  .shop-layout,.cart-layout,.checkout-layout,.product-detail,.pd-lower{grid-template-columns:1fr}
  .shop-side,.cart-summary{position:static}
  .pd-main{height:340px}
}
@media(max-width:640px){
  .product-grid{grid-template-columns:1fr}
  .cart-table thead{display:none}
  .cart-table tr{display:grid;grid-template-columns:84px 1fr auto;gap:6px 12px;padding:14px 0;border-top:1px solid var(--line)}
  .cart-table td{border:none;padding:2px 16px}
  .cart-table .c-img{grid-row:span 4}
  .cart-table td[data-label]::before{content:attr(data-label) ": ";color:var(--ink-faint);font-size:12.5px}
}

/* table pricing */
.ptable{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.ptable th{background:var(--bg-soft);text-align:left;padding:14px 18px;font-size:13px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft)}
.ptable td{padding:14px 18px;border-top:1px solid var(--line);font-size:15px}
.ptable td.p{font-family:var(--display);font-weight:700;color:var(--green);white-space:nowrap}
.ptable tr:hover td{background:var(--green-050)}

/* ---------- CTA strip ---------- */
.cta{background:linear-gradient(120deg,var(--green),var(--blue));color:#fff;border-radius:22px;padding:52px;text-align:center;margin:0 24px}
.cta h2{color:#fff;font-size:clamp(24px,3vw,34px)}
.cta p{color:rgba(255,255,255,.9);max-width:560px;margin:12px auto 26px}
.cta .btn-ghost{background:#fff;border:none;color:var(--green)}
.cta .btn-ghost:hover{color:var(--blue)}

/* ---------- Footer ---------- */
footer{background:var(--bg-dark);color:#c6d2dc;padding:60px 0 26px;margin-top:0}
.foot-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1.2fr;gap:36px;padding-bottom:40px;border-bottom:1px solid rgba(255,255,255,.1)}
footer h4{color:#fff;font-size:14px;text-transform:uppercase;letter-spacing:.08em;margin-bottom:16px}
footer a{color:#c6d2dc;font-size:14.5px;display:block;padding:5px 0}
footer a:hover{color:#4fe08d}
footer .logo{color:#fff}
footer .logo small{color:#8493a0}
.foot-desc{font-size:14px;color:#93a3b1;margin-top:16px;max-width:300px}
.foot-bottom{padding-top:22px;display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;font-size:13px;color:#8493a0}

/* ---------- Contact ---------- */
.contact-grid{display:grid;grid-template-columns:1fr 1.1fr;gap:40px}
.info-card{background:var(--bg-soft);border:1px solid var(--line);border-radius:var(--radius);padding:26px;margin-bottom:16px;display:flex;gap:16px;align-items:flex-start}
.info-card .ico{width:46px;height:46px;border-radius:12px;background:#fff;border:1px solid var(--line);display:grid;place-items:center;flex-shrink:0}
.info-card .ico svg{width:22px;height:22px;fill:var(--green)}
.info-card h4{font-size:15px;margin-bottom:3px}
.info-card p,.info-card a{font-size:14.5px;color:var(--ink-soft)}
.form{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:28px}
.form .row{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.form label{display:block;font-size:13px;font-weight:600;margin:14px 0 6px;color:var(--ink-soft)}
.form input,.form textarea{width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:9px;font-family:var(--sans);font-size:15px}
.form input:focus,.form textarea:focus{outline:none;border-color:var(--green)}
.form textarea{min-height:120px;resize:vertical}

/* ---------- Page hero (inner pages) ---------- */
.phero{background:var(--bg-soft);border-bottom:1px solid var(--line);padding:60px 0}
.phero h1{font-size:clamp(28px,4vw,44px);font-weight:800;letter-spacing:-.5px}
.phero p{color:var(--ink-soft);font-size:17px;margin-top:12px;max-width:640px}
.crumb{font-size:13px;color:var(--ink-faint);margin-bottom:10px}
.crumb a:hover{color:var(--green)}

/* training list */
.checklist{list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:20px 0}
.checklist li{padding-left:30px;position:relative;font-size:15px;color:var(--ink-soft)}
.checklist li::before{content:"✓";position:absolute;left:0;top:0;color:var(--green);font-weight:800}
.factbox{display:flex;gap:14px;flex-wrap:wrap;margin:22px 0}
.fact{background:var(--green-050);border:1px solid #cfe6d6;border-radius:12px;padding:14px 18px;font-size:14.5px}
.fact b{display:block;color:var(--green-600);font-family:var(--display)}

/* whatsapp float */
.wa{position:fixed;bottom:22px;right:22px;width:58px;height:58px;border-radius:50%;background:#25d366;
  display:grid;place-items:center;box-shadow:0 10px 26px rgba(37,211,102,.4);z-index:60}
.wa svg{width:30px;height:30px;fill:#fff}

@media(max-width:1080px) and (min-width:641px){
  .nav-inner{gap:14px}
  .menu a,.drop-btn{padding:9px 9px;font-size:14px}
  .logo{font-size:16px}
}
@media(max-width:900px){
  .hero-grid,.contact-grid{grid-template-columns:1fr}
  .grid-4{grid-template-columns:1fr 1fr}
  .grid-3,.price-grid{grid-template-columns:1fr 1fr}
  .foot-grid{grid-template-columns:1fr 1fr}
  .band .grid-4{grid-template-columns:1fr 1fr}
  .band .stat:nth-child(2){border-right:none}
  .product-grid{grid-template-columns:1fr 1fr}
  /* hero slider stacks: copy first, visual below */
  .hslide{padding:56px 0 78px}
  .hero-grid{gap:34px}
  .hero-visual{min-height:300px}
  .hero-arrow{display:none}
  .hero-dots{bottom:30px}
}
@media(max-width:640px){
  section{padding:60px 0}
  .menu{display:none;position:absolute;top:74px;left:0;right:0;flex-direction:column;background:#fff;
    border-bottom:1px solid var(--line);padding:12px 24px;gap:2px;max-height:calc(100vh - 74px);overflow-y:auto}
  .menu.open{display:flex}
  .menu a{padding:12px}
  .burger{display:block}
  /* Button-styled menu items stay visible on phones — they just go full width. */
  .menu a.btn{margin:8px 0 4px;justify-content:center;padding:13px}
  .grid-4,.grid-3,.grid-2,.price-grid,.checklist,.form .row,.foot-grid{grid-template-columns:1fr}
  .cta{padding:36px 22px;margin:0 16px}

  /* dropdowns become inline accordions on mobile */
  .drop-btn{width:100%;justify-content:space-between;padding:12px}
  .drop-panel{position:static;transform:none;opacity:1;visibility:visible;box-shadow:none;border:none;
    background:transparent;padding:0 0 6px 10px;min-width:0;display:none}
  .drop-panel::before{display:none}
  .drop.open .drop-panel{display:block}
  .drop-panel a{padding:9px 10px}

  /* hero slider */
  .hslide{padding:44px 0 74px}
  .hero-visual{min-height:250px;padding:22px}
  .hero-visual .device{width:130px;height:180px}
  .hero p.lead{font-size:16px;margin:18px 0 24px}
  .hero-badges{gap:20px}
  .product-grid{grid-template-columns:1fr}
}

/* ==========================================================================
   Video section (Solar Pricing) — managed in Admin -> Videos
   ========================================================================== */
.video-section{background:
    radial-gradient(900px 400px at 12% 0%, rgba(31,122,63,.07), transparent 60%),
    radial-gradient(900px 400px at 88% 100%, rgba(36,63,146,.07), transparent 60%),
    var(--bg-soft);
  border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.video-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}
.video-card{position:relative;background:#fff;border:1px solid var(--line);border-radius:18px;overflow:hidden;
  display:flex;flex-direction:column;transition:transform .22s, box-shadow .22s}
.video-card::before{content:"";position:absolute;inset:0;border-radius:18px;pointer-events:none;z-index:4;
  box-shadow:inset 0 3px 0 0 var(--vc-accent, var(--green))}
.video-card::after{content:"";position:absolute;inset:-1px;border-radius:19px;pointer-events:none;z-index:0;
  background:var(--vc-glow, transparent);opacity:0;transition:opacity .22s}
.video-card:hover{transform:translateY(-5px);box-shadow:var(--vc-shadow, var(--shadow-lg))}
.video-card:hover::after{opacity:1}
.video-card.accent-green{--vc-accent:#1f7a3f;--vc-shadow:0 22px 44px rgba(31,122,63,.20);--vc-tint:rgba(31,122,63,.10)}
.video-card.accent-blue{--vc-accent:#243f92;--vc-shadow:0 22px 44px rgba(36,63,146,.20);--vc-tint:rgba(36,63,146,.10)}
.video-card.accent-teal{--vc-accent:#0f6666;--vc-shadow:0 22px 44px rgba(15,102,102,.20);--vc-tint:rgba(15,102,102,.10)}

.video-num{position:absolute;top:14px;right:14px;z-index:5;width:34px;height:34px;border-radius:50%;
  background:rgba(255,255,255,.92);color:var(--vc-accent);font-family:var(--display);font-size:13px;
  font-weight:800;display:grid;place-items:center;box-shadow:0 3px 10px rgba(0,0,0,.18)}
.video-stage{position:relative;aspect-ratio:16/9;background:linear-gradient(150deg,#0f1922,#16232e);
  cursor:pointer;overflow:hidden;display:block}
.video-stage img{width:100%;height:100%;object-fit:cover;transition:transform .4s, filter .25s}
.video-card:hover .video-stage img{transform:scale(1.05);filter:brightness(.85)}
.video-stage iframe{width:100%;height:100%;border:0;display:block}
.video-stage:focus-visible{outline:3px solid var(--vc-accent);outline-offset:-3px}
.video-play{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:68px;height:68px;border-radius:50%;
  background:var(--vc-accent);display:grid;place-items:center;box-shadow:0 10px 28px rgba(0,0,0,.4);
  transition:transform .22s;z-index:3}
.video-play svg{width:28px;height:28px;fill:#fff;margin-left:3px}
.video-card:hover .video-play{transform:translate(-50%,-50%) scale(1.12)}
.video-card.playing .video-play,.video-card.playing .video-num{display:none}
.video-empty{position:absolute;inset:0;display:grid;place-items:center;align-content:center;gap:4px;
  color:rgba(255,255,255,.75);text-align:center;padding:20px}
.video-empty svg{width:44px;height:44px;fill:rgba(255,255,255,.35)}
.video-empty b{font-size:14.5px;color:#fff}
.video-empty small{font-size:12.5px;color:rgba(255,255,255,.55)}
.video-body{padding:20px 22px 24px;background:#fff;position:relative;z-index:2}
.video-body h3{font-size:17px;margin-bottom:7px;line-height:1.3}
.video-body p{font-size:14px;color:var(--ink-soft)}

/* ==========================================================================
   Gallery
   ========================================================================== */
.gal-filter{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-bottom:34px}
.gal-filter button{display:inline-flex;align-items:center;gap:8px;padding:11px 20px;border:1px solid var(--line);
  border-radius:30px;background:#fff;font-family:var(--sans);font-size:14.5px;font-weight:600;color:var(--ink-soft);
  cursor:pointer;transition:.18s}
.gal-filter button span{font-size:12px;color:var(--ink-faint)}
.gal-filter button:hover{border-color:var(--green);color:var(--green)}
.gal-filter button.on{background:var(--green);border-color:var(--green);color:#fff}
.gal-filter button.on span{color:rgba(255,255,255,.75)}

.gal-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.gal-item{position:relative;margin:0;border-radius:16px;overflow:hidden;cursor:pointer;background:var(--bg-soft);
  border:1px solid var(--line);aspect-ratio:4/3;transition:transform .22s, box-shadow .22s}
.gal-item.wide{grid-column:span 2;aspect-ratio:8/5}
.gal-item:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg)}
.gal-item:focus-visible{outline:3px solid var(--green);outline-offset:2px}
.gal-item img{width:100%;height:100%;object-fit:cover;transition:transform .5s}
.gal-item:hover img{transform:scale(1.06)}
.gal-item figcaption{position:absolute;left:0;right:0;bottom:0;padding:44px 18px 16px;color:#fff;
  background:linear-gradient(to top, rgba(9,16,22,.88), rgba(9,16,22,.5) 45%, transparent);
  display:flex;flex-direction:column;gap:2px}
.gal-tag{align-self:flex-start;font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  background:rgba(255,255,255,.2);backdrop-filter:blur(4px);padding:4px 10px;border-radius:20px;margin-bottom:6px}
.gal-item figcaption b{font-size:15.5px;font-family:var(--display);line-height:1.3}
.gal-item figcaption small{font-size:12.5px;color:rgba(255,255,255,.75)}
.gal-zoom{position:absolute;top:14px;right:14px;width:38px;height:38px;border-radius:50%;
  background:rgba(255,255,255,.22);backdrop-filter:blur(5px);display:grid;place-items:center;
  opacity:0;transform:scale(.85);transition:.22s}
.gal-zoom svg{width:19px;height:19px;fill:#fff}
.gal-item:hover .gal-zoom{opacity:1;transform:scale(1)}

/* lightbox */
.lightbox{position:fixed;inset:0;z-index:200;background:rgba(9,16,22,.94);display:grid;place-items:center;
  padding:60px 70px}
/* the hidden attribute must win over display:grid, or the overlay blocks clicks */
.lightbox[hidden]{display:none}
[hidden]{display:none !important}
/* --------------------------------------------------------------------------
   VIDEOS IN THE GALLERY

   A video is an ordinary gallery tile with a play button on it. The button is
   always visible, not on hover — on a phone there is no hover, and a tile that
   plays a video has to look different from one that opens a photograph before
   it is touched.
   -------------------------------------------------------------------------- */
.gal-play{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:62px;height:62px;border-radius:50%;display:grid;place-items:center;
  background:rgba(12,20,28,.55);border:2px solid rgba(255,255,255,.85);
  backdrop-filter:blur(3px);transition:transform .28s cubic-bezier(.22,1,.36,1),background .28s;
  pointer-events:none}
.gal-play svg{width:26px;height:26px;fill:#fff;margin-left:3px}
.gal-item.is-video:hover .gal-play,
.gal-item.is-video:focus-visible .gal-play{transform:translate(-50%,-50%) scale(1.12);
  background:var(--green)}
@media(prefers-reduced-motion:reduce){
  .gal-play{transition:none}
  .gal-item.is-video:hover .gal-play{transform:translate(-50%,-50%)}
}

/* The player inside the lightbox. 16:9, capped so the caption and the close
   button are never pushed off a short screen. */
.lb-video{width:min(100%,1040px);aspect-ratio:16/9;max-height:78vh;border-radius:10px;
  overflow:hidden;background:#000;box-shadow:0 30px 70px rgba(0,0,0,.5)}
.lb-video[hidden]{display:none}
.lb-video iframe{width:100%;height:100%;border:0;display:block}

.lightbox img[hidden]{display:none}
.lightbox img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:10px;
  box-shadow:0 30px 80px rgba(0,0,0,.6)}
.lb-caption{position:absolute;bottom:26px;left:0;right:0;text-align:center;color:#fff;padding:0 24px}
.lb-caption b{display:block;font-family:var(--display);font-size:17px}
.lb-caption span{display:block;font-size:13.5px;color:rgba(255,255,255,.7);margin-top:4px}
.lb-close,.lb-prev,.lb-next{position:absolute;background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.28);
  color:#fff;cursor:pointer;border-radius:50%;display:grid;place-items:center;transition:.18s;line-height:1}
.lb-close{top:24px;right:24px;width:46px;height:46px;font-size:26px}
.lb-prev,.lb-next{top:50%;transform:translateY(-50%);width:52px;height:52px;font-size:32px}
.lb-prev{left:20px}.lb-next{right:20px}
.lb-close:hover,.lb-prev:hover,.lb-next:hover{background:rgba(255,255,255,.3)}

@media(max-width:900px){
  .video-grid{grid-template-columns:1fr 1fr}
  .gal-grid{grid-template-columns:1fr 1fr}
  .gal-item.wide{grid-column:span 2}
}
@media(max-width:640px){
  .video-grid,.gal-grid{grid-template-columns:1fr}
  .gal-item.wide{grid-column:span 1;aspect-ratio:4/3}
  .lightbox{padding:70px 14px}
  .lb-prev,.lb-next{width:42px;height:42px;font-size:26px}
  .lb-prev{left:8px}.lb-next{right:8px}
}

/* ==========================================================================
   Solar Savings Calculator
   ========================================================================== */
.calc-hero{background:
    radial-gradient(1000px 460px at 80% -10%, rgba(36,63,146,.14), transparent 60%),
    radial-gradient(900px 430px at 5% 0%, rgba(31,122,63,.14), transparent 58%),
    var(--bg-soft);
  border-bottom:1px solid var(--line);padding:74px 0 66px;text-align:center}
.calc-hero h1{font-size:clamp(30px,4.6vw,52px);font-weight:800;letter-spacing:-1.2px;margin:14px 0 18px}
.calc-hero h1 .hl{background:linear-gradient(120deg,var(--green),var(--blue));
  -webkit-background-clip:text;background-clip:text;color:transparent}
.calc-hero .lead{font-size:18px;color:var(--ink-soft);max-width:680px;margin:0 auto}
.calc-hero-points{display:flex;gap:38px;justify-content:center;flex-wrap:wrap;margin-top:32px;
  padding-top:28px;border-top:1px solid var(--line)}
.calc-hero-points b{display:block;font-family:var(--display);font-size:16px}
.calc-hero-points span{font-size:13px;color:var(--ink-faint)}

/* ---- input form ---- */
.calc-form{background:#fff;border:1px solid var(--line);border-radius:20px;box-shadow:var(--shadow-lg);
  padding:0;overflow:hidden;max-width:900px;margin:0 auto}
.calc-tabs{display:grid;grid-template-columns:1fr 1fr;border-bottom:1px solid var(--line);background:var(--bg-soft)}
.calc-tab{padding:20px 18px;border:none;background:none;font-family:var(--sans);font-size:15.5px;font-weight:600;
  color:var(--ink-soft);cursor:pointer;border-bottom:3px solid transparent;transition:.18s;text-align:center}
.calc-tab:hover{color:var(--green)}
.calc-tab.on{background:#fff;color:var(--green);border-bottom-color:var(--green)}
.calc-method-choice{position:absolute;inline-size:1px;block-size:1px;opacity:0;pointer-events:none}
#calcMethodAppliances:checked ~ .calc-tabs [data-mode="appliances"],
#calcMethodBill:checked ~ .calc-tabs [data-mode="bill"]{background:#fff;color:var(--green);border-bottom-color:var(--green)}
#calcMethodAppliances:not(:checked) ~ [data-panel="appliances"],
#calcMethodBill:not(:checked) ~ [data-panel="bill"]{display:none!important}
#calcMethodAppliances:focus-visible ~ .calc-tabs [data-mode="appliances"],
#calcMethodBill:focus-visible ~ .calc-tabs [data-mode="bill"]{outline:3px solid rgba(14,107,60,.24);outline-offset:-4px}
.calc-panel{padding:28px}
.calc-help{font-size:14px;color:var(--ink-soft);margin-bottom:20px}
.calc-help.small{font-size:12.5px;color:var(--ink-faint);margin-top:8px}
.calc-help.center{text-align:center}
.calc-help em{color:var(--green);font-style:normal;font-weight:600}

.app-head,.app-row{display:grid;grid-template-columns:1fr 80px 110px 110px 38px;gap:10px;align-items:center}
.app-head{padding:0 0 8px;font-size:11.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ink-faint)}
.app-row{margin-bottom:10px}
/* Each number sits in its own label. On a wide screen the label text is
   hidden — the .app-head row above already names the columns — so the layout
   is unchanged. On a phone .app-head is hidden and these take over. */
.app-f{display:block;min-width:0}
.app-f>span{display:none}
.app-f input{width:100%}

.app-row select,.app-row input{padding:11px 12px;border:1px solid var(--line);border-radius:9px;
  font-family:var(--sans);font-size:14.5px;background:#fff;width:100%}
.app-row select:focus,.app-row input:focus{outline:none;border-color:var(--green)}
.app-row input{text-align:center}
.app-remove{border:none;background:none;color:var(--ink-faint);font-size:22px;cursor:pointer;line-height:1;padding:4px}
.app-remove:hover{color:#c0392b}
#addAppRow{margin-top:6px}
.calc-live{margin-top:18px;padding:14px 18px;background:var(--green-050);border:1px solid #cfe6d6;
  border-radius:12px;font-size:15px;color:var(--green-600);min-height:0}
.calc-live:empty{display:none}
.calc-live b{font-family:var(--display)}

.calc-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-bottom:6px}
.calc-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.calc-form label{display:block;font-size:13px;font-weight:600;color:var(--ink-soft);margin:14px 0 6px}
.calc-form input[type=number],.calc-form input[type=text],.calc-form input[type=tel],
.calc-form input[type=email],.calc-form select,.calc-form input[type=file]{
  width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:10px;font-family:var(--sans);font-size:15px;background:#fff}
.calc-form input:focus,.calc-form select:focus{outline:none;border-color:var(--green)}
.input-prefix{display:flex;align-items:center;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff}
.input-prefix span{padding:12px 14px;background:var(--bg-soft);border-right:1px solid var(--line);
  font-weight:700;font-size:14px;color:var(--ink-soft);white-space:nowrap}
.input-prefix input{border:none !important;border-radius:0 !important}
.calc-shared{padding:24px 28px 30px;background:var(--bg-soft);border-top:1px solid var(--line)}
.calc-go{width:100%;justify-content:center;margin-top:22px}

/* ---- current situation ---- */
.calc-current{background:var(--bg-soft);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.current-row{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}
.current-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:22px;text-align:center}
.current-card span{display:block;font-size:12px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--ink-faint);margin-bottom:8px}
.current-card b{font-family:var(--display);font-size:26px;font-weight:800;letter-spacing:-.5px}
.current-card.hero-figure{background:linear-gradient(150deg,#0f1922,#16232e);border-color:transparent}
.current-card.hero-figure span{color:#8fa3b3}
.current-card.hero-figure b{color:#fff}

/* ---- scenarios ---- */
.scenario-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;align-items:start}
.scenario{position:relative;background:#fff;border:1px solid var(--line);border-radius:18px;padding:26px;
  display:flex;flex-direction:column;transition:.2s}
.scenario:hover{box-shadow:var(--shadow)}
.scenario.recommended{border:2px solid var(--green);box-shadow:0 20px 44px rgba(31,122,63,.16)}
.scenario-flag{position:absolute;top:-13px;left:50%;transform:translateX(-50%);background:var(--green);color:#fff;
  font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:5px 14px;border-radius:20px}
.scenario-key{font-size:11.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint)}
.scenario h3{font-size:19px;margin:6px 0 8px}
.scenario header p{font-size:13.5px;color:var(--ink-soft);min-height:60px}
.scenario-invest{display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  padding:16px 0;margin:14px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.scenario-invest span{font-size:13px;color:var(--ink-soft)}
.scenario-invest b{font-family:var(--display);font-size:22px;font-weight:800}
.scenario-metrics{display:flex;flex-direction:column;gap:0}
.scenario-metrics>div{display:flex;justify-content:space-between;gap:12px;padding:9px 0;
  border-bottom:1px dashed var(--line);font-size:13.5px}
.scenario-metrics dt{color:var(--ink-soft)}
.scenario-metrics dd{font-weight:600;text-align:right}
.scenario-metrics dd.good{color:var(--green)}
.scenario-metrics dd.bad{color:#c0392b}
.scenario-metrics dd small,.rec-figures small{display:block;margin-top:4px;font-size:11.5px;font-weight:500;color:var(--ink-faint)}
.scenario-metrics .ten-year{border-bottom:none;padding-top:14px;margin-top:6px;border-top:2px solid var(--line);font-size:15px}
.scenario-metrics .ten-year dd b{font-family:var(--display);font-size:18px}
.scenario.recommended .ten-year dd b{color:var(--green)}
.scenario-note{font-size:12.5px;color:var(--ink-faint);margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}
.calc-disclaimer{text-align:center;font-size:13px;color:var(--ink-faint);max-width:760px;margin:34px auto 0}

/* ---- recommendation + lead form ---- */
.rec-section{background:linear-gradient(160deg,#0f1922,#16232e);color:#fff;
  border-top:1px solid var(--line)}
.rec-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:44px;align-items:start}
.rec-spec h2{color:#fff;font-size:clamp(26px,3.2vw,36px);margin:8px 0 24px}
.rec-items{display:flex;flex-direction:column;gap:14px;margin-bottom:28px}
.rec-item{display:flex;gap:14px;align-items:center;background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.12);border-radius:14px;padding:16px 18px}
.ri-ico{width:44px;height:44px;border-radius:11px;display:grid;place-items:center;flex-shrink:0}
.ri-ico svg{width:22px;height:22px;fill:#fff}
.ri-ico.g{background:rgba(79,224,141,.18)}
.ri-ico.b{background:rgba(106,168,255,.18)}
.rec-item b{display:block;font-family:var(--display);font-size:16px}
.rec-item small{display:block;font-size:13px;color:#9fb0bf;margin-top:2px}
.rec-figures{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;padding-top:24px;
  border-top:1px solid rgba(255,255,255,.12)}
.rec-figures span{display:block;font-size:12px;color:#8fa3b3;margin-bottom:6px}
.rec-figures b{font-family:var(--display);font-size:23px;font-weight:800;letter-spacing:-.5px}
.rec-figures b.good{color:#4fe08d}
.rec-figures b.bad{color:#ffb0a7}
.rec-package{margin-top:22px;font-size:14px;color:#c6d2dc}
.rec-package a{color:#4fe08d;font-weight:600}

.rec-quote{background:#fff;color:var(--ink);border-radius:20px;padding:30px;box-shadow:var(--shadow-lg)}
.rec-quote h3{font-size:22px;margin-bottom:8px}
.rec-quote>p{font-size:14.5px;color:var(--ink-soft);margin-bottom:18px}
.quote-form label{display:block;font-size:13px;font-weight:600;color:var(--ink-soft);margin:14px 0 6px}
/* input AND textarea. The note box was added to this form without adding
   `textarea` here, so it fell back to the browser's default control: 178px
   wide against a 457px column, monospace, and a faint grey hairline border on
   a white panel. It was clickable, but it did not look like a field, so people
   did not click it. Any control added to a form must be in the form's own
   selector list — a bare <textarea> inherits none of this. */
.quote-form input,.quote-form textarea{width:100%;padding:13px 14px;
  border:1px solid var(--line);border-radius:10px;
  font-family:var(--sans);font-size:15px;color:var(--ink);background:#fff}
.quote-form input:focus,.quote-form textarea:focus{outline:none;border-color:var(--green);
  box-shadow:0 0 0 3px rgba(63,208,127,.16)}
.quote-form textarea{display:block;min-height:96px;line-height:1.55;resize:vertical}
.quote-form textarea::placeholder{color:var(--ink-faint)}
.quote-form .btn{width:100%;justify-content:center;margin-top:22px}
.quote-note{font-size:12.5px;color:var(--ink-faint);margin-top:14px;text-align:center}

/* ---- thank you ---- */
.calc-thanks{text-align:center;background:#fff;border:1px solid var(--line);border-radius:20px;
  padding:48px 36px;box-shadow:var(--shadow)}
.calc-thanks .tick{width:70px;height:70px;border-radius:50%;background:var(--green-050);display:grid;
  place-items:center;margin:0 auto 20px}
.calc-thanks .tick svg{width:34px;height:34px;fill:var(--green)}
.calc-thanks h2{font-size:26px;margin-bottom:12px}
.calc-thanks p{color:var(--ink-soft);max-width:520px;margin:0 auto 10px}
/* :not(.btn) matters. This rule is for the inline phone and WhatsApp links in
   the sentence above; without the exclusion it also repainted the buttons
   below, and "Download my quotation (PDF)" came out green-on-green — a solid
   green block with no readable text on it. */
.calc-thanks a:not(.btn){color:var(--green);font-weight:600}
.calc-thanks-actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin-top:26px}

@media(max-width:900px){
  .scenario-grid,.current-row{grid-template-columns:1fr 1fr}
  .rec-grid{grid-template-columns:1fr}
  .calc-grid-3{grid-template-columns:1fr 1fr}
}
@media(max-width:640px){
  .scenario-grid,.current-row,.calc-grid-2,.calc-grid-3,.rec-figures{grid-template-columns:1fr}
  .calc-panel,.calc-shared{padding:20px 16px}
  .app-head{display:none}

  /* The three numbers side by side, each under its own heading. They used to
     wrap two-and-one with nothing to say which was which — a visitor saw
     "10  15" then "5" and had to guess. */
  .app-f>span{display:block;font-size:10.5px;font-weight:700;letter-spacing:.05em;
    text-transform:uppercase;color:var(--ink-faint);margin:0 0 4px 2px}
  .app-f input{padding:10px 6px;font-size:15px}

  .app-row{grid-template-columns:repeat(3,1fr);gap:8px;padding:14px;border:1px solid var(--line);
    border-radius:12px;margin-bottom:12px;position:relative}
  .app-row select{grid-column:1 / -1}
  .app-remove{position:absolute;top:6px;right:8px}
  .scenario header p{min-height:0}
}

/* ---------- Accessibility / SEO helpers ---------- */
.skip-link{position:absolute;left:-9999px;top:0;z-index:999;background:var(--green);color:#fff;
  padding:12px 20px;border-radius:0 0 10px 0;font-weight:600;font-size:14px}
.skip-link:focus{left:0}
/* slides 2+ carry the same look as the H1 without being a second H1 */
.hero h2.as-h1{font-size:clamp(32px,4.6vw,50px);font-weight:800;letter-spacing:-1px;
  font-family:var(--display);line-height:1.15;color:var(--ink)}
.hero h2.as-h1 .hl{background:linear-gradient(120deg,var(--green),var(--blue));
  -webkit-background-clip:text;background-clip:text;color:transparent}

/* ---------- FAQ (Solar Pricing) ---------- */
.faq-section{background:var(--bg-soft);border-top:1px solid var(--line)}
.faq-list{max-width:820px;margin:0 auto;display:flex;flex-direction:column;gap:12px}
.faq-item{background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden;transition:.2s}
.faq-item[open]{box-shadow:var(--shadow);border-color:transparent}
.faq-item summary{list-style:none;cursor:pointer;padding:20px 56px 20px 22px;position:relative;
  font-family:var(--display);font-weight:700;font-size:16.5px;line-height:1.4}
.faq-item summary::-webkit-details-marker{display:none}
.faq-item summary:hover{color:var(--green)}
.faq-mark{position:absolute;right:20px;top:50%;transform:translateY(-50%);width:22px;height:22px;
  border-radius:50%;background:var(--green-050);display:block}
.faq-mark::before,.faq-mark::after{content:"";position:absolute;background:var(--green);
  left:50%;top:50%;transform:translate(-50%,-50%);transition:.2s}
.faq-mark::before{width:11px;height:2px}
.faq-mark::after{width:2px;height:11px}
.faq-item[open] .faq-mark::after{height:2px}
.faq-answer{padding:0 22px 22px}
.faq-answer p{color:var(--ink-soft);font-size:15px}
.faq-cta{text-align:center;margin-top:30px;font-size:15.5px;color:var(--ink-soft)}
.faq-cta a{color:var(--green);font-weight:600}

/* ---------- Site map page ---------- */
.sitemap-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}
.sitemap-block h2{font-size:15px;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-faint);
  padding-bottom:10px;margin-bottom:12px;border-bottom:1px solid var(--line)}
.sitemap-block ul{list-style:none;display:flex;flex-direction:column;gap:8px}
.sitemap-block a{font-size:14.5px;color:var(--ink-soft)}
.sitemap-block a:hover{color:var(--green)}
.sitemap-note{text-align:center;margin-top:40px;font-size:14px;color:var(--ink-faint)}
.sitemap-note a{color:var(--green)}
@media(max-width:900px){ .sitemap-grid{grid-template-columns:1fr 1fr} }
@media(max-width:640px){ .sitemap-grid{grid-template-columns:1fr} }

/* ==========================================================================
   60-second solar sizer (home page) + air-conditioning prompt (calculator)
   The section is two columns: an intro on the left, the sizer card on the
   right taking half the row. The card itself stacks: questions, result, CTA.
   ========================================================================== */
.sizer-band{background:var(--bg-soft);border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  padding:64px 0}
.sizer-row{display:grid;grid-template-columns:1fr 1fr;gap:52px;align-items:center}

.sizer-intro h2{font-size:33px;line-height:1.2;margin:10px 0 14px}
.sizer-intro>p{color:var(--ink-soft);font-size:16px;margin-bottom:20px}
.sizer-points{list-style:none;margin:0 0 22px;padding:0}
.sizer-points li{position:relative;padding-left:28px;font-size:15px;color:var(--ink-soft);margin-bottom:9px}
.sizer-points li::before{content:"";position:absolute;left:0;top:7px;width:16px;height:16px;border-radius:50%;
  background:var(--green-050);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%231f7a3f'%3E%3Cpath d='M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'/%3E%3C/svg%3E");
  background-size:11px 11px;background-repeat:no-repeat;background-position:center}
.sizer-other{font-size:14.5px;color:var(--ink-faint);border-top:1px solid var(--line);padding-top:18px}
.sizer-other a{color:var(--green);font-weight:500}
.sizer-other a:hover{text-decoration:underline}

.sizer{background:#fff;border:1px solid var(--line);border-radius:20px;box-shadow:var(--shadow-lg);
  overflow:hidden}
.sizer-ask{padding:26px 26px 22px}
.sizer-q{border:none;margin-bottom:18px}
.sizer-q:last-of-type{margin-bottom:14px}
.sizer-q legend{font-size:14px;font-weight:600;color:var(--ink);margin-bottom:10px;display:flex;
  align-items:center;gap:9px}
.sizer-q legend b{width:21px;height:21px;border-radius:50%;background:var(--green-050);color:var(--green);
  display:grid;place-items:center;font-size:12px;flex-shrink:0}
.chips{display:flex;flex-wrap:wrap;gap:7px}
.chip{position:relative;display:inline-flex}
.chip input{position:absolute;inset:0;opacity:0;cursor:pointer;margin:0}
.chip span{display:block;padding:9px 14px;border:1px solid var(--line);border-radius:999px;font-size:13.5px;
  font-weight:500;color:var(--ink-soft);background:#fff;transition:.16s;cursor:pointer;white-space:nowrap}
.chip:hover span{border-color:var(--green);color:var(--green)}
.chip input:checked+span{background:var(--green);border-color:var(--green);color:#fff}
.chip input:focus-visible+span{outline:2px solid var(--blue);outline-offset:2px}
.sizer-foot{font-size:13px;color:var(--ink-faint);line-height:1.5}

.sizer-out{background:var(--bg-dark);color:#fff;padding:24px 26px 26px;position:relative;
  background-image:radial-gradient(360px 220px at 82% 0%, rgba(63,208,127,.16), transparent 62%)}
.sizer-out-idle{display:flex;align-items:center;gap:14px;padding:2px 0 20px}
.sizer-spark{width:42px;height:42px;border-radius:12px;background:rgba(63,208,127,.14);display:grid;
  place-items:center;flex-shrink:0}
.sizer-spark svg{width:22px;height:22px;fill:#3fd07f}
.sizer-out-idle h3{font-size:16px;font-weight:600;color:#fff;line-height:1.35;margin:0}

.sizer-cap{display:block;font-size:11px;font-weight:700;letter-spacing:.13em;text-transform:uppercase;
  color:#3fd07f;margin-bottom:13px}
.sizer-figs{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:16px}
.sizer-figs div{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.10);border-radius:11px;
  padding:12px 8px;text-align:center}
.sizer-figs b{display:block;font-family:var(--display);font-size:23px;font-weight:700;line-height:1.1;color:#fff}
.sizer-figs span{display:block;font-size:11px;color:rgba(255,255,255,.62);margin-top:3px}
.sizer-money{border-top:1px solid rgba(255,255,255,.12);padding-top:13px;margin-bottom:11px}
.sizer-money div{display:flex;justify-content:space-between;align-items:baseline;gap:14px;padding:4px 0}
.sizer-money span{font-size:13.5px;color:rgba(255,255,255,.68)}
.sizer-money b{font-size:16.5px;font-family:var(--display);font-weight:700;color:#fff}
.sizer-money b.up{color:#3fd07f}
.sizer-caveat{font-size:12px;color:rgba(255,255,255,.55);line-height:1.5;margin-bottom:16px}
.sizer-go{width:100%;justify-content:center}
.sizer-note{display:block;text-align:center;font-size:12px;color:rgba(255,255,255,.55);margin-top:9px}

/* air conditioning is opt-in on the calculator */
.ac-prompt{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap;
  background:var(--blue-050);border:1px solid #ccd6f5;border-radius:12px;padding:15px 18px;margin-bottom:20px}
.ac-prompt b{display:block;font-size:14.5px;color:var(--ink);margin-bottom:3px}
.ac-prompt span{display:block;font-size:13.5px;color:var(--ink-soft);max-width:60ch;line-height:1.5}
.ac-prompt .btn{flex-shrink:0}
.quick-handoff{margin-bottom:20px}
.app-select optgroup{font-weight:700;color:var(--ink-faint)}
.app-select option{font-weight:400;color:var(--ink)}

@media(max-width:900px){
  .sizer-row{grid-template-columns:1fr;gap:30px}
  .sizer-intro h2{font-size:27px}
  .sizer-band{padding:48px 0}
}
@media(max-width:640px){
  .sizer-figs{grid-template-columns:1fr;gap:7px}
  .sizer-figs div{display:flex;align-items:baseline;justify-content:space-between;text-align:left;padding:10px 14px}
  .sizer-figs b{font-size:20px}
  .sizer-figs span{margin-top:0}
  .chip span{padding:9px 13px;font-size:13.5px}
  .ac-prompt{flex-direction:column;align-items:stretch}
  .ac-prompt .btn{width:100%;justify-content:center}
}

/* ---------- cookie / analytics consent ---------- */
.consent{position:fixed;left:16px;right:16px;bottom:16px;z-index:90;display:flex;align-items:center;
  gap:18px;flex-wrap:wrap;justify-content:space-between;max-width:820px;margin:0 auto;background:#fff;
  border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow-lg);padding:16px 20px}
.consent[hidden]{display:none}
.consent p{font-size:14px;color:var(--ink-soft);margin:0;flex:1 1 320px;line-height:1.55}
.consent a{color:var(--green);text-decoration:underline}
.consent-btns{display:flex;gap:9px;flex-shrink:0}
.consent-btns .btn{padding:10px 20px;font-size:14px}
@media(max-width:640px){
  .consent{left:10px;right:10px;bottom:10px;padding:14px 16px;gap:12px}
  .consent-btns{width:100%}
  .consent-btns .btn{flex:1;justify-content:center}
}

/* ==========================================================================
   Articles: listing, cards and the reading page
   ========================================================================== */
.wrap-narrow{max-width:760px}
section.alt{background:var(--bg-soft);border-top:1px solid var(--line)}

/* ---------- category filter ---------- */
.art-filter{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:34px}
.art-filter a{padding:9px 16px;border:1px solid var(--line);border-radius:999px;font-size:14px;
  font-weight:500;color:var(--ink-soft);background:#fff;transition:.16s}
.art-filter a:hover{border-color:var(--green);color:var(--green)}
.art-filter a.on{background:var(--green);border-color:var(--green);color:#fff}
.art-filter a span{opacity:.6;font-size:12.5px;margin-left:3px}

/* ---------- cards ---------- */
.art-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}
.art-card{background:#fff;border:1px solid var(--line);border-radius:16px;overflow:hidden;
  display:flex;flex-direction:column;transition:.2s}
.art-card:hover{box-shadow:var(--shadow-lg);transform:translateY(-2px)}
.art-cover{position:relative;display:block;aspect-ratio:5/3;overflow:hidden;background:var(--bg-soft)}
.art-cover img{width:100%;height:100%;object-fit:cover;transition:transform .4s}
.art-card:hover .art-cover img{transform:scale(1.04)}
.art-tag{position:absolute;left:12px;top:12px;background:rgba(15,25,34,.82);color:#fff;font-size:11.5px;
  font-weight:600;letter-spacing:.04em;padding:5px 11px;border-radius:999px;backdrop-filter:blur(4px)}
.art-body{padding:20px 20px 22px;display:flex;flex-direction:column;flex:1}
.art-body h2{font-size:18.5px;line-height:1.35;margin-bottom:9px}
.art-body h2 a{color:var(--ink)}
.art-body h2 a:hover{color:var(--green)}
.art-body p{font-size:14.5px;color:var(--ink-soft);line-height:1.6;margin-bottom:14px}
.art-meta{margin-top:auto;display:flex;gap:14px;font-size:13px;color:var(--ink-faint);flex-wrap:wrap}

/* ---------- reading page ---------- */
.post-head{background:var(--bg-soft);border-bottom:1px solid var(--line);padding:56px 0 44px}
.post-head h1{font-size:clamp(28px,4.2vw,42px);font-weight:800;letter-spacing:-.6px;line-height:1.18;
  margin-bottom:14px}
.post-standfirst{font-size:18.5px;color:var(--ink-soft);line-height:1.6;margin-bottom:18px}
.post-meta{display:flex;gap:18px;flex-wrap:wrap;font-size:14px;color:var(--ink-faint)}
.post-meta time,.post-meta span{position:relative}
.post-meta span:not(:last-child)::after,.post-meta time::after{content:"";position:absolute;right:-10px;
  top:50%;width:3px;height:3px;border-radius:50%;background:var(--ink-faint);transform:translateY(-50%)}
.post-meta :last-child::after{display:none}

.post-cover{width:100%;height:auto;border-radius:16px;margin-top:-28px;position:relative;z-index:2;
  box-shadow:var(--shadow-lg);object-fit:cover;aspect-ratio:16/9}

.post-body{padding:44px 0 10px;font-size:17px;line-height:1.75;color:#22303c}
.post-body h2{font-size:26px;font-weight:700;letter-spacing:-.3px;margin:38px 0 14px;line-height:1.3}
.post-body h3{font-size:20px;font-weight:700;margin:30px 0 10px}
.post-body p{margin-bottom:20px}
.post-body ul,.post-body ol{margin:0 0 22px 22px}
.post-body li{margin-bottom:9px}
.post-body a{color:var(--green);text-decoration:underline;text-underline-offset:2px}
.post-body strong{font-weight:700;color:var(--ink)}
.post-body blockquote{border-left:3px solid var(--green);background:var(--green-050);padding:16px 22px;
  border-radius:0 12px 12px 0;margin:0 0 22px;font-size:17.5px;color:var(--ink)}

.post-cta{display:flex;align-items:center;justify-content:space-between;gap:26px;flex-wrap:wrap;
  background:var(--bg-dark);color:#fff;border-radius:18px;padding:30px 32px;margin:36px 0 60px;
  background-image:radial-gradient(400px 240px at 88% 0%, rgba(63,208,127,.18), transparent 62%)}
.post-cta h3{font-size:20px;margin-bottom:7px;color:#fff}
.post-cta p{font-size:14.5px;color:rgba(255,255,255,.72);line-height:1.6;max-width:52ch}
.post-cta .btn{flex-shrink:0}

@media(max-width:900px){
  .art-grid{grid-template-columns:1fr 1fr}
  .post-body{font-size:16.5px;padding-top:34px}
}
@media(max-width:640px){
  .art-grid{grid-template-columns:1fr}
  .post-head{padding:40px 0 34px}
  .post-cover{margin-top:-20px;border-radius:12px}
  .post-body h2{font-size:22px}
  .post-cta{padding:24px 22px;text-align:left}
  .post-cta .btn{width:100%;justify-content:center}
}

/* ==========================================================================
   Trust & proof: testimonials, credentials, warranty and payment terms
   ========================================================================== */
.quote-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
.quote-card{background:#fff;border:1px solid var(--line);border-radius:16px;padding:26px 24px;
  display:flex;flex-direction:column;box-shadow:var(--shadow)}
.stars{display:flex;gap:3px;margin-bottom:14px}
.stars svg{width:17px;height:17px;fill:var(--amber)}
.quote-card blockquote{font-size:16px;line-height:1.65;color:var(--ink);margin-bottom:20px;flex:1}
.quote-card blockquote::before{content:"\201C"}
.quote-card blockquote::after{content:"\201D"}
.quote-card figcaption{display:flex;align-items:center;gap:12px;padding-top:16px;
  border-top:1px solid var(--line)}
.quote-card figcaption img{width:44px;height:44px;border-radius:50%;object-fit:cover;flex-shrink:0}
.quote-initial{width:44px;height:44px;border-radius:50%;background:var(--green-050);color:var(--green);
  display:grid;place-items:center;font-weight:700;font-size:17px;flex-shrink:0}
.quote-card figcaption b{display:block;font-size:14.5px;color:var(--ink)}
.quote-card figcaption small{display:block;font-size:13px;color:var(--ink-faint)}

/* ---------- credentials ---------- */
.cred-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:22px}
.cred{background:#fff;border:1px solid var(--line);border-radius:16px;padding:26px 22px}
.cred .ico{margin-bottom:2px}
.cred h3{font-size:16.5px;margin:14px 0 8px}
.cred p{font-size:14.5px;color:var(--ink-soft);line-height:1.6}
.cred-ref{display:inline-block;margin-top:12px;font-size:12.5px;font-weight:600;color:var(--green);
  background:var(--green-050);border-radius:999px;padding:4px 12px}

/* ---------- warranty & payment ---------- */
.terms-grid{display:grid;grid-template-columns:1fr 1fr;gap:26px}
.terms-col{background:#fff;border:1px solid var(--line);border-radius:16px;padding:28px 26px}
.terms-col h3{display:flex;align-items:center;gap:11px;font-size:18px;margin-bottom:20px}
.terms-ico{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;flex-shrink:0}
.terms-ico.g{background:var(--green-050)} .terms-ico.g svg{fill:var(--green)}
.terms-ico.b{background:var(--blue-050)}  .terms-ico.b svg{fill:var(--blue)}
.terms-ico svg{width:19px;height:19px}
.term{padding:14px 0;border-top:1px solid var(--line)}
.term:first-of-type{border-top:none;padding-top:0}
.term b{display:block;font-size:15px;color:var(--ink);margin-bottom:5px}
.term-ref{display:inline-block;margin-left:8px;font-size:12px;font-weight:600;color:var(--ink-soft);
  background:var(--bg-soft);border:1px solid var(--line);border-radius:999px;padding:2px 10px}
.term p{font-size:14.5px;color:var(--ink-soft);line-height:1.6}

@media(max-width:900px){
  .quote-grid{grid-template-columns:1fr 1fr}
  .terms-grid{grid-template-columns:1fr}
}
@media(max-width:640px){
  .quote-grid{grid-template-columns:1fr}
}

/* ---------- optional contact block on the calculator ---------- */
.calc-contact{border:1px solid var(--line);border-radius:12px;padding:20px 20px 14px;margin:6px 0 22px;
  background:var(--bg-soft)}
.calc-contact legend{font-size:14.5px;font-weight:600;color:var(--ink);padding:0 8px;margin-left:-8px}
.calc-contact legend span{font-weight:400;color:var(--ink-faint);font-size:13.5px}
.calc-contact .calc-help{margin-top:10px;margin-bottom:0}
@media(max-width:640px){ .calc-contact{padding:16px 16px 12px} }

/* ---------- sub-categories inside a dropdown ---------- */
.drop-sub{display:flex;flex-direction:column;margin:-4px 0 6px 52px;padding-left:12px;
  border-left:1px solid var(--line)}
.drop-panel .drop-sub a{padding:7px 10px;font-size:13.5px;color:var(--ink-soft);border-radius:7px;
  display:block}
.drop-panel .drop-sub a:hover{background:var(--green-050);color:var(--green)}
@media(max-width:640px){ .drop-sub{margin-left:30px} }

/* --- Track your order -------------------------------------------------------
   A status card rather than an account page. The step list is the whole point:
   somebody who has spent GHS 60,000 wants to see at a glance where their order
   has got to, without hunting through an email. */
.track-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);
  padding:26px 28px;box-shadow:var(--shadow)}
.track-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;
  flex-wrap:wrap;margin-bottom:12px}
.track-head h2{font-size:23px;margin:2px 0 0}
.track-date{font-size:13px;color:var(--ink-faint);white-space:nowrap}
.track-note{font-size:14.5px;color:var(--ink-soft);line-height:1.65;margin:10px 0 0}
.track-note a{color:var(--green);font-weight:600}

.track-steps{list-style:none;margin:22px 0 4px;padding:0;display:flex;gap:0;counter-reset:step}
.track-steps li{flex:1;position:relative;font-size:12.5px;color:var(--ink-faint);
  text-align:center;padding-top:26px;line-height:1.35}
.track-steps li span{position:absolute;top:0;left:50%;transform:translateX(-50%);
  width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid var(--line);z-index:1}
.track-steps li::before{content:"";position:absolute;top:6px;left:0;width:50%;height:2px;
  background:var(--line)}
.track-steps li::after{content:"";position:absolute;top:6px;left:50%;width:50%;height:2px;
  background:var(--line)}
.track-steps li:first-child::before,.track-steps li:last-child::after{display:none}
.track-steps li.done{color:var(--ink);font-weight:600}
.track-steps li.done span{background:var(--green);border-color:var(--green)}
.track-steps li.done::before{background:var(--green)}
.track-steps li.done+li.done::before{background:var(--green)}
.track-steps li.done:not(:last-child).done::after{background:var(--line)}

.track-items{width:100%;border-collapse:collapse;margin:22px 0 4px;font-size:14.5px}
.track-items td{padding:10px 0;border-bottom:1px solid var(--line);color:var(--ink-soft)}
.track-items tfoot td{border-bottom:0;border-top:2px solid var(--line);color:var(--ink);padding-top:12px}
.track-items .right{text-align:right;white-space:nowrap}

@media (max-width:560px){
  .track-card{padding:22px 18px}
  .track-steps li{font-size:11px}
}

/* ==========================================================================
   MOTION LAYER — September 2026
   Added on top of the existing design, not instead of it. Three separate
   things, each independently switchable:

     1. .cursorfx      — what follows the mouse pointer (Admin -> Site tools)
     2. [data-rv]      — sections settling into place as you scroll
     3. the polish     — hover lifts, image wipes, the hero's slow drift

   TWO RULES THAT MUST SURVIVE ANY FUTURE EDIT:

   * Every effect uses its OWN element or its own class. Never add ::before or
     ::after to a shared component class. The previous attempt at a cursor
     spotlight used ::after on the card classes and collided with
     .price.feat::after — the "Popular" badge — stretching it to inset:0 and
     painting the featured pricing card solid green with unreadable text.

   * Everything that hides content is gated behind html.js and switched off
     under prefers-reduced-motion. With JavaScript off, nothing is hidden.
   ========================================================================== */

/* ---------- 1. cursor effects ------------------------------------------- */
/* The layer itself: fixed, above everything, and completely transparent to
   clicks. If pointer-events ever stops being none, the whole site stops
   working — that is the one line here that matters. */
.cursorfx{position:fixed;inset:0;z-index:9999;pointer-events:none;
  opacity:0;transition:opacity .35s ease;contain:strict}
.cursorfx.ready{opacity:1}
.cursorfx-lead,.cursorfx-trail{position:absolute;top:0;left:0;border-radius:50%;
  will-change:transform;transform:translate3d(-100px,-100px,0)}

/* --- style A: "Halo" — a small dot with a ring easing along behind it.
       Quiet, precise, and it turns green over anything clickable. --- */
html[data-cursor="halo"] .cursorfx-lead{
  width:8px;height:8px;margin:-4px 0 0 -4px;background:var(--green);
  transition:width .25s,height .25s,margin .25s,background .25s}
html[data-cursor="halo"] .cursorfx-trail{
  width:38px;height:38px;margin:-19px 0 0 -19px;border:1.5px solid rgba(31,122,63,.45);
  transition:width .3s cubic-bezier(.22,1,.36,1),height .3s cubic-bezier(.22,1,.36,1),
             margin .3s cubic-bezier(.22,1,.36,1),border-color .25s,background .25s}
/* over a link, button or card the ring opens up and fills faintly */
html[data-cursor="halo"] .cursorfx.hot .cursorfx-trail{
  width:62px;height:62px;margin:-31px 0 0 -31px;
  border-color:var(--green);background:rgba(31,122,63,.10)}
html[data-cursor="halo"] .cursorfx.hot .cursorfx-lead{
  width:5px;height:5px;margin:-2.5px 0 0 -2.5px}
/* pressed */
html[data-cursor="halo"] .cursorfx.down .cursorfx-trail{
  width:30px;height:30px;margin:-15px 0 0 -15px;background:rgba(31,122,63,.18)}

/* --- style B: "Spotlight" — a soft warm glow the size of a saucer, with a
       small solid dot at the exact pointer position. Atmospheric; reads best
       over the dark bands and the hero. --- */
html[data-cursor="spotlight"] .cursorfx{mix-blend-mode:normal}
html[data-cursor="spotlight"] .cursorfx-lead{
  width:7px;height:7px;margin:-3.5px 0 0 -3.5px;background:var(--green);
  box-shadow:0 0 0 3px rgba(31,122,63,.16);
  transition:width .25s,height .25s,margin .25s,box-shadow .25s}
html[data-cursor="spotlight"] .cursorfx-trail{
  width:320px;height:320px;margin:-160px 0 0 -160px;
  background:radial-gradient(circle closest-side,
      rgba(31,122,63,.16), rgba(36,63,146,.10) 45%, rgba(31,122,63,0) 72%);
  transition:width .45s cubic-bezier(.22,1,.36,1),height .45s cubic-bezier(.22,1,.36,1),
             margin .45s cubic-bezier(.22,1,.36,1),opacity .3s}
html[data-cursor="spotlight"] .cursorfx.hot .cursorfx-trail{
  width:440px;height:440px;margin:-220px 0 0 -220px}
html[data-cursor="spotlight"] .cursorfx.hot .cursorfx-lead{
  width:14px;height:14px;margin:-7px 0 0 -7px;box-shadow:0 0 0 6px rgba(31,122,63,.14)}
html[data-cursor="spotlight"] .cursorfx.down .cursorfx-trail{
  width:240px;height:240px;margin:-120px 0 0 -120px}

/* Never on a touch screen, and never when the visitor asks for less motion. */
@media (pointer:coarse),(prefers-reduced-motion:reduce){
  .cursorfx{display:none !important}
}

/* ---------- 2. reveal on scroll ------------------------------------------ */
/* main.js tags the usual components with data-rv and adds .in as they arrive.
   Gated behind .js so nothing is ever hidden without JavaScript. */
.js[data-motion="on"] [data-rv]{
  opacity:0;transform:translateY(26px);
  transition:opacity .7s cubic-bezier(.22,1,.36,1),transform .8s cubic-bezier(.22,1,.36,1);
  transition-delay:calc(var(--rv-i,0) * 80ms)}
.js[data-motion="on"] [data-rv].in{opacity:1;transform:none}
.js[data-motion="on"] [data-rv="fade"]{transform:none}
.js[data-motion="on"] [data-rv="left"]{transform:translateX(-30px)}
.js[data-motion="on"] [data-rv="right"]{transform:translateX(30px)}
.js[data-motion="on"] [data-rv="zoom"]{transform:scale(.95)}

/* An image or photo panel wipes up rather than fading — it reads as a
   photograph arriving, not a page still loading. */
.js[data-motion="on"] [data-rv="wipe"]{
  opacity:1;transform:none;clip-path:inset(14% 0 0 0);
  transition:clip-path .9s cubic-bezier(.22,1,.36,1)}
.js[data-motion="on"] [data-rv="wipe"].in{clip-path:inset(0 0 0 0)}

@media(prefers-reduced-motion:reduce){
  .js[data-motion="on"] [data-rv]{opacity:1;transform:none;clip-path:none;transition:none}
}

/* ---------- 3. polish ---------------------------------------------------- */
/* The header lifts off the page once you scroll. */
.nav{transition:box-shadow .3s,background .3s}
.nav.scrolled{box-shadow:0 8px 28px rgba(20,40,60,.07);background:rgba(255,255,255,.96)}

/* The big buttons lean toward the pointer (main.js sets the transform). */
.btn-lg{transition:transform .25s cubic-bezier(.22,1,.36,1),background .18s,box-shadow .25s}
.btn-green.btn-lg:hover{box-shadow:0 14px 30px rgba(31,122,63,.26)}
.btn-blue.btn-lg:hover{box-shadow:0 14px 30px rgba(36,63,146,.24)}

/* Cards lift a little further and a little more smoothly than before. */
.card,.product,.price,.art-card,.quote-card,.gal-item,.video-card{
  transition:transform .35s cubic-bezier(.22,1,.36,1),box-shadow .35s cubic-bezier(.22,1,.36,1),
             border-color .25s}
.card:hover,.product:hover{transform:translateY(-5px)}
.price:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg)}

/* A "more" link's arrow steps forward on hover. */
.card .more,.sizer-other a{transition:color .18s}
.card .more::after{content:"";display:inline-block;width:0;transition:width .25s}
.card:hover .more::after{width:5px}

@media(prefers-reduced-motion:reduce){
  .btn-lg,.card,.product,.price,.art-card,.quote-card,.gal-item,.video-card{transition:none}
  .card:hover,.product:hover,.price:hover{transform:none}
}

/* ==========================================================================
   PHOTO SLOTS
   Every place the site is waiting for a real photograph. Each slot draws its
   own illustration until a photo is dropped in, so nothing looks unfinished —
   and the moment you uncomment the <img>, the photo covers the illustration
   and the caption keeps working on top of it.

   The z-index order inside a slot, which is the whole trick:
       1  the coloured gradient background
       2  the built-in illustration (SVG art, device mock, rings)
       3  YOUR PHOTOGRAPH — covers everything above when present
       4  the scrim, so white caption text stays readable on any photo
       5  the SECOND PICTURE, if the slide has one — above the scrim so a
          cut-out product does not go muddy where the scrim is darkest
       6  the caption and any badge — always the top layer, never covered
   ========================================================================== */

/* The photograph itself sits above the illustration, not below it. */
.hero-visual img:not(.hero-front),.shot-frame img{z-index:3}

/* --------------------------------------------------------------------------
   HOW THE HERO PICTURE SITS AND MOVES        Admin -> Hero slider -> Movement

   One class does both jobs, because the two halves belong together. A
   photograph that fills the panel wants a slow zoom; a cut-out PNG on a
   transparent background wants to be shown whole, with the panel colour
   around it, drifting clear of its own shadow.

       hm-drift    photo fills the panel, very slow zoom   (the original look)
       hm-still    photo fills the panel, nothing moves
       hm-cutout   cut-out shown whole, nothing moves
       hm-float    cut-out rising and settling
       hm-sway     cut-out tilting, as if hanging
       hm-follow   cut-out leaning toward the mouse (see main.js)

   Three gates, all deliberate: only the slide actually on screen animates,
   everything stops when Motion is switched off in Site tools, and everything
   stops for a visitor who has asked for reduced motion. The *layout* half is
   never gated — a cut-out must still be shown whole when nothing is moving,
   or switching motion off would suddenly crop it.
   -------------------------------------------------------------------------- */

/* --- photograph that fills the panel --- */
.hero-visual.hm-drift img:not(.hero-front){transform:scale(1.05);transition:transform 14s linear}
@media(prefers-reduced-motion:no-preference){
  html[data-motion="on"] .hslide.is-active .hero-visual.hm-drift img:not(.hero-front){transform:scale(1.13)}
}

/* --- cut-out picture: shown whole, never cropped ---

   The shadow is `drop-shadow`, not an ellipse element underneath. That matters
   for a transparent PNG: drop-shadow reads the alpha channel, so the shadow is
   the shape of the actual cut-out — a solar panel, a tracker, a camera — at
   any size and any aspect ratio, and it travels with the picture as it floats.
   The first attempt drew a ground shadow at the foot of the panel instead; it
   was invisible, because the caption scrim is at its darkest exactly there.
   Two stacked shadows, one tight and one wide, read as depth rather than as a
   drawn outline. */
.hero-visual.hm-cutout img:not(.hero-front),.hero-visual.hm-float img:not(.hero-front),
.hero-visual.hm-sway img:not(.hero-front),.hero-visual.hm-follow img:not(.hero-front){
  object-fit:contain;padding:30px 30px 44px;
  filter:drop-shadow(0 6px 8px rgba(3,9,13,.30)) drop-shadow(0 22px 30px rgba(3,9,13,.34))}

/* Float: up on a long ease, and down again. 7s is slow enough to read as
   breathing rather than bouncing. */
@keyframes heroFloat{
  0%,100%{transform:translate3d(0,0,0)}
  50%    {transform:translate3d(0,-14px,0)}}
/* Applied inside `no-preference` rather than reset inside `reduce`: these are
   the most specific selectors in the file, so a later reset would have to
   out-weigh them. Not asking for the animation at all is simpler than
   cancelling it afterwards. */
@media(prefers-reduced-motion:no-preference){
  html[data-motion="on"] .hslide.is-active .hero-visual.hm-float img:not(.hero-front){
    animation:heroFloat 7s ease-in-out infinite}
}

/* Sway: pivots near the top, so it reads as hanging rather than wobbling. */
.hero-visual.hm-sway img:not(.hero-front){transform-origin:50% 14%}
@keyframes heroSway{
  0%,100%{transform:rotate(-1.5deg) translate3d(0,0,0)}
  50%    {transform:rotate(1.5deg)  translate3d(0,-5px,0)}}
@media(prefers-reduced-motion:no-preference){
  html[data-motion="on"] .hslide.is-active .hero-visual.hm-sway img:not(.hero-front){
    animation:heroSway 9s ease-in-out infinite}
}

/* Follow the mouse. main.js writes --hx / --hy; the long ease is what stops a
   quick mouse movement from snapping the picture across the panel, and lets it
   settle gently back to centre when the pointer leaves. */
.hero-visual.hm-follow img:not(.hero-front){
  transform:translate3d(var(--hx,0px),var(--hy,0px),0);
  transition:transform .65s cubic-bezier(.22,1,.36,1)}

/* --------------------------------------------------------------------------
   THE SECOND PICTURE            Admin -> Hero slider -> A second picture

   A smaller picture in front of the main one: a product beside the
   installation it belongs to, a tracker over the vehicle, a phone over the
   panel it controls. It sits in a corner, and it can drift a little further
   across the picture behind it and back again — which is the whole point, so
   the two overlap by a changing amount rather than sitting as a flat collage.

   Every rule for the MAIN picture above says `img:not(.hero-front)`, because
   this is an <img> inside the same panel and would otherwise be swept up by
   all of them — stretched to `inset:0` and animated twice over.

   Above the scrim (a cut-out goes muddy under it) and below the caption (words
   are never covered). `pointer-events:none`, so a decorative picture can never
   eat a click meant for something behind it.
   -------------------------------------------------------------------------- */
.hero-front{position:absolute;z-index:5;height:auto;object-fit:contain;pointer-events:none;
  filter:drop-shadow(0 8px 12px rgba(3,9,13,.34)) drop-shadow(0 26px 34px rgba(3,9,13,.38))}

/* Width AND a height cap. Width alone is not enough: a tall cut-out — a phone,
   a person, a pole-mounted camera — at 34% of the panel's width comes out
   taller than the panel itself. With `object-fit:contain` the picture simply
   scales down inside the box, so a wide cut-out is governed by the width and a
   tall one by the height, and neither is ever distorted. */
.hero-front.sz-small {width:26%;max-height:46%}
.hero-front.sz-medium{width:34%;max-height:58%}
.hero-front.sz-large {width:44%;max-height:72%}

/* The corner it sits in, and — as two custom properties — which way "further
   over the picture behind" is from there. The drift keyframe reads them, so
   one keyframe serves all four corners. */
.hero-front.at-bottom-right{right:6%;bottom:9%;--n-x:-18px;--n-y:-11px}
.hero-front.at-bottom-left {left:6%; bottom:9%;--n-x: 18px;--n-y:-11px}
.hero-front.at-top-right   {right:6%;top:8%;   --n-x:-18px;--n-y: 11px}
.hero-front.at-top-left    {left:6%; top:8%;   --n-x: 18px;--n-y: 11px}

@keyframes heroNudge{
  0%,100%{transform:translate3d(0,0,0) scale(1)}
  50%    {transform:translate3d(var(--n-x,-18px),var(--n-y,-11px),0) scale(1.035)}}
@keyframes heroFrontFloat{
  0%,100%{transform:translate3d(0,0,0)}
  50%    {transform:translate3d(0,-11px,0)}}
@keyframes heroFrontSway{
  0%,100%{transform:rotate(-2deg)}
  50%    {transform:rotate(2deg)}}

/* Asked for inside `no-preference` rather than cancelled inside `reduce` —
   same reasoning as the main picture. The 8s and 6.5s periods deliberately do
   not divide into the main picture's 7s, so the two never fall into step and
   the overlap keeps changing. */
@media(prefers-reduced-motion:no-preference){
  html[data-motion="on"] .hslide.is-active .hero-front.h2-nudge{
    animation:heroNudge 8s ease-in-out infinite}
  html[data-motion="on"] .hslide.is-active .hero-front.h2-float{
    animation:heroFrontFloat 6.5s ease-in-out infinite}
  html[data-motion="on"] .hslide.is-active .hero-front.h2-sway{
    animation:heroFrontSway 8.5s ease-in-out infinite;transform-origin:50% 90%}
}

/* On a narrow phone the panel is much smaller, so the same percentage would
   shrink the front picture to a smudge. */
@media(max-width:640px){
  .hero-front.sz-small {width:32%;max-height:50%}
  .hero-front.sz-medium{width:40%;max-height:62%}
  .hero-front.sz-large {width:50%;max-height:74%}
}

/* Scrim + caption. Both are real elements — never ::after on a shared class. */
.shot-scrim{position:absolute;inset:0;z-index:4;pointer-events:none;
  background:linear-gradient(to top, rgba(8,16,22,.72), rgba(8,16,22,.18) 38%, transparent 62%)}
.shot-cap{position:absolute;left:22px;right:22px;bottom:20px;z-index:6;color:#fff;
  display:flex;flex-direction:column;gap:3px;text-align:left}
.shot-cap span{font-size:11.5px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;
  color:rgba(255,255,255,.72)}
.shot-cap b{font-family:var(--display);font-weight:700;font-size:17px;line-height:1.3}

/* A standalone photo panel for the inner pages, in the same visual language
   as the hero: rounded, shadowed, coloured until a photo arrives. */
.shot-frame{position:relative;border-radius:20px;overflow:hidden;box-shadow:var(--shadow-lg);
  aspect-ratio:4/3;display:grid;place-items:center;padding:26px;isolation:isolate}
.shot-frame img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.shot-frame .art{position:relative;z-index:2;width:100%;max-width:340px;height:auto}
.shot-frame.tall{aspect-ratio:4/4.4}
.shot-frame.wide{aspect-ratio:16/9}

/* A quiet "add a photo here" hint, shown only while the slot is still empty.
   It is the last child, so adding an <img> hides it automatically. */
.shot-frame .shot-todo,.hero-visual .shot-todo{position:absolute;top:14px;left:14px;z-index:6;
  display:inline-flex;align-items:center;gap:7px;padding:5px 11px;border-radius:20px;
  background:rgba(255,255,255,.16);backdrop-filter:blur(6px);
  font-size:11px;font-weight:600;letter-spacing:.04em;color:rgba(255,255,255,.9)}
.shot-frame:has(img) .shot-todo,.hero-visual:has(img) .shot-todo{display:none}
.shot-frame .shot-todo svg,.hero-visual .shot-todo svg{width:13px;height:13px;fill:currentColor}

@media(prefers-reduced-motion:reduce){
  /* Nothing to cancel — every hero-picture animation is only ever asked for
     inside `no-preference` above. All that is left is the transition, so a
     slide change cannot animate the zoom. The layout half stays untouched, so
     a cut-out is still shown whole rather than suddenly cropped. */
  .hero-visual.hm-drift img,.hero-visual.hm-follow img,.hero-front{transition:none}
}
@media(max-width:640px){
  .shot-cap{left:16px;right:16px;bottom:14px}
  .shot-cap b{font-size:15.5px}
}

/* ---------- 4. small pieces of life ------------------------------------- */
/* The green "live" pip next to the phone number in the footer — it says
   somebody is actually there. Its own element, its own animation. */
.live-pip{display:inline-block;width:7px;height:7px;border-radius:50%;background:#4fe08d;
  margin-right:8px;position:relative;flex-shrink:0}
.live-pip::after{content:"";position:absolute;inset:0;border-radius:50%;background:#4fe08d;
  animation:pipPulse 2.4s ease-out infinite}
@keyframes pipPulse{0%{transform:scale(1);opacity:.7}100%{transform:scale(3.4);opacity:0}}

/* The WhatsApp button breathes once every few seconds until it is hovered. */
.wa{transition:transform .3s cubic-bezier(.22,1,.36,1),box-shadow .3s}
.wa::before{content:"";position:absolute;inset:0;border-radius:50%;background:#25d366;z-index:-1;
  animation:waPulse 3.6s ease-out infinite}
.wa:hover{transform:scale(1.08) rotate(-4deg);box-shadow:0 14px 34px rgba(37,211,102,.5)}
.wa:hover::before{animation-play-state:paused}
@keyframes waPulse{0%{transform:scale(1);opacity:.55}70%,100%{transform:scale(1.7);opacity:0}}

/* The dark bands get a slow-moving sheen so they are not a flat rectangle. */
.band{position:relative;overflow:hidden}
.band-glow{position:absolute;inset:-40% -10%;z-index:0;pointer-events:none;
  background:radial-gradient(600px 300px at 20% 40%, rgba(79,224,141,.16), transparent 62%),
             radial-gradient(600px 300px at 80% 60%, rgba(106,168,255,.14), transparent 62%);
  animation:bandDrift 22s ease-in-out infinite alternate}
.band .wrap{position:relative;z-index:1}
@keyframes bandDrift{to{transform:translate3d(4%,-6%,0) scale(1.08)}}

/* Underline that draws itself across a text link. */
.link-draw{position:relative;color:var(--green);font-weight:600}
.link-draw::after{content:"";position:absolute;left:0;right:100%;bottom:-2px;height:1.5px;
  background:currentColor;transition:right .32s cubic-bezier(.22,1,.36,1)}
.link-draw:hover::after{right:0}

@media(prefers-reduced-motion:reduce){
  .live-pip::after,.wa::before,.band-glow{animation:none}
  .wa:hover{transform:none}
}

/* ==========================================================================
   VEHICLE TRACKER ICONS  (tracker-pricing.php)
   The same 66px mark the solar packages use, so the two price lists look like
   they belong to the same shop — but these are multi-part SVGs so each one can
   move when the mouse is over its card.

   Everything is keyed off .price:hover, not the icon itself: the whole card is
   the target, so the animation starts wherever on the card the pointer lands.
   Every piece animates with transform or opacity only, so nothing re-lays-out
   the page, and the whole thing stops for prefers-reduced-motion.
   ========================================================================== */
.track-icon{color:var(--blue)}
.track-icon svg{width:66px;height:66px;fill:currentColor;display:block;overflow:visible}
.price.feat .track-icon{color:var(--green)}

/* --- the map pin: drops in, with a ripple spreading underneath ----------- */
.ti-pin{transform-origin:12px 21px;transition:transform .45s cubic-bezier(.34,1.56,.64,1)}
.ti-shadow{fill:currentColor;opacity:.16;transform-origin:12px 20.6px;
  transition:transform .45s cubic-bezier(.34,1.56,.64,1),opacity .45s}
.ti-ripple{fill:none;stroke:currentColor;stroke-width:1.2;opacity:0;transform-origin:12px 20.4px}
.price:hover .ti-pin{animation:tiDrop .75s cubic-bezier(.34,1.56,.64,1)}
.price:hover .ti-shadow{animation:tiShadow .75s ease-out}
.price:hover .ti-ripple{animation:tiRipple 1.5s ease-out .18s infinite}
@keyframes tiDrop{
  0%{transform:translateY(-7px) scale(.86)}
  55%{transform:translateY(1.5px) scale(1.04)}
  100%{transform:none}}
@keyframes tiShadow{
  0%{transform:scaleX(.4);opacity:.05}
  55%{transform:scaleX(1.25);opacity:.26}
  100%{transform:none;opacity:.16}}
@keyframes tiRipple{
  0%{transform:scale(.25);opacity:.75}
  100%{transform:scale(1.9);opacity:0}}

/* --- signal arcs: ripple outward, one after another --------------------- */
.ti-wave{opacity:.28;transform-origin:12px 9px}
.price:hover .ti-wave-1{animation:tiWave 1.8s ease-out infinite}
.price:hover .ti-wave-2{animation:tiWave 1.8s ease-out .22s infinite}
.price:hover .ti-wave-3{animation:tiWave 1.8s ease-out .44s infinite}
@keyframes tiWave{
  0%{opacity:0;transform:scale(.72)}
  35%{opacity:1}
  100%{opacity:0;transform:scale(1.12)}}

/* --- the car: rolls forward and settles --------------------------------- */
.ti-car{transition:transform .4s cubic-bezier(.22,1,.36,1)}
.price:hover .ti-car{animation:tiRoll 1.6s ease-in-out infinite}
@keyframes tiRoll{
  0%,100%{transform:translateX(0)}
  50%{transform:translateX(1.6px)}}

/* --- the motorbike: body leans, wheels turn ----------------------------- */
.ti-body{transition:transform .4s cubic-bezier(.22,1,.36,1)}
.ti-wheel-a{transform-origin:5.4px 16.6px}
.ti-wheel-b{transform-origin:18.6px 16.6px}
.price:hover .ti-body{animation:tiRoll 1.4s ease-in-out infinite}
.price:hover .ti-wheel{animation:tiSpin 1.6s linear infinite}
@keyframes tiSpin{to{transform:rotate(360deg)}}

/* --- the shield: the pin inside pulses, the shield draws itself --------- */
.ti-shield{stroke-dasharray:70;stroke-dashoffset:0}
.price:hover .ti-shield{animation:tiDraw 1.2s ease-out}
.price:hover .ti-pin{animation:tiDrop .75s cubic-bezier(.34,1.56,.64,1)}
@keyframes tiDraw{from{stroke-dashoffset:70}to{stroke-dashoffset:0}}

/* --- the fleet: three vans move off in convoy --------------------------- */
.ti-van{transition:transform .4s cubic-bezier(.22,1,.36,1)}
.price:hover .ti-van-1{animation:tiConvoy 1.7s ease-in-out infinite}
.price:hover .ti-van-2{animation:tiConvoy 1.7s ease-in-out .14s infinite}
.price:hover .ti-van-3{animation:tiConvoy 1.7s ease-in-out .28s infinite}
.ti-road{transition:opacity .35s}
.price:hover .ti-road{opacity:.75}
@keyframes tiConvoy{
  0%,100%{transform:translateX(0)}
  50%{transform:translateX(2.2px)}}

/* The mark also lifts very slightly with the card, like the solar one does. */
.track-icon svg{transition:transform .4s cubic-bezier(.22,1,.36,1)}
.price:hover .track-icon svg{transform:translateY(-2px)}

@media(prefers-reduced-motion:reduce){
  .track-icon svg,.ti-pin,.ti-shadow,.ti-ripple,.ti-wave,.ti-car,.ti-body,.ti-wheel,
  .ti-shield,.ti-van,.ti-road,
  .price:hover .track-icon svg,.price:hover .ti-pin,.price:hover .ti-shadow,
  .price:hover .ti-ripple,.price:hover .ti-wave-1,.price:hover .ti-wave-2,
  .price:hover .ti-wave-3,.price:hover .ti-car,.price:hover .ti-body,
  .price:hover .ti-wheel,.price:hover .ti-shield,.price:hover .ti-van-1,
  .price:hover .ti-van-2,.price:hover .ti-van-3{animation:none;transition:none;transform:none}
}

/* ---------- sub-categories in the shop ----------
   A category can sit under another one (Admin -> Categories -> "Sits under").
   The sidebar nests them; the chips above the grid let someone move between
   sisters without going back to the sidebar. */
.side-cats .side-subs{list-style:none;margin:2px 0 6px 12px;padding-left:10px;
  border-left:1px solid var(--line);display:flex;flex-direction:column;gap:1px}
.side-cats .side-subs a{font-size:13.5px;padding:7px 10px;color:var(--ink-faint)}
.side-cats .side-subs a:hover{color:var(--ink)}
.side-cats .side-subs a.on{background:var(--green-050);color:var(--green);font-weight:600}
.side-cats .has-kids>a{font-weight:600;color:var(--ink)}

.sub-chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:20px}
.sub-chip{display:inline-flex;align-items:center;gap:7px;padding:8px 15px;border-radius:999px;
  border:1px solid var(--line);background:#fff;font-size:13.5px;font-weight:500;color:var(--ink-soft);
  transition:.18s}
.sub-chip span{font-size:11.5px;color:var(--ink-faint);background:var(--bg-soft);
  border-radius:999px;padding:1px 7px;transition:.18s}
.sub-chip:hover{border-color:var(--green);color:var(--green)}
.sub-chip.on{background:var(--green);border-color:var(--green);color:#fff}
.sub-chip.on span{background:rgba(255,255,255,.22);color:#fff}

/* The tracker price list puts its Add-to-cart button inside a form, so the
   form has to behave like the button it wraps inside .price-actions. */
.price-add{flex:1 1 auto;margin:0;display:flex}
.price-add .btn{width:100%;justify-content:center;margin-top:0}

/* ==========================================================================
   SOLAR PACKAGE ICON  (solar-pricing.php)
   The sun-and-panel mark is drawn in pieces by package_icon_svg() so it can
   come to life when the mouse is over its card: the sun swells, its rays turn,
   and light sweeps across the panel one column at a time — left to right, the
   way the sun actually crosses it.

   Same rules as the tracker icons: keyed off .price:hover so the animation
   starts wherever on the card the pointer lands, transform and opacity only so
   nothing re-lays-out the page, and every bit of it stopped for a visitor who
   has asked for reduced motion.
   ========================================================================== */
.solar-icon svg{overflow:visible;transition:transform .4s cubic-bezier(.22,1,.36,1)}
.price:hover .solar-icon svg{transform:translateY(-2px)}

/* --- the sun: a slow swell, and a soft halo behind it -------------------- */
.si-sun{transform-origin:5.6px 5.4px;transition:transform .4s cubic-bezier(.34,1.56,.64,1)}
.price:hover .si-sun{animation:siPulse 2.2s ease-in-out infinite}
@keyframes siPulse{
  0%,100%{transform:scale(1)}
  50%{transform:scale(1.16)}}

/* --- the rays: turn about the sun, and breathe with it ------------------- */
.si-rays{transform-origin:5.6px 5.4px}
.price:hover .si-rays{animation:siTurn 9s linear infinite, siShine 2.2s ease-in-out infinite}
@keyframes siTurn{to{transform:rotate(360deg)}}
@keyframes siShine{
  0%,100%{opacity:.75}
  50%{opacity:1}}

/* --- the panel: light crosses it, column by column ---------------------- */
.si-cell{transition:opacity .3s}
.price:hover .si-col-1{animation:siSweep 2.4s ease-in-out infinite}
.price:hover .si-col-2{animation:siSweep 2.4s ease-in-out .22s infinite}
.price:hover .si-col-3{animation:siSweep 2.4s ease-in-out .44s infinite}
@keyframes siSweep{
  0%,55%,100%{opacity:1}
  25%{opacity:.35}}

/* the panel itself tips very slightly toward the sun */
.si-panel{transform-origin:16px 17px;transition:transform .5s cubic-bezier(.22,1,.36,1)}
.price:hover .si-panel{transform:rotate(-2.5deg)}

@media(prefers-reduced-motion:reduce){
  .solar-icon svg,.si-sun,.si-rays,.si-cell,.si-panel,
  .price:hover .solar-icon svg,.price:hover .si-sun,.price:hover .si-rays,
  .price:hover .si-col-1,.price:hover .si-col-2,.price:hover .si-col-3,
  .price:hover .si-panel{animation:none;transition:none;transform:none;opacity:1}
}
.app-essential span{display:none}.app-essential select{min-width:84px}.calc-bill-loads{margin-top:22px}.calc-disclaimer{line-height:1.65}.calc-whatsapp{margin-top:18px}.ten-year-saving{background:#eaf8ef!important;border-color:#75c78c!important}.ten-year-saving dt,.ten-year-saving dd{color:#087a35!important}
.ten-year-shortfall{background:#fff2f0!important;border-color:#e5a39b!important}.ten-year-shortfall dt,.ten-year-shortfall dd{color:#a83226!important}
.calc-goal-grid{margin-top:18px}.payback-target{margin-top:18px;padding:18px;border:1px solid #9fd8b0;border-radius:14px;background:#f0fbf4;display:grid;gap:5px}.payback-target b{color:#087a35}.payback-target span{font:700 1.2rem/1.3 var(--font-head,inherit);color:#086b31}.payback-target small{color:var(--muted,#667085);line-height:1.5}
@media(min-width:761px){.app-head,.app-row{grid-template-columns:minmax(220px,2fr) 72px 105px 105px 92px 36px}}
@media(max-width:760px){.app-essential span{display:block;font-size:.75rem;color:var(--muted,#667085);margin-bottom:4px}.app-essential{display:block}}
.portal-hero{padding:70px 0 42px;background:linear-gradient(135deg,#082f1d,#146b3a);color:#fff}.portal-hero h1{margin:.3rem 0;font-size:clamp(2.2rem,5vw,4.2rem)}.portal-hero .eyebrow{color:#a8efbf}.portal-grid{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(300px,.75fr);gap:24px}.portal-card{background:#fff;border:1px solid #dfe8e3;border-radius:20px;padding:24px;box-shadow:0 12px 40px rgba(13,50,31,.07);margin-bottom:24px}.portal-card h2{margin-top:0}.spec-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.spec-grid div{background:#f3f8f5;border-radius:14px;padding:16px}.spec-grid span,.deposit-total span,.deposit-total small{display:block;color:var(--muted,#667085);font-size:.84rem}.spec-grid b{display:block;margin-top:5px;font-size:1.25rem;color:#087a35}.portal-actions,.center-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:20px}.pipeline{list-style:none;padding:0;margin:10px 0;display:grid;gap:0}.pipeline li{position:relative;padding:0 0 24px 34px;color:#7b8790}.pipeline li span{position:absolute;left:4px;top:2px;width:17px;height:17px;border:3px solid #ced8d2;border-radius:50%;background:#fff}.pipeline li:not(:last-child):after{content:"";position:absolute;left:11px;top:19px;width:3px;height:28px;background:#dfe8e3}.pipeline li.done{font-weight:700;color:#173d29}.pipeline li.done span,.pipeline li.done:after{background:#1f9d55;border-color:#1f9d55}.stack-form{display:grid;gap:13px}.stack-form label{display:grid;gap:6px;font-weight:650}.stack-form input,.stack-form select,.stack-form textarea{width:100%;padding:12px;border:1px solid #ced8d2;border-radius:10px;font:inherit}.portal-note{padding:12px;background:#eef8f1;border-radius:10px}.deposit-total{padding:22px;background:#eef9f2;border-radius:15px;margin:18px 0}.deposit-total b{display:block;font-size:2rem;color:#087a35}.narrow{max-width:720px}.case-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:24px}.case-card{overflow:hidden;border-radius:20px;background:#fff;border:1px solid #e0e8e3;box-shadow:0 10px 35px rgba(13,50,31,.07)}.case-card>img{width:100%;height:240px;object-fit:cover}.case-body{padding:22px}.case-body h2{margin:.35rem 0}.case-body details{border-top:1px solid #e7ede9;padding:12px 0}.case-body summary{font-weight:750;cursor:pointer}.case-size{display:inline-block;color:#087a35;margin-bottom:14px}.center-actions{justify-content:center;margin-top:30px}.care-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px}.status-result{text-align:center;max-width:620px;margin:0 auto 24px}.status-result b{text-transform:capitalize;color:#087a35}@media(max-width:860px){.portal-grid,.care-grid{grid-template-columns:1fr}.spec-grid{grid-template-columns:1fr}}
