/* ============================================================================
   CBRUK - Compare Bamboo Removal, shared stylesheet.

   PALETTE  -  "INDIGO & ROSE"   (2026-08-12)

     --brand-d  #1E2559  deep indigo    trust anchor: headings, dark bands, footer
     --brand    #3B5BDB  vivid indigo   links, icons, accents
     --cta      #D6285C  magenta-rose   the one colour that should catch the eye
     --accent   #8FD3FF  bright sky     highlights ON the dark indigo bands

   NO GREEN AND NO ORANGE, deliberately. Two earlier passes lived in the green
   family (muted teal + bamboo gold, then jade + orange) and both looked like every
   other plant-removal site. This one leaves that family entirely.

   The reasoning is not only aesthetic: every bamboo and knotweed competitor is
   green, the sister knotweed site IS forest green + terracotta, and two sites run
   from the same Ads account family must be tellable apart at a glance in a
   screenshot, a logo or an ad preview. Indigo is also the UK convention for
   comparison and trades marketplaces - the category this actually competes in,
   rather than horticulture.

   WHAT STAYS GREEN, AND SHOULD: the bamboo in the root-barrier diagram
   (CBRUKDiagrams), the species plates and the photographs. Those depict a plant;
   they are not brand colour, and a blue bamboo cane in a technical cross-section
   would read as a mistake. Brand is indigo; subject is still a plant.

   CONTRAST. All 19 text/background pairs are verified by tools/palette.py, which
   REFUSES to apply a palette that fails AA. Worth knowing why the ink changed
   back to white: the outgoing orange was so bright that white on it was only
   2.6:1, so it needed near-black ink. The rose CTA is darker and white passes at
   4.86:1 - so --cta-ink is plain white again.

   One CTA colour sitewide. Alternating white / --bg-soft bands, with one dark
   --brand-d feature band. Headings Nunito Sans, body Inter - the same type stack
   as the sister site, which is intentional: it lets both sites share the two
   self-hosted woff2 files, and the palettes now share nothing at all.
   ============================================================================ */
:root{
  --brand:#3B5BDB;        /* vivid indigo, primary */
  --brand-d:#1E2559;      /* deep indigo, headings + dark bands */
  --brand-l:#EEF1FE;      /* pale wash, soft panels */
  --brand-b:#C3CEFB;      /* border on brand-l */
  --bg-soft:#F5F7FF;      /* alternating band */
  --brand-chip:#DDE4FE;
  --cta:#D6285C;          /* magenta-rose - the single attention colour */
  --cta-d:#B81E4C;
  --cta-ink:#FFFFFF;      /* white passes 4.86:1 on the rose - see above */
  --txt:#151833;
  --muted:#5B6382;
  --footer:#161C42;
  --line:#C3CEFB;
  --shadow:0 12px 26px rgba(30,37,89,.10);
}
html,body{margin:0;padding:0}
*{box-sizing:border-box}
body{background:#fff;color:var(--txt);font-family:'Inter',system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
h1,h2,h3,h4,.cbr-head{font-family:'Nunito Sans','Inter',sans-serif;letter-spacing:-0.015em;color:var(--brand-d)}
/* On dark sections the wrapper sets color:#fff; headings must inherit white or
   they render dark-on-dark. This attribute selector is the sister site's fix for
   exactly that bug - keep it, several pages rely on it. */
[style*="color:#fff"] h1,[style*="color:#fff"] h2,[style*="color:#fff"] h3,
[style*="color:#fff"] h4,[style*="color:#fff"] .cbr-head{color:#fff}
a{color:var(--brand)}
img,svg{max-width:100%}

/* --- eyebrow --- */
.cbr-eyebrow{font-family:'Nunito Sans',sans-serif;font-weight:800;font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--brand)}

/* --- primary CTA (magenta-rose + white ink, sitewide) --- */
.cbr-cta{display:inline-flex;align-items:center;justify-content:center;gap:9px;background:var(--cta);color:var(--cta-ink)!important;text-decoration:none;font-family:'Nunito Sans',sans-serif;font-weight:900;font-size:16.5px;line-height:1;padding:15px 26px;min-height:44px;border:none;border-radius:13px;cursor:pointer;box-shadow:0 12px 26px rgba(214,40,92,.34);transition:filter .15s ease,transform .15s ease,box-shadow .15s ease}
.cbr-cta:hover{filter:brightness(.96);transform:translateY(-1px)}
.cbr-cta:active{transform:translateY(0)}
.cbr-cta:focus-visible{outline:3px solid var(--brand);outline-offset:2px}
/* hero CTA pulse + shine */
@keyframes cbr-pulse{0%,100%{box-shadow:0 12px 26px rgba(214,40,92,.34)}50%{box-shadow:0 14px 34px rgba(214,40,92,.58)}}
.cbr-cta-hero{position:relative;overflow:hidden;animation:cbr-pulse 2.8s ease-in-out infinite}
@keyframes cbr-shine{0%{transform:translateX(-120px) skewX(-18deg)}55%,100%{transform:translateX(440px) skewX(-18deg)}}
.cbr-cta-hero::after{content:"";position:absolute;top:0;left:0;width:70px;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.5),transparent);transform:translateX(-120px) skewX(-18deg);animation:cbr-shine 3.4s ease-in-out infinite;pointer-events:none}
@media(prefers-reduced-motion:reduce){.cbr-cta-hero{animation:none}.cbr-cta-hero::after{display:none}}

/* --- secondary / phone buttons --- */
.cbr-btn2{display:inline-flex;align-items:center;gap:8px;background:#fff;border:2px solid var(--brand-b);color:var(--brand-d);text-decoration:none;font-family:'Nunito Sans',sans-serif;font-weight:800;font-size:15px;padding:12px 20px;min-height:44px;border-radius:12px;transition:border-color .15s}
.cbr-btn2:hover{border-color:var(--brand)}

/* --- "In short" AEO answer box ---------------------------------------------
   The single most important component on the guide pages. Answer engines and
   featured snippets lift a short, self-contained, directly-phrased answer; this
   box is where every page puts one, immediately under the H1 and above any
   marketing. Keep it to 40-70 words and make it answer the title question
   literally. */
.cbr-inshort{background:var(--brand-l);border:1px solid var(--brand-b);border-left:5px solid var(--brand);border-radius:16px;padding:24px 28px}
.cbr-inshort .lbl{font-family:'Nunito Sans',sans-serif;font-weight:900;font-size:14px;letter-spacing:.1em;text-transform:uppercase;color:var(--brand)}
.cbr-inshort p{font-size:17px;line-height:1.7;color:var(--txt);margin:10px 0 0}

/* ============================================================================
   CONTENT GRIDS  .cbr-g2 / .cbr-g3 / .cbr-g4
   ============================================================================
   THESE LIVE HERE, SITE-WIDE, AND MUST NOT MOVE BACK INTO A CONTROL.

   They were originally defined in an inline <style> inside Controls/GuidePage.ascx
   and scoped `.cbr-article .cbr-g3`. That worked on the guide pages and silently
   failed everywhere else: the homepage and the areas hub use the same classes but
   do NOT host GuidePage, so the rules were never on the page at all. The divs fell
   back to display:block and every card grid stacked into a single column down the
   middle of a 1440px screen.

   Nothing errored. It just looked wrong, at every width, on the two pages that get
   the most traffic. tools/audit.py measures the computed grid-template-columns for
   exactly this reason - a screenshot tells you it looks wrong, the computed value
   tells you why.

   Not scoped to .cbr-article either, so a grid works anywhere on the site.

   RESPONSIVE INTENT: columns on desktop, two up on tablet, stacked on phones.
   ========================================================================== */
.cbr-g2,.cbr-g3,.cbr-g4{display:grid;gap:20px}
.cbr-g2{grid-template-columns:repeat(2,1fr)}
.cbr-g3{grid-template-columns:repeat(3,1fr)}
.cbr-g4{grid-template-columns:repeat(4,1fr)}

/* Tablet: 3-up and 4-up both drop to 2. A 3-across grid at 900px gives ~280px
   cards, which is too narrow for the body copy these carry. */
@media(max-width:1000px){
  .cbr-g3,.cbr-g4{grid-template-columns:repeat(2,1fr)}
  .cbr-g2,.cbr-g3,.cbr-g4{gap:16px}
}
/* Phones: single column. */
@media(max-width:640px){
  .cbr-g2,.cbr-g3,.cbr-g4{grid-template-columns:1fr}
}

/* --- cards / chips --- */
.cbr-card{background:#fff;border:1px solid var(--line);border-radius:18px;box-shadow:0 1px 2px rgba(22,28,66,.04);padding:26px}
.cbr-chip{display:inline-flex;align-items:center;gap:7px;font-size:14px;font-weight:600;color:var(--brand-d);background:var(--brand-l);border:1px solid var(--brand-b);border-radius:999px;padding:8px 14px}

/* --- kill horizontal scroll (the sticky header is a sibling of #cbrMain) --- */
#cbrMain{overflow-x:clip}

/* --- scroll reveal (JS-gated; no-JS / reduced-motion => visible) --- */
.js [data-reveal]{opacity:0;transform:translateY(18px);transition:opacity .7s cubic-bezier(.2,.7,.3,1),transform .7s cubic-bezier(.2,.7,.3,1)}
.js [data-reveal].cbr-revealed{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.js [data-reveal]{opacity:1!important;transform:none!important;transition:none!important}}

/* --- header nav responsive --- */
@media(min-width:900px){.cbr-nav{display:flex!important}}
@media(max-width:900px){.cbr-burger{display:inline-flex!important}.cbr-headcta{display:none!important}}
.cbr-navlink:hover{color:var(--brand)}

/* --- footer --- */
.cbr-footlink:hover{color:#fff!important}
@media(max-width:840px){.cbr-footgrid{grid-template-columns:1fr 1fr!important;gap:28px!important}}
@media(max-width:520px){.cbr-footgrid{grid-template-columns:1fr!important}}

/* --- sticky bottom action bar --- */
.cbr-stickybar{position:fixed;left:0;right:0;bottom:0;z-index:40;background:rgba(255,255,255,.94);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-top:1px solid var(--line);box-shadow:0 -6px 22px rgba(22,28,66,.12);padding:10px 16px}
.cbr-stickybar>div{max-width:1180px;margin:0 auto;display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:center}
.cbr-stickybar .cbr-cta{width:100%}
/* The bar is fixed, so every page needs clearance or it covers the footer's
   last line. Applied here rather than per page so it cannot be forgotten. */
body{padding-bottom:76px}
@media(max-width:560px){
  .cbr-stickybar>div{grid-template-columns:1fr!important}
  .cbr-stickybar .cbr-btn2{display:none!important}
  .cbr-stickybar .cbr-cta{padding:14px 16px!important;font-size:15px!important}
  body{padding-bottom:70px}
}

/* --- legal / long-form pages --- */
.cbr-legal{max-width:820px;margin:0 auto;color:#333A5C;font-size:15.5px;line-height:1.72}
.cbr-legal h2{font-family:'Nunito Sans',sans-serif;font-size:24px;color:var(--brand-d);margin:32px 0 10px}
.cbr-legal h3{font-family:'Nunito Sans',sans-serif;font-size:18px;color:var(--brand-d);margin:22px 0 8px}
.cbr-legal p{margin:0 0 14px}
.cbr-legal ul,.cbr-legal ol{margin:0 0 14px;padding-left:22px}.cbr-legal li{margin:0 0 7px}
.cbr-legal table{border-collapse:collapse;width:100%;margin:16px 0;font-size:14px}
.cbr-legal th,.cbr-legal td{padding:10px 12px;text-align:left;border:1px solid var(--line);vertical-align:top}
.cbr-legal th{background:var(--brand-l);color:var(--brand-d)}

/* --- FAQ accordion (native details/summary) --- */
.cbr-faq{background:var(--brand-l);border:1px solid var(--brand-b);border-radius:14px;overflow:hidden}
.cbr-faq+.cbr-faq{margin-top:12px}
.cbr-faq>summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:18px 20px;font-family:'Nunito Sans',sans-serif;font-weight:800;font-size:16.5px;color:var(--brand-d)}
.cbr-faq>summary::-webkit-details-marker{display:none}
.cbr-faq .cbr-faq-ic{flex-shrink:0;transition:transform .2s ease;display:grid;place-items:center;width:26px;height:26px;border-radius:50%;background:#fff;color:var(--brand);font-weight:900}
.cbr-faq[open] .cbr-faq-ic{transform:rotate(45deg)}
.cbr-faq .cbr-faq-a{padding:0 20px 20px;font-size:15.5px;line-height:1.65;color:#454B6B}
.cbr-faq .cbr-faq-a p{margin:0 0 10px}
.cbr-faq .cbr-faq-a p:last-child{margin-bottom:0}

/* --- article furniture shared by the AEO guides ---------------------------- */
.cbr-article h2{font-family:'Nunito Sans',sans-serif;font-weight:900;font-size:30px;letter-spacing:-.015em;margin:0}
.cbr-article .lede{font-size:16.5px;line-height:1.65;color:#454B6B;margin:12px 0 0}
.cbr-crumb{font-size:13px;color:var(--muted);font-weight:500}
.cbr-crumb a{color:var(--brand);text-decoration:none;font-weight:700}
/* pull-quote / caution panel, gold-tinted so it reads as "pay attention" */
.cbr-note{background:#FFF0F4;border:1px solid #FFCFDD;border-left:5px solid var(--cta);border-radius:14px;padding:18px 22px}
.cbr-note .lbl{font-family:'Nunito Sans',sans-serif;font-weight:900;font-size:12.5px;letter-spacing:.09em;text-transform:uppercase;color:#A8123F}
.cbr-note p{font-size:15px;line-height:1.6;color:var(--txt);margin:7px 0 0}
/* tick list */
.cbr-ticks{list-style:none;padding:0;margin:18px 0 0;display:grid;gap:12px}
.cbr-ticks li{display:flex;gap:11px;margin:0}
.cbr-ticks li>span:first-child{flex:none;display:grid;place-items:center;width:24px;height:24px;border-radius:50%;background:var(--brand-chip);color:var(--brand);font-weight:900;font-size:12px}
.cbr-ticks li>span:last-child{font-size:15px;line-height:1.55;color:#454B6B}

/* ============================================================================
   GLOBAL MOBILE SAFETY-NET
   The content pages use inline `grid-template-columns` with per-page @media
   overrides, but some inline grids have no class to target. These attribute
   selectors are a backstop so EVERY multi-column inline grid stacks on small
   screens whether or not its page handles it. Page rules sit later in the
   cascade at equal specificity, so anything handled explicitly still wins -
   this only catches the stragglers.
   ============================================================================ */

/* Hard overflow guard. Applied to the root only, NOT body: making body a scroll
   container breaks position:sticky on the header. */
html{overflow-x:clip}

@media (max-width:768px){
  [style*="grid-template-columns:repeat("],[style*="grid-template-columns: repeat("],
  [style*="grid-template-columns:1fr 1fr"],[style*="grid-template-columns: 1fr 1fr"]{
    grid-template-columns:1fr 1fr !important;
  }
  [style*="grid-template-columns:1.05fr"],[style*="grid-template-columns: 1.05fr"],
  [style*="grid-template-columns:1.1fr"],[style*="grid-template-columns:1.35fr"],
  [style*="grid-template-columns:1.5fr"],[style*="grid-template-columns:1.1fr .9fr"],
  [style*="grid-template-columns:1fr 200px"],[style*="grid-template-columns:1fr 0.9fr"]{
    grid-template-columns:1fr !important;
  }
}

@media (max-width:480px){
  [style*="grid-template-columns:repeat("],[style*="grid-template-columns: repeat("],
  [style*="grid-template-columns:1fr 1fr"],[style*="grid-template-columns: 1fr 1fr"],
  [style*="grid-template-columns:auto 1fr auto"]{
    grid-template-columns:1fr !important;
  }
  /* Site-wide small-screen clamp. The !important is here because the guide and
     GEO pages set h1/h2 sizes inline in dozens of places, and this is the one
     rule that reins all of them in.

     IT ALSO OUTRANKS EVERY CLASS. A type selector with !important beats
     .lp3-h1, so the PPC landers' own mobile hero sizes were silently dead until
     they were marked !important too - which matters there because the chooser
     page's H1 height is part of a fold budget (see tools/foldcheck.py). Exclude
     the lander heroes rather than fight them. */
  h1:not(.lp3-h1):not(.lp-h1){font-size:30px !important;line-height:1.12 !important}
  h2{font-size:25px !important}
}

/* ============================================================================
   RESPONSIVE COMPARISON TABLES (.cbr-rtable)
   Wide tables are unreadable on phones. At <=640px each row becomes a card: the
   first cell is the card title, and every other cell shows its column name from
   data-label beside the value. Desktop is unchanged.

   Every <td> after the first MUST carry data-label="<column heading>" or the
   mobile view loses its labels. That is the one authoring rule here.
   ============================================================================ */
.cbr-rtable{width:100%}
@media(max-width:640px){
  .cbr-rtable{min-width:0!important;border-collapse:separate;border-spacing:0}
  .cbr-rtable thead{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
  .cbr-rtable tr{display:block!important;background:#fff!important;border:1px solid var(--line)!important;border-radius:12px;margin:0 0 12px;overflow:hidden}
  .cbr-rtable td{display:flex!important;justify-content:space-between;align-items:baseline;gap:16px;width:auto!important;padding:9px 14px!important;border-top:1px solid #EBEFFE!important;text-align:right!important;font-size:14px!important;color:#454B6B}
  .cbr-rtable td::before{content:attr(data-label);font-family:'Nunito Sans',sans-serif;font-weight:800;font-size:11.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--brand-d);text-align:left;flex:none;max-width:46%}
  .cbr-rtable td:first-child{display:block!important;text-align:left!important;background:var(--brand-l);border-top:0!important;padding:12px 14px!important;font-family:'Nunito Sans',sans-serif;font-weight:800!important;font-size:15px!important;color:var(--brand-d)!important}
  .cbr-rtable td:first-child::before{content:none}
}
