/* ============================================================
   TaxEngines design system — Bootstrap 5.3 layer (ATS-004, RC2)
   BUILD MARKER: site.css v2.3.0-rc4 (includes Financial Snapshot styles)
   ------------------------------------------------------------
   Loaded AFTER assets/vendor/bootstrap/css/bootstrap.min.css.
   This file does two jobs:
     1. Re-tokenises Bootstrap to the TaxEngines brand (navy/green,
        Inter, radii, shadows) via Bootstrap's own CSS variables, so
        every Bootstrap component inherits the brand automatically.
     2. Defines the small set of custom components the templates use
        (calculator panels, headline, tabs, breakdown, bars, trust
        block). One system, reused by every calculator and guide.
   No build step. No second style. Layout is Bootstrap grid + utilities.
   ============================================================ */

/* ---- 0. Self-hosted Inter (variable) — no third-party font request -- */
@font-face{
  font-family:"Inter";font-style:normal;font-weight:100 900;font-display:swap;
  src:url("../fonts/InterVariable.woff2") format("woff2");
}
@font-face{
  font-family:"Inter";font-style:italic;font-weight:100 900;font-display:swap;
  src:url("../fonts/InterVariable-Italic.woff2") format("woff2");
}
/* FIX-001: General Sans is the approved brand typeface, but the licensed
   woff2 files (assets/fonts/GeneralSans-Variable.woff2 and -Italic) were
   never included in the brand package, and the @font-face rules that
   referenced them caused every page to request two files that don't
   exist. Removed here so Inter (self-hosted above) is the site's active
   font with no missing-asset requests. If the licensed General Sans files
   are obtained later, reinstate the two @font-face rules pointing at
   those paths and add "General Sans" back to --bs-font-sans-serif below. */

/* ---- 1. Brand tokens ------------------------------------------------ */
:root{
  --navy:#04192f; --green:#08745f; --green2:#0b8b70; --mint:#e5f6f1;
  --ink:#172532; --muted:#60717f; --line:#d9e2e8; --soft:#f5f8fa;
  --error:#B42318;

  --te-radius:.65rem; --te-radius-lg:1.1rem;
  --te-shadow-sm:0 1px 2px rgba(10,34,56,.06),0 1px 3px rgba(10,34,56,.05);
  --te-shadow-md:0 6px 16px rgba(10,34,56,.08);
  --te-shadow-lg:0 18px 44px rgba(10,34,56,.10);
  --te-ring:0 0 0 3px rgba(8,116,95,.28);

  /* Re-point Bootstrap's global tokens at the brand. */
  --bs-primary:#08745f;
  --bs-primary-rgb:8,116,95;
  --bs-link-color:#08745f;
  --bs-link-color-rgb:8,116,95;
  --bs-link-hover-color:#0b8b70;
  --bs-link-hover-color-rgb:11,139,112;
  --bs-body-color:#172532;
  --bs-body-color-rgb:23,37,50;
  --bs-emphasis-color:#04192f;
  --bs-border-color:#d9e2e8;
  --bs-border-radius:.65rem;
  --bs-border-radius-lg:1.1rem;
  --bs-font-sans-serif:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --bs-body-font-family:var(--bs-font-sans-serif);
  --bs-body-line-height:1.62;
  --bs-heading-color:#04192f;
  --bs-focus-ring-color:rgba(8,116,95,.35);
  --bs-secondary-bg:#f5f8fa;
}

/* Brand the Bootstrap buttons/links that use primary. */
.btn-primary{
  --bs-btn-bg:#08745f; --bs-btn-border-color:#08745f;
  --bs-btn-hover-bg:#0b8b70; --bs-btn-hover-border-color:#0b8b70;
  --bs-btn-active-bg:#066a56; --bs-btn-active-border-color:#066a56;
  --bs-btn-disabled-bg:#08745f; --bs-btn-disabled-border-color:#08745f;
  --bs-btn-focus-shadow-rgb:8,116,95;
  font-weight:700;
}
.btn-dark{
  --bs-btn-bg:#04192f; --bs-btn-border-color:#04192f;
  --bs-btn-hover-bg:#0d2c48; --bs-btn-hover-border-color:#0d2c48;
  --bs-btn-active-bg:#081b2d; --bs-btn-active-border-color:#081b2d;
  font-weight:700;
}
.btn-outline-secondary{
  --bs-btn-color:#04192f; --bs-btn-border-color:#d9e2e8;
  --bs-btn-hover-bg:#f5f8fa; --bs-btn-hover-border-color:#c4d3db;
  --bs-btn-hover-color:#04192f; --bs-btn-active-bg:#eef3f6;
  --bs-btn-active-color:#04192f; --bs-btn-active-border-color:#c4d3db;
  font-weight:700;
}
.link-primary{color:#08745f!important}
.text-brand{color:var(--green)!important}
.bg-navy{background:var(--navy)!important}

/* ---- 2. Base + typography ------------------------------------------ */
html{scroll-behavior:smooth}
body{background:#fff;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
h1,h2,h3,h4{letter-spacing:-.02em}
h1{font-size:clamp(2.2rem,5vw,4rem);line-height:1.06;font-weight:800}
h2{font-size:clamp(1.55rem,3vw,2.3rem);line-height:1.18;font-weight:800}
h3{font-size:1.25rem;font-weight:800;line-height:1.25}
a{text-underline-offset:.18em}
img,svg{max-width:100%}
:focus-visible{outline:2px solid var(--green);outline-offset:2px;border-radius:.35rem}

/* Shared width helper (parity with the old reading rail) */
.te-reading{max-width:53.75rem}

.te-eyebrow{display:inline-flex;margin-bottom:.7rem;color:var(--green);
  font-size:.78rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase}
.te-lead{font-size:clamp(1.06rem,1.9vw,1.28rem);color:#3c4d5a;line-height:1.55}

/* Skip link */
.te-skip-link{position:absolute;left:1rem;top:-6rem;z-index:2000;background:#fff;
  padding:.75rem 1rem;border-radius:.5rem;box-shadow:var(--te-shadow-md)}
.te-skip-link:focus{top:1rem}

/* Section rhythm: reuse everywhere instead of ad-hoc padding. */
.te-section{padding:clamp(2.75rem,6vw,4rem) 0}
.te-section--soft{background:var(--soft)}
.te-section--head{padding-top:clamp(2.5rem,5vw,3rem);padding-bottom:1.5rem}
.te-section__head{max-width:44rem;margin-bottom:2rem}

/* ---- 3. Header / navbar ------------------------------------------- */
/* NAV-001: utility bar -- var(--navy) reused verbatim (the exact
   footer background token, .te-footer{background:var(--navy)} below),
   not an approximation. Not sticky (only .te-header is), so it scrolls
   away and the primary nav pins at the very top -- the common,
   expected pattern for a lower-frequency secondary bar. */
.te-utilitybar{background:var(--navy)}
.te-utilitybar__nav{display:flex;align-items:center;justify-content:flex-end;gap:1.25rem;
  margin:0;padding:.5rem 0;list-style:none}
.te-utilitybar__nav a{color:#c3d2dc;font-size:.82rem;font-weight:700;text-decoration:none}
.te-utilitybar__nav a:hover,.te-utilitybar__nav a:focus,.te-utilitybar__nav a[aria-current=page]{color:#fff}
.te-utilitybar__search{border:1px solid rgba(255,255,255,.3);border-radius:.4rem;padding:.3rem .7rem}
.te-utilitybar__search:hover,.te-utilitybar__search:focus{border-color:#fff}
.te-nav__divider{margin:.4rem .8rem;border-color:var(--line);opacity:1}

.te-header{position:sticky;top:0;z-index:1030;border-bottom:1px solid var(--line);
  background:rgba(255,255,255,.96);backdrop-filter:blur(12px)}
.te-brand{display:inline-flex;align-items:center;gap:.7rem;color:var(--navy);
  font-size:1.2rem;font-weight:800;text-decoration:none}
.te-brand__logo{display:block;height:2.75rem;width:auto;max-width:100%}
@media (max-width:400px){.te-brand__logo{height:2.4rem}}
.te-brand--footer .te-brand__logo{height:3rem}
.te-nav .nav-link{padding:.55rem .72rem;border-radius:.45rem;color:#405361;
  font-size:.92rem;font-weight:700}
.te-nav .nav-link:hover,.te-nav .nav-link:focus{background:var(--soft);color:var(--navy)}
.te-nav .nav-link[aria-current=page]{background:var(--soft);color:var(--navy)}
.te-nav .te-search-link{border:1px solid var(--line)}
.navbar-toggler{border-color:var(--line);color:var(--navy);padding:.4rem .55rem}
.navbar-toggler:focus{box-shadow:var(--te-ring)}

/* Mobile: the collapsed nav overlays the page (absolute) instead of pushing
   the header content down. Below the lg breakpoint (992px) only. */
@media (max-width:991.98px){
  .te-header .navbar-collapse{
    position:absolute;top:100%;left:0;right:0;
    padding:.75rem 1rem 1rem;
    background:#fff;border-bottom:1px solid var(--line);
    box-shadow:var(--te-shadow-lg);
    max-height:calc(100vh - 4.75rem);overflow-y:auto;
  }
  .te-header .navbar-nav{gap:.15rem}
  .te-header .te-nav .nav-link{display:block;padding:.7rem .8rem}
}

/* ---- 4. Hero ------------------------------------------------------- */
/* CALC-018 (revised): gradient now sits on BOTH sides -- founder
   feedback after seeing the left-only version was that having it on
   both sides reads better. Each side is its own radial-gradient layer
   at the same .17 intensity (raised from the original single-sided
   .14, ~20% more), so it's symmetric rather than one side stacking on
   top of the other. Still a light wash, not a shift toward a strong/
   saturated green -- var(--green)'s raw rgb(8,116,95) is kept, only
   its opacity moved. Applied identically to .te-council-hero below,
   which duplicates this declaration on purpose (see that rule's own
   comment) to stay pixel-identical with this one. */
.te-hero{padding:clamp(3rem,8vw,6rem) 0;
  background:radial-gradient(circle at 10% 5%,rgba(8,116,95,.17),transparent 31rem),
             radial-gradient(circle at 90% 5%,rgba(8,116,95,.17),transparent 31rem),
             linear-gradient(180deg,#f9fbfc,#fff);
  border-bottom:1px solid #edf1f4}
.te-trust-card{position:relative;padding:1.5rem;border-radius:var(--te-radius-lg);background:var(--navy);color:#d7e2ea;overflow:hidden}
.te-trust-card h2{color:#fff;font-size:1.3rem}
.te-trust-card ul{padding-left:1.15rem;margin:0}
.te-trust-card li{margin:.35rem 0}
.te-trust-card__icon{position:absolute;top:1rem;right:1rem;width:3.4rem;height:3.4rem;
  display:grid;place-items:center;border-radius:50%;background:rgba(255,255,255,.08);color:rgba(255,255,255,.5)}

/* ---- 5. Cards (directory / home) ---------------------------------- */
.te-card{position:relative;height:100%;padding:1.5rem;border:1px solid var(--line);
  border-radius:var(--te-radius-lg);background:#fff;box-shadow:var(--te-shadow-sm);
  transition:box-shadow .18s ease,transform .18s ease,border-color .18s ease}
.te-card:hover{transform:translateY(-2px);box-shadow:var(--te-shadow-md);border-color:#c4d3db}
.te-card h3{margin:.1rem 0 .5rem}
.te-card a{color:inherit;text-decoration:none}
.te-card__link::after{content:"";position:absolute;inset:0}
.te-card__icon{display:grid;place-items:center;width:2.6rem;height:2.6rem;margin-bottom:1rem;
  border-radius:.7rem;background:var(--mint);color:var(--green);font-weight:800}
.te-card--soon{background:var(--soft);border-style:dashed;box-shadow:none}
.te-card--soon:hover{transform:none;box-shadow:none;border-color:var(--line)}
.te-card__cta{display:inline-block;margin-top:.75rem;font-weight:700;font-size:.9rem;color:var(--green)}
.te-card:hover .te-card__cta{text-decoration:underline}

/* CALC-014: reuses .te-note's 4px left-border shape (site.css above),
   but NOT its colour -- .te-note is always paired with var(--green)/
   var(--mint), which already means "positive result" sitewide
   (UI-008a/b). A neutral three-way group indicator (England/Wales/
   Scotland, no ranking implied) needs the site's genuinely neutral
   colour instead: var(--navy), the brand colour used for chrome
   (headings, footer, active nav state), never for sentiment. Same
   navy on all three cards -- no gradient, no per-card variation. */
.te-card--accent{border-left:4px solid var(--navy)}

/* CALC-014: the hub's "jump to your council" typeahead was rendering
   narrower than its .te-search row. The actual flex item inside
   .te-search is .te-selectwrap (the typeahead's generated .te-typeahead
   wrapper is inserted as ITS child, not a direct child of .te-search --
   see the "beforebegin" insertion in assets/js/site.js), and
   .te-selectwrap itself has no width rule (display:block, shrinks to
   content), so flex:1 on the typeahead alone did nothing: its actual
   containing block was never given room to grow. Growing .te-selectwrap
   and then filling it is what the row's other children already do. */
.te-search .te-selectwrap{flex:1}
.te-search .te-typeahead{width:100%}
.te-search .te-typeahead .te-input{width:100%}

/* Category browse section: a fixed min-height on the description box
   (sized to the longest of the 4 category descriptions, measured directly
   at the live column width) so every column's link list starts at the
   same vertical position, regardless of how many lines its own
   description wraps to. Not flex-stretched: growing the box to fill
   leftover row height (itself driven by the longest LINK list) would
   misalign the very thing this is meant to fix. */
.te-catnav__col{display:flex;flex-direction:column}
.te-catnav__col .te-note{min-height:10.5rem}
@media (max-width:575.98px){.te-catnav__col .te-note{min-height:0}}

/* UI-009: at the 4-column breakpoint (col-lg-3), each column was only
   ~285px wide inside the standard Bootstrap .container (max-width
   1140px at lg/xl) -- narrow enough that 7 of the 16 calculator names
   wrapped onto a second line at a common 1280px desktop width, not just
   the two the founder screenshotted. Two levers, both scoped to this
   section only (.te-linklist is shared by 16+ other pages, so nothing
   here touches it elsewhere):
     1. Raise the container's max-width to 1320px (Bootstrap's own XXL
        container width, not a new arbitrary number) -- widens each
        column to ~316px without changing the 4-columns-per-row shape
        (still exactly one column per category).
     2. Reduce the link font-size slightly (1rem -> .88rem, sm+ only --
        mobile is already a single full-width column with no wrapping
        problem, so left untouched there).
   Together these bring 15 of 16 names onto one line; only "UK Employed
   and Self-Employed Tax Calculator" (46 characters, the single longest
   calculator name on the site) still wraps -- confirmed no further
   reasonable font/width change clears it without shrinking every other
   (already-fitting) name past a comfortable size. It now wraps as a
   normal, evenly-spaced two-line item instead of a cramped one. */
.te-catnav .container{max-width:1320px}
.te-catnav .te-linklist{gap:.85rem}
@media (min-width:576px){
  .te-catnav .te-linklist a{font-size:.88rem}
}
.te-card--soon h3{color:var(--muted)}
.te-meta{display:inline-flex;align-items:center;gap:.4rem;font-size:.8rem;font-weight:700;color:var(--muted)}
.te-meta--live{color:var(--green)}
.te-meta--live::before{content:"";width:.5rem;height:.5rem;border-radius:50%;background:var(--green)}

/* ---- 6. Search box ------------------------------------------------- */
.te-search{display:flex;gap:.7rem;padding:.7rem;border:1px solid var(--line);
  border-radius:var(--te-radius-lg);background:#fff;box-shadow:var(--te-shadow-md)}
.te-search input{flex:1;border:0;padding:.65rem .8rem;font:inherit;min-width:0;background:transparent}
.te-search input:focus{outline:0}

/* ---- 7. Breadcrumb ------------------------------------------------- */
.te-breadcrumb{padding:1.1rem 0}
.te-breadcrumb .breadcrumb{margin:0;font-size:.88rem;--bs-breadcrumb-divider-color:var(--muted);
  --bs-breadcrumb-item-active-color:var(--navy)}
.te-breadcrumb .breadcrumb-item a{color:var(--muted);text-decoration:none}
.te-breadcrumb .breadcrumb-item a:hover{color:var(--green);text-decoration:underline}
.te-breadcrumb .breadcrumb-item.active{color:var(--navy);font-weight:700}

/* ---- 8. Calculator: panels + form --------------------------------- */
/* CALC-026d: .te-section--data (the council-tax page tier system's
   "Tier 2 / data" class) is a pure alias of .te-panel -- the site's
   EXISTING card look, not a second implementation of the same look.
   See the tier-system doc comment further down this file. */
.te-panel,.te-section--data{padding:clamp(1.4rem,3vw,2rem);border:1px solid var(--line);
  border-radius:var(--te-radius-lg);background:#fff;box-shadow:var(--te-shadow-sm)}
.te-panel--step{height:100%}
/* Input form is a grid inside a height-stretched column (matching the
   result card's height when it's taller, e.g. calculators with few
   inputs but a long breakdown). Without this, CSS Grid's default
   align-content distributes any leftover height INTO each step panel,
   stretching them apart. align-content:start collects any leftover
   height as one gap after the form instead, leaving each step panel at
   its natural content height. No effect when the input side is already
   the taller column (the common case) — there's no leftover height to
   redistribute either way. */
.te-calc__form{align-content:start}
/* UI-006: sticky Calculate button (opt-in via 'sticky_submit'=>true).
   Constrained to .te-calc__form's own box, so it cannot drift past the
   input column into the results column or the footer. Reverts to normal
   inline flow below a minimum viewport height so it never overlaps
   short/landscape-mobile content. */
.te-calc__submit-sticky{position:sticky;bottom:1rem;z-index:5;background:#fff;
  padding-top:.5rem}
@media (max-height:600px){
  .te-calc__submit-sticky{position:static;padding-top:0}
}
.te-step__head{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1.4rem}
.te-step__title{display:flex;align-items:center;gap:.7rem;margin:0;font-size:clamp(1.3rem,2.4vw,1.6rem)}
.te-step__num{display:grid;place-items:center;flex:none;width:2rem;height:2rem;border-radius:50%;
  background:var(--navy);color:#fff;font-size:.95rem;font-weight:800;line-height:1}
.te-textbtn{border:0;background:none;color:var(--green);font:inherit;font-weight:800;
  font-size:.92rem;cursor:pointer;padding:.35rem .5rem;border-radius:.45rem}
.te-textbtn:hover{color:var(--green2);text-decoration:underline}

.te-label{display:block;font-size:.9rem;font-weight:800;color:var(--navy);margin-bottom:.4rem}
.te-hint{display:block;font-size:.84rem;color:var(--muted);margin-top:.4rem;line-height:1.4}
/* CALC-011f: readable-size variant for a .te-hint that carries a genuinely
   important point, not a minor aside -- e.g. the instalment explainer,
   which the founder specifically wants legible at a glance, not squinted
   at. Body copy size (1rem) instead of .84rem, and --ink instead of the
   muted grey, while staying visually distinct from .te-lead (the page's
   own top-level intro, larger and bolder again). Opt-in only: every
   other .te-hint on the site is untouched. */
.te-hint--callout{font-size:1rem;color:var(--ink);line-height:1.55}
/* CALC-011c: soft, non-blocking caution variant of .te-hint -- same amber
   palette already used for Financial Snapshot's warning insight, made
   generic here so any calculator can opt into it. Never blocks or hides
   the result it sits above; it's a "double-check this" nudge, not a
   validation error. */
.te-hint--warning{color:#7a4a12;background:#fdf4e7;border-left:3px solid #b45309;
  padding:.5rem .7rem;border-radius:.3rem}

/* UI-006: icon-triggered hint tooltips (opt-in via 'hint_mode'=>'tooltip') */
.te-label-row{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.4rem}
.te-label-row .te-label{margin-bottom:0}
.te-infobtn{flex:none;width:44px;height:44px;margin:-.5rem -.5rem -.5rem 0;display:inline-flex;
  align-items:center;justify-content:center;border:0;background:none;border-radius:50%;cursor:pointer;
  color:var(--muted)}
.te-infobtn span{display:grid;place-items:center;width:1.3rem;height:1.3rem;border-radius:50%;
  border:1.5px solid currentColor;font:italic 700 .78rem/1 Georgia,serif}
.te-infobtn:hover,.te-infobtn[aria-expanded="true"]{color:var(--green)}
.te-infobtn:focus-visible{outline:2px solid var(--green);outline-offset:2px}
/* Visually hidden until toggled open, but always present for AT via
   aria-describedby on the field — do not use display:none/hidden here. */
.te-hint--tooltip{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0}
.te-hint--tooltip.is-open{position:static;width:auto;height:auto;padding:0;margin-top:.4rem;
  overflow:visible;clip:auto;white-space:normal;border:0}

/* UI-006: instant pension-arrangement feedback line */
.te-pension-feedback{display:block;font-size:.84rem;color:var(--navy);font-weight:700;
  margin-top:.6rem;line-height:1.4;min-height:1.2em}
.te-input,.te-select{width:100%;min-height:3rem;padding:.7rem .8rem;border:1px solid #cfd9df;
  border-radius:.6rem;background:#fff;color:var(--ink);font:inherit;
  transition:border-color .18s ease,box-shadow .18s ease}
.te-input:focus,.te-select:focus{outline:0;border-color:var(--green);box-shadow:var(--te-ring)}

/* Prefixed/suffixed number inputs */
.te-inputgroup{display:flex;align-items:stretch;border:1px solid #cfd9df;border-radius:.6rem;
  background:#fff;overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease}
.te-inputgroup:focus-within{border-color:var(--green);box-shadow:var(--te-ring)}
.te-inputgroup__prefix,.te-inputgroup__suffix{display:grid;place-items:center;padding:0 .85rem;
  background:var(--soft);color:var(--muted);font-weight:800}
.te-inputgroup__prefix{border-right:1px solid #e2e9ee}
.te-inputgroup__suffix{border-left:1px solid #e2e9ee}
.te-input--prefixed,.te-input--suffixed{border:0;border-radius:0;min-height:3rem;flex:1;min-width:0}
.te-input--prefixed:focus,.te-input--suffixed:focus{box-shadow:none}

/* Custom select caret */
.te-selectwrap{position:relative;display:block}
.te-selectwrap::after{content:"";position:absolute;right:1rem;top:50%;width:.6rem;height:.6rem;
  margin-top:-.42rem;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);
  transform:rotate(45deg);pointer-events:none}
.te-selectwrap .te-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;
  padding-right:2.6rem;text-overflow:ellipsis}

.te-note{padding:1rem 1.1rem;border-left:4px solid var(--green);background:var(--mint);border-radius:.4rem}
.te-note--sm{font-size:.86rem;padding:.75rem .9rem;background:#fff8ec;border-left-color:#e2a63b;color:#6a531f}
/* ARCH-001: fallback notice sits inside the dark .te-footer, before the
   brand row -- only rendered on the rare day a tax-year fallback fires. */
.te-footer__year-notice{margin-bottom:2rem}
/* BOE-001: the Bank Rate notice carries a link; the footer's own pale link
   colour (#e8eef2, built for the dark navy footer) measured 1.11:1 on this
   cream notice. Navy is 16.78:1 here, underlined so it reads as a link.
   Two-class selector because `.te-footer a` (and its :hover, which turns
   links white) is defined further down this file and would win a
   single-class tie on source order. */
.te-footer .te-footer__year-notice a,
.te-footer .te-footer__year-notice a:hover{color:var(--navy);text-decoration:underline}

/* ---- 9. Results: headline, tabs, breakdown ------------------------ */
.te-headline{padding:1.4rem 1.5rem;border-radius:var(--te-radius-lg);
  background:linear-gradient(155deg,#e9f7f2,#dff3ec);border:1px solid #c9e8de}
.te-headline__label{display:block;color:#3d6a5f;font-size:.9rem;font-weight:700;margin-bottom:.35rem}
.te-headline__value{color:var(--green);font-size:clamp(2.4rem,6vw,3.25rem);font-weight:900;
  line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.te-headline__sub{display:block;margin-top:.5rem;color:#4d6f66;font-size:.95rem;font-weight:600}
/* UI-008a: semantic result variants, driven by $def['result_sentiment']
   on a calculator's definition (see render_calculator_page() below) --
   absent that key, .te-headline renders exactly as before (the default
   above is the "positive" look), so every calculator that doesn't set
   it is byte-for-byte unaffected. --cost reuses var(--error), the same
   token already used for deduction rows (.te-breakdown__row--deduction
   dd), not a new palette. --positive is the same default green,
   defined explicitly so a calculator can opt in on purpose rather than
   relying on "absence means green". */
.te-headline--cost{background:linear-gradient(155deg,#fbeae8,#f8ded9);border-color:#f0c4be}
.te-headline--cost .te-headline__label{color:#7c2c22}
.te-headline--cost .te-headline__value{color:var(--error)}
.te-headline--cost .te-headline__sub{color:#7c2c22}
.te-headline--positive{background:linear-gradient(155deg,#e9f7f2,#dff3ec);border-color:#c9e8de}
.te-headline--positive .te-headline__label{color:#3d6a5f}
.te-headline--positive .te-headline__value{color:var(--green)}
.te-headline--positive .te-headline__sub{color:#4d6f66}

/* UI-008a: cost/positive modifiers for an individual take-home-
   comparison bar row. Deliberately NOT the same classes as
   .te-bar__fill--tax/--net/--ni/--pension, which are the SHARED
   composition-bar suffixes other calculators' own Income Tax/NI/
   pension bars use (calculator_render_bars() below) -- reusing those
   would recolour bars on every other calculator too. These are new,
   uniquely-named classes used only by Council Tax's own two take-home
   comparison widgets (the interactive calculator's left_column_extra
   and the per-council page's inline JS widget). */
.te-bar--cost .te-bar__head{color:var(--error)}
.te-bar--cost .te-bar__fill{background:var(--error)}
.te-bar--positive .te-bar__head{color:var(--green)}
.te-bar--positive .te-bar__fill{background:var(--green)}

.te-tabs{display:grid;grid-template-columns:repeat(4,1fr);gap:.4rem}
.te-tab{min-height:2.9rem;padding:.55rem .4rem;border:1px solid var(--line);border-radius:.6rem;
  background:#fff;color:var(--navy);font:inherit;font-weight:800;font-size:.92rem;cursor:pointer;
  transition:background .15s ease,color .15s ease,border-color .15s ease}
.te-tab:hover{border-color:#bad2cb;background:var(--soft)}
.te-tab.is-active{background:var(--navy);border-color:var(--navy);color:#fff}
.te-tab:focus-visible{outline:2px solid var(--green);outline-offset:2px}

.te-breakdown{margin:0}
.te-breakdown__row{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;
  padding:.85rem 0;border-top:1px solid var(--line)}
.te-breakdown__row dt{color:var(--muted);font-weight:600;margin:0}
.te-breakdown__row dd{margin:0;color:var(--navy);font-weight:800;font-variant-numeric:tabular-nums}
.te-breakdown__row--total{border-top:2px solid var(--navy);margin-top:.25rem}
.te-breakdown__row--total dt{color:var(--navy);font-weight:800;font-size:1.05rem}
.te-breakdown__row--total dd{color:var(--green);font-size:1.25rem}
.te-breakdown__row--deduction dd{color:var(--error)}
.te-breakdown__row--positive dd{color:var(--green)}

/* Composition bars */
.te-bars{display:grid;gap:.9rem}
.te-bar__head{display:flex;justify-content:space-between;font-size:.82rem;font-weight:700;
  color:var(--muted);margin-bottom:.3rem}
.te-bar__track{height:.55rem;border-radius:999px;background:var(--soft);overflow:hidden}
.te-bar__fill{display:block;height:100%;border-radius:999px}
.te-bar__fill--net{background:var(--green)}
.te-bar__fill--tax{background:var(--navy)}
.te-bar__fill--ni{background:#4a7d97}
.te-bar__fill--pension{background:#9db8c6}

/* Employer cost + effective rate */
.te-employer{padding:1.2rem 1.4rem;border-radius:var(--te-radius-lg);background:var(--navy);color:#d7e2ea;height:100%}
.te-employer__row{display:flex;justify-content:space-between;gap:1rem;padding:.4rem 0}
.te-employer__row strong{color:#fff;font-variant-numeric:tabular-nums}
.te-effective{padding:1.15rem 1.4rem;border-radius:var(--te-radius-lg);background:var(--soft);border:1px solid var(--line);height:100%}
.te-effective__row{display:flex;justify-content:space-between;align-items:center;gap:1rem}
.te-effective strong{color:var(--navy);font-size:1.25rem;font-variant-numeric:tabular-nums}
.te-effective__note{margin:.6rem 0 0;font-size:.85rem;color:var(--muted)}
.te-effective--insight{background:var(--mint)}
.te-effective--insight .te-effective__row span{color:var(--ink)}
.te-effective--insight .te-effective__note{color:var(--ink)}

.te-subhead{display:flex;align-items:center;gap:.6rem;margin:0 0 1rem;font-size:1.4rem;
  font-weight:800;color:var(--navy)}
.te-result-meta{margin:0;font-size:.82rem;color:var(--muted)}

/* ---- 10. Explanation / FAQ ---------------------------------------- */
.te-faq details{border-top:1px solid var(--line)}
.te-faq details:last-child{border-bottom:1px solid var(--line)}
.te-faq summary{padding:1.15rem 2rem 1.15rem 0;position:relative;cursor:pointer;
  font-weight:800;color:var(--navy);list-style:none}
.te-faq summary::-webkit-details-marker{display:none}
.te-faq summary::after{content:"";position:absolute;right:.25rem;top:50%;width:.55rem;height:.55rem;
  margin-top:-.4rem;border-right:2px solid var(--green);border-bottom:2px solid var(--green);
  transform:rotate(45deg);transition:transform .18s ease}
.te-faq details[open] summary::after{transform:rotate(-135deg)}
.te-faq summary:focus-visible{outline:2px solid var(--green);outline-offset:3px;border-radius:.35rem}
.te-faq details>div{padding:0 0 1.25rem;color:#4d606e;line-height:1.6}

/* UI-006: collapsible calculator card section, same interaction pattern
   as .te-faq above (native <details>, keyboard-operable by default). */
.te-collapsible-section summary{padding:.15rem 2rem .15rem 0;position:relative;cursor:pointer;
  color:var(--muted);font-size:.92rem;list-style:none}
.te-collapsible-section summary::-webkit-details-marker{display:none}
.te-collapsible-section summary::after{content:"";position:absolute;right:.25rem;top:50%;
  width:.5rem;height:.5rem;margin-top:-.35rem;border-right:2px solid var(--green);
  border-bottom:2px solid var(--green);transform:rotate(45deg);transition:transform .18s ease}
.te-collapsible-section[open] summary::after{transform:rotate(-135deg)}
.te-collapsible-section summary:focus-visible{outline:2px solid var(--green);outline-offset:3px;
  border-radius:.35rem}
.te-collapsible-section[open] summary{margin-bottom:1rem}
.te-compare-all{margin-top:.6rem}
.te-compare-all summary{font-size:.84rem;font-weight:700;color:var(--green)}
.te-compare-all>div{padding-top:.4rem;font-size:.84rem;color:var(--muted);line-height:1.4}

/* UI-007: Income Tax band-by-band breakdown, reusing the same
   .te-collapsible-section pattern as UI-006's "Compare all three". */
.te-band-breakdown-wrap{margin-top:-.3rem}
.te-band-breakdown summary{font-size:.8rem;font-weight:700;color:var(--green)}
.te-band-breakdown>div{padding-top:.3rem}
.te-band-breakdown>div p{margin:0 0 .3rem;font-size:.82rem;color:var(--muted);line-height:1.4}
.te-band-breakdown>div p:last-child{margin-bottom:0}

/* ---- 11. Link lists / related / CTA ------------------------------- */
.te-linklist{margin:0;padding:0;list-style:none;display:grid;gap:.65rem}
.te-linklist a{display:inline-flex;align-items:center;gap:.4rem;color:var(--navy);font-weight:700;text-decoration:none}
.te-linklist a::before{content:"\2192";color:var(--green);font-weight:800}
.te-linklist a:hover{color:var(--green)}
.te-cta-card{padding:1.6rem;border-radius:var(--te-radius-lg);background:var(--navy);color:#d7e2ea;height:100%}
.te-cta-card h2{color:#fff;font-size:1.35rem}
.te-cta-card p{margin:0 0 1.2rem}

/* Hero-adjacent CTA card (SEO-004 value pages): a lighter, tinted
   highlight box for the hero's primary action, distinct from the dark
   .te-cta-card cross-sell used lower on the page. */
.te-hero-cta{padding:1.6rem;border-radius:var(--te-radius-lg);background:var(--mint);border:1px solid #cdeee2;height:100%}
.te-hero-cta__title{font-size:1.15rem;color:var(--navy);margin:0 0 .5rem}
.te-hero-cta__text{color:var(--ink);font-size:.92rem;margin:0 0 1.1rem}
.te-hero-cta__btn{width:100%}

/* Multi-link variant (SEO-005 country guides): used where the hero
   points to several equally relevant calculators rather than one, so
   three flat buttons would compete for attention. Each link is its
   own clearly bounded row on a white surface against the tinted card,
   giving distinct, evenly spaced targets instead of a dense block of
   colour. Kept in the same family as .te-hero-cta (same padding/
   radius/background), just swapping the single button for a list. */
.te-hero-cta__links{list-style:none;margin:0;padding:0;display:grid;gap:.6rem}
.te-hero-cta__link{display:flex;align-items:center;justify-content:space-between;gap:.75rem;
  padding:.75rem 1rem;background:#fff;border:1px solid #cdeee2;border-radius:var(--te-radius);
  color:var(--navy);font-weight:700;font-size:.92rem;text-decoration:none;line-height:1.3}
.te-hero-cta__link:hover,.te-hero-cta__link:focus-visible{border-color:var(--green);color:var(--green)}
.te-hero-cta__link::after{content:"\2192";color:var(--green);font-weight:800;flex:0 0 auto}

/* ---- 12. Trust block (Official sources / Reviewed / Disclaimer) --- */
.te-trustblock__sources h2{font-size:1.2rem;margin:0 0 .75rem}
.te-trustblock__sources .te-linklist a[target=_blank]::after{content:"\2197";margin-left:.3rem;font-size:.85em;color:var(--muted)}
.te-reviewed{margin:0;font-size:.9rem;color:var(--muted)}
.te-reviewed time{font-weight:700;color:#40515e}
.te-disclaimer{margin:0;padding:1rem 1.25rem;background:#fff;border:1px solid var(--line);
  border-radius:var(--te-radius);font-size:.86rem;color:#4a5a66;line-height:1.55}

/* ---- 13. Tables (tax rates) --------------------------------------- */
.te-table-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--te-radius)}
.te-table-wrap table{margin:0}
/* CALC-011b: overflow-x:auto with overflow-y unset gets computed to
   overflow-y:auto too (CSS Overflow spec's visible/non-visible coupling
   rule), which was producing a 1px phantom vertical scrollbar on the
   Council Tax full band table (8-9 rows, no genuine overflow). Desktop
   has no need for either scroll axis on that table, so pin both to
   visible above the mobile breakpoint; overflow-x:auto (the shared
   responsive-table convention) is left untouched below it. */
@media (min-width:992px){
  .te-table-wrap--full{overflow:visible}
}
.te-table-wrap th{background:var(--soft);color:var(--navy)}
/* CALC-018 (round 4): the two instalment columns get their own gradient
   treatment -- light blue for "10 months", deep navy-blue for "12
   months". Deliberately NOT green for either: paying over 10 vs 12
   months is not a better/worse choice (same total either way, only the
   payment size differs -- the exact point CALC-011d's instalment copy
   already makes), and green already means "positive outcome" everywhere
   else on this site, so it would falsely imply one option is
   preferable. Navy was chosen specifically because it carries no such
   meaning anywhere on the site. The deep navy column needs white text
   to stay readable against its own dark background -- navy-on-navy
   would be illegible. No left border on either column; the gradient
   itself is the separator. The "Band" column (.te-col-band, both the
   header cell and every row's row-header) is explicit solid white +
   navy text -- round 3 used `background:transparent` here, meaning it
   showed whatever sits BEHIND the table (this table always sits inside
   a .te-section--soft band), which read as an unwanted tint rather
   than "no background". Explicit #fff matches the plain white the rest
   of the table (e.g. "Annual Council Tax") already uses, so the Band
   column reads as ordinary table surface, not a stray colour.
   Specificity note: Bootstrap's own ".table > :not(caption) > * > *
   {background-color:var(--bs-table-bg)}" rule outranks a bare single
   class, so every rule here needs the .te-table-wrap ancestor + element
   type to actually win the cascade. */
.te-table-wrap th.te-col-band,
.te-table-wrap td.te-col-band{background:#fff;color:var(--navy)}
.te-table-wrap td.te-col-10mo,
.te-table-wrap th.te-col-10mo{background:linear-gradient(135deg,#f3faff,#bfe1fb);color:var(--navy)}
.te-table-wrap td.te-col-12mo,
.te-table-wrap th.te-col-12mo{background:linear-gradient(135deg,#215c88,#04192f);color:#fff}
.te-table-wrap tbody tr:hover td,
.te-table-wrap tbody tr:hover th{background:var(--soft)}
.te-table-wrap tbody tr:hover td.te-col-band,
.te-table-wrap tbody tr:hover th.te-col-band{background:#fff}
.te-table-wrap tbody tr:hover td.te-col-10mo,
.te-table-wrap tbody tr:hover th.te-col-10mo{background:linear-gradient(135deg,#dcedfc,#a6d2f8);color:var(--navy)}
.te-table-wrap tbody tr:hover td.te-col-12mo,
.te-table-wrap tbody tr:hover th.te-col-12mo{background:linear-gradient(135deg,#2c6d9e,#0a2540);color:#fff}
/* CALC-011: highlights the selected band row in the full Council Tax
   band table. Bold text + a left border, never colour alone, so the
   selection is clear without relying on colour perception. CALC-018:
   .te-col-band now defaults to a plain white background (see above),
   which would otherwise erase this highlight on the row-header cell
   specifically -- restored here with higher specificity so the
   selected row still reads clearly in that column too. */
.te-current-band{background:var(--mint)}
.te-current-band th{background:var(--mint);border-left:3px solid var(--green);font-weight:800}
.te-table-wrap .te-current-band th.te-col-band{background:var(--mint)}

/* CALC-020/021: year-over-year Council Tax comparison. Reuses CALC-018's
   light-blue/deep-navy pair (the "genuinely neutral" colours already
   chosen there specifically to avoid --error/--green implying one
   option is better) -- an increase here is a comparison fact, not a
   new cost, so it gets the same neutral treatment, not a red alarm
   colour. CALC-023: deliberately MUTED versions of those same two
   colours, not the full-intensity pair the primary band table above
   uses -- this table is secondary content, and reusing the exact same
   strong gradient made it compete with the primary table rather than
   sit behind it in visual hierarchy. Muted current-year stop
   (#4d7089) was contrast-checked against white text at 5.26:1,
   comfortably clearing WCAG AA (4.5:1) for normal-size text -- picked
   specifically so "quieter" doesn't also mean "unreadable". Change/
   Change % columns are NOT touched here -- they keep full --error
   intensity elsewhere in this file, that's the actual headline
   insight this table delivers. */
.te-col-yoy-prior{background:linear-gradient(135deg,#f8fbfe,#e4f0fa);color:var(--navy)}
.te-col-yoy-current{background:linear-gradient(135deg,#4d7089,#22384a);color:#fff}
.te-table-wrap td.te-col-yoy-prior,
.te-table-wrap th.te-col-yoy-prior{background:linear-gradient(135deg,#f8fbfe,#e4f0fa);color:var(--navy)}
.te-table-wrap td.te-col-yoy-current,
.te-table-wrap th.te-col-yoy-current{background:linear-gradient(135deg,#4d7089,#22384a);color:#fff}
/* CALC-021: hover-contrast fix (CALC-018 established the same pattern
   for .te-col-10mo/12mo) -- without this, the generic
   ".te-table-wrap tbody tr:hover td{background:var(--soft)}" rule wins
   on hover and leaves light text on a light background. Hover states
   darken slightly within the same muted family established above. */
.te-table-wrap tbody tr:hover td.te-col-yoy-prior,
.te-table-wrap tbody tr:hover th.te-col-yoy-prior{background:linear-gradient(135deg,#eef6fc,#cfe4f5);color:var(--navy)}
.te-table-wrap tbody tr:hover td.te-col-yoy-current,
.te-table-wrap tbody tr:hover th.te-col-yoy-current{background:linear-gradient(135deg,#5b83a0,#182c3a);color:#fff}

/* CALC-021: the YoY section gets a bit more visual weight so it doesn't
   read as buried a second time after someone jump-links to it -- same
   navy left-border accent CALC-014 already established as genuinely
   neutral (no sentiment), not a new colour. scroll-margin-top matches
   the sticky-header offset already used for every other anchor target
   on the site (CALC-017's fix, same value). */
/* White, not --soft: this renders inside a .te-section--soft band on
   individual council pages but inside a white .te-panel on the
   calculator -- var(--soft) would repeat CALC-018's original mistake
   of blending into an already-soft ambient background on one of the
   two surfaces. White reads as a clear card on both. */
#yoy-comparison{scroll-margin-top:6rem;padding:1.25rem 1.4rem;border-left:4px solid var(--navy);
  background:#fff;border-radius:var(--te-radius-lg);box-shadow:var(--te-shadow-sm)}
#full-band-table{scroll-margin-top:6rem}
/* CALC-023: default h2 scale (clamp up to ~2.3rem) overflows/wraps
   awkwardly on mobile for longer council names ("Bournemouth,
   Christchurch and Poole 2026/27" etc), now that the year is appended
   too (item 2). Scoped to this one heading, not a change to the
   shared h2 rule used everywhere else. */
@media (max-width:575.98px){
  #full-band-table{font-size:1.4rem}
}
/* CALC-022: was two plain arrow-prefixed text links (font-weight:700,
   green arrow) -- founder feedback was these didn't read as real
   actions. Now real buttons (homepage's own .btn-primary/.btn-lg and
   .btn-outline-secondary/.btn-lg, reused verbatim), so the old
   link-specific decoration is removed; only the row layout remains. */
.te-hero-jumplinks{display:flex;flex-wrap:wrap;gap:.7rem}

/* CALC-022: the <summary> now reads as a genuine section heading --
   same size/weight scale as every real <h2> on this page family
   (clamp matches the shared h2 rule), navy, same colour as other
   headings. The native <details>/<summary> element and its chevron
   marker (site.css, .te-collapsible-section summary above) are
   completely unchanged -- this is a visual override only, the reveal
   mechanism CALC-021 verified is untouched. */
.te-collapsible-section summary.te-yoy-summary{font-size:clamp(1.55rem,3vw,2.3rem);font-weight:800;
  color:var(--navy);line-height:1.18;letter-spacing:-.02em;padding-right:2.4rem}

.te-yoy__headline{font-size:1.15rem;font-weight:800;color:var(--navy);margin-bottom:1rem}

/* CALC-023: replaced with a real hand-authored SVG bar chart (a genuine
   axis, gridlines, height-scaled bars -- CALC-022's two plain value
   boxes had no axis at all, which was the founder's actual complaint).
   Same approach as the flagship donut: PHP builds the SVG string,
   council_tax_yoy_chart_svg() in comparison.php. Bar colour is
   RGB-interpolated across however many years exist, not a fixed
   2-colour pair, so a future 3rd+ year needs no CSS change either. */
.te-yoy__chart{display:flex;justify-content:center}
.te-yoy__svgchart{width:100%;max-width:30rem;height:auto}
.te-yoy__gridline{stroke:var(--line);stroke-width:1}
.te-yoy__axisline{stroke:var(--navy);stroke-width:1.5}
.te-yoy__axislabel{font-size:11px;fill:var(--muted);font-family:inherit}
.te-yoy__barvalue{font-size:13px;font-weight:800;fill:var(--navy);font-family:inherit}
.te-yoy__baryear{font-size:12px;font-weight:700;fill:var(--navy);font-family:inherit}

/* CALC-025: each non-first bar is segmented (base = the immediately
   preceding bar's own value/colour, cap = the increase since then, in
   --error red) with this label naming the % change beside the cap. */
.te-yoy__barpct{font-size:10px;font-weight:700;fill:#B42318;font-family:inherit}

/* CALC-022: directional change colour -- driven by the actual sign of
   the computed delta (see comparison.php), not hardcoded. An increase
   (--error) is the current state for all 350 councils; a decrease
   (--green), if one is ever present in the data, uses the exact same
   cost/positive convention already established everywhere else on the
   site (UI-008a/b). Bold, per the founder's explicit request that this
   be a stronger visual signal than the previous plain text. */
.te-table-wrap td.te-delta--up{color:var(--error);font-weight:800}
.te-table-wrap td.te-delta--down{color:var(--green);font-weight:800}

/* CALC-011: typeahead combobox overlay for a long native <select>
   ([data-typeahead]). The select itself is hidden by JS at enhancement
   time only (assets/js/site.js) -- with JS disabled the select is
   never hidden and this markup never exists, so no [hidden] CSS
   override is needed here. */
.te-typeahead{position:relative}
.te-typeahead__list{position:absolute;z-index:20;top:100%;left:0;right:0;margin:.25rem 0 0;padding:.35rem;
  list-style:none;background:#fff;border:1px solid var(--line);border-radius:.6rem;
  box-shadow:var(--te-shadow-sm);max-height:16rem;overflow-y:auto}
.te-typeahead__option{padding:.55rem .7rem;border-radius:.4rem;cursor:pointer;font-size:.92rem;min-height:44px;
  display:flex;align-items:center}
.te-typeahead__option:hover,.te-typeahead__option.is-active{background:var(--mint);color:var(--navy)}
.te-typeahead__more{padding:.5rem .7rem;font-size:.8rem;color:var(--muted);font-style:italic}

/* ---- 14. Footer ---------------------------------------------------- */
.te-footer{padding:4rem 0 1.5rem;background:var(--navy);color:#cbd7e0}
.te-footer a{color:#e8eef2;text-decoration:none}
.te-footer a:hover{color:#fff;text-decoration:underline}
.te-footer h2{font-size:1rem;color:#fff;margin-bottom:.9rem}
.te-footer .te-brand{color:#fff}
.te-footer__col{display:flex;flex-direction:column}
.te-footer__col a{margin:.5rem 0}
.te-footer__bottom{margin-top:2.5rem;padding-top:1.2rem;border-top:1px solid rgba(255,255,255,.13);font-size:.85rem}

/* Brand row: logo left, tagline right, one row, standard gap before the
   calculator grid below it. */
.te-footer__brandrow{margin-bottom:3rem}
.te-footer__brandrow p{color:#cbd7e0}

/* Footer calculator directory: one column per category, plain links,
   no border/pill/arrow. */
.te-footer__calcs h3{font-size:1rem;color:#fff;margin-bottom:.75rem}
.te-footer__col--calculators a{font-size:.875rem}

/* Standard gap before the Resources & Legal row. */
.te-footer__reslegal-row{margin-top:3rem}

/* Resources & Legal: single merged block, four columns wrapping to two rows.
   Deliberately smaller than the calculator pills (14px) -- secondary
   navigation, not the primary calculator directory -- but still well
   above any low-contrast/hard-to-read threshold. */
.te-footer__reslegal{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.5rem 1.5rem}
.te-footer__reslegal a{font-size:.75rem;margin:0}
@media (max-width:991.98px){.te-footer__reslegal{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ---- 15. Monetisation slots (reserved, no CLS) -------------------- */
.te-adslot{display:block;margin:1.5rem auto}
.te-adslot[data-ad-enabled="0"]{margin:0;border:0;background:none;min-height:0}
.te-adslot[data-ad-enabled="0"]:empty{padding:0;display:none}
.te-adslot[data-ad-enabled="1"]{border:1px dashed var(--line);border-radius:var(--te-radius);background:var(--soft)}

/* ---- 16. Motion / reduced-motion --------------------------------- */
@media (prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
}

/* ---- 17. Responsive tweaks --------------------------------------- */
@media (max-width:575.98px){
  .te-tabs{grid-template-columns:repeat(2,1fr)}
  .te-search{display:grid}
}

/* ---- 18b. Guides framework --------------------------------------- */
.te-eyebrow-link{color:inherit;text-decoration:none}
.te-eyebrow-link:hover{color:var(--green2);text-decoration:underline}
.te-guide-meta{color:var(--muted);font-size:.9rem;font-weight:600}

/* Hero band — soft gradient behind breadcrumb + title (matches home hero,
   slightly lighter). Contained to the top of the article only. */
.te-guide__hero{
  background:radial-gradient(circle at 92% 0%,rgba(8,116,95,.10),transparent 26rem),
             linear-gradient(180deg,#f7fafb,#fff);
  border-bottom:1px solid #edf1f4;
}
.te-guide__hero .te-breadcrumb{padding-top:1.4rem}
.te-guide__hero .te-section--head{padding-top:1rem;padding-bottom:clamp(1.75rem,4vw,2.5rem)}

/* Give the article top padding so it breathes below the hero band. */
.te-guide{padding-top:clamp(2rem,4vw,3rem)}

/* UI-008a (corrected): elevated hero, per-council Council Tax pages
   only. A NEW, uniquely-scoped wrapper (not .te-guide__hero, which
   Financial Snapshot/guide articles also use, and not .te-section--head,
   which every calculator's own H1 section uses) -- so this never
   touches any other page family. CORRECTION: the first version of this
   used a full navy background, on a wrong description of the homepage
   hero as navy. The homepage's .te-hero (pages/home.php) is actually a
   LIGHT background -- navy only appears inside its contained
   .te-trust-card accent card, not the hero itself. This reuses .te-hero's
   own background declaration verbatim (assets/css/site.css, the
   .te-hero rule above) so the two hero treatments are pixel-identical,
   not approximated. H1/eyebrow/lead/breadcrumb are therefore left at
   their normal dark-on-light site defaults -- no colour overrides here
   at all, matching the homepage exactly. */
.te-council-hero{padding-bottom:clamp(2.5rem,7vw,4.5rem);
  background:radial-gradient(circle at 10% 5%,rgba(8,116,95,.17),transparent 31rem),
             radial-gradient(circle at 90% 5%,rgba(8,116,95,.17),transparent 31rem),
             linear-gradient(180deg,#f9fbfc,#fff);
  border-bottom:1px solid #edf1f4}
.te-council-hero .te-breadcrumb{padding-top:1.4rem}
.te-council-hero .te-section--head{padding-top:1rem}

/* UI-008a (corrected): the take-home comparison widget now reuses
   .te-trust-card -- the EXACT same navy card the homepage's own "Built
   around trust" aside uses (background:var(--navy);color:#d7e2ea) --
   playing the identical "premium accent card sitting on the light hero"
   role here that the trust card plays there. These supplementary rules
   only ever match the form/label/hint/bar elements THIS widget adds
   inside that card; the homepage's own trust card has no such elements
   (just an <h2> and a <ul>, already styled by the pre-existing
   .te-trust-card h2/ul/li rules above), so it is completely unaffected. */
.te-trust-card .te-hero-cta__title{margin-bottom:.5rem}
.te-trust-card .te-label{color:#e8eef2}
.te-trust-card .te-hint{color:#a9bdc9}
.te-trust-card .te-hint a{color:#e8eef2}
.te-trust-card .te-hint a:hover,.te-trust-card .te-hint a:focus-visible{color:#fff}
/* .te-hint--warning keeps its own self-contained cream background and
   dark text regardless of the navy card around it -- it's a "light card
   within the navy card", not part of the surrounding navy text colour
   scheme, so the broader .te-trust-card .te-hint override above must
   not reach it (without this, the warning's original dark-brown text
   was being overridden to the same light blue-grey used elsewhere in
   this card, onto its own light cream background -- unreadable). */
.te-trust-card .te-hint--warning{color:#7a4a12}
/* The select/input controls keep their normal white backgrounds (set
   directly on .te-select/.te-input, not inherited), so they stay
   legible regardless of the card behind them -- no override needed
   there. The bar label text stays light (matching the trust card's own
   established light-text convention) rather than switching to --error/
   --green, which would be too low-contrast on navy to read as text;
   the red/green distinction instead lives in the bar FILL itself,
   brightened here specifically for navy so it still reads clearly as
   an accent (the interactive calculator's copy of this same widget
   sits on a plain white .te-panel and keeps the original --error/
   --green fill colours unchanged, since these rules are scoped under
   .te-trust-card only). */
.te-trust-card .te-bar--cost .te-bar__head,
.te-trust-card .te-bar--positive .te-bar__head{color:#d7e2ea}
.te-trust-card .te-bar--cost .te-bar__fill{background:#ff8a75}
.te-trust-card .te-bar--positive .te-bar__fill{background:#5eead4}

/* Rich link lists (title + one-line summary) — used by related components */
.te-linklist--rich{gap:.9rem}
.te-linklist--rich a{display:block;color:var(--navy);text-decoration:none}
.te-linklist--rich a::before{content:none}
.te-linklist--rich .te-linklist__title{display:block;font-weight:800;color:var(--navy)}
.te-linklist--rich .te-linklist__meta{display:block;font-size:.85rem;font-weight:500;color:var(--muted);margin-top:.15rem;line-height:1.45}
.te-linklist--rich a:hover .te-linklist__title{color:var(--green)}
.te-linklist--rich li + li{padding-top:.9rem;border-top:1px solid rgba(10,34,56,.08)}

/* CALC-016: a directory-scale link grid, used for every group on all
   three nation pages (England's "Other councils" alone reaches ~228 at
   full CALC-011 rollout; Wales and Scotland switched onto the same
   treatment too, for one consistent look across all three pages, so
   CALC-012's original .te-linklist--columns is now retired). 4 columns
   at desktop, tapering to 2 then 1 at the same breakpoints that old
   modifier used. Regular weight, not bold: at this density a whole grid
   in bold reads as visual noise, so weight is reserved for the group
   heading above it -- this override is scoped to this modifier only,
   not a site-wide link style change. */
.te-linklist--grid4{margin-bottom:1.5rem;grid-template-columns:1fr}
.te-linklist--grid4 a{font-weight:400}
@media (min-width:576px){.te-linklist--grid4{grid-template-columns:repeat(2,1fr);column-gap:1.5rem}}
@media (min-width:992px){.te-linklist--grid4{grid-template-columns:repeat(4,1fr)}}

/* CALC-017: the A-Z anchor targets (the <li> that carries each letter's
   id) had no scroll-margin-top, unlike .te-guide__section's own anchor
   targets elsewhere on the site, which already compensate for the sticky
   .te-header (77px tall, position:sticky) the same way. Without it, a
   native #hash jump aligns the target flush with the viewport top, which
   the sticky header then sits directly on top of and covers -- at
   today's small group sizes (a handful of rows after the clicked
   letter), that's often enough to mask the ENTIRE rest of that group,
   so the next fully-visible thing is the following group's heading,
   which reads exactly like landing in the wrong group. Same 6rem value
   as .te-guide__section, for the same sticky-header height. */
.te-linklist--grid4 li{scroll-margin-top:6rem}

/* CALC-016: A-Z jump bar above each group's grid (every group on all
   three nation pages). Letters with no entries in that specific group
   render as plain muted text (still shown, for a recognisable, complete
   A-Z run) rather than being omitted. */
.te-az-nav{display:flex;flex-wrap:wrap;gap:.35rem;margin:0 0 1.25rem;font-weight:700}
.te-az-nav a,.te-az-nav span{display:inline-flex;align-items:center;justify-content:center;
  width:1.8rem;height:1.8rem;border-radius:.35rem;font-size:.85rem}
.te-az-nav a{color:var(--navy);background:var(--soft);text-decoration:none}
.te-az-nav a:hover{background:var(--mint);color:var(--green)}
.te-az-nav span{color:var(--line)}

/* Article summary lead */
.te-guide__summary{margin-bottom:2.25rem}

/* Table of contents */
.te-toc{margin:0 0 2.5rem;padding:1.25rem 1.4rem;border:1px solid var(--line);
  border-radius:var(--te-radius-lg);background:var(--soft)}
.te-toc__title{margin:0 0 .6rem;font-size:.8rem;font-weight:800;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muted)}
.te-toc__list{margin:0;padding-left:1.1rem;display:grid;gap:.45rem}
.te-toc__list a{color:var(--navy);font-weight:600;text-decoration:none}
.te-toc__list a:hover{color:var(--green);text-decoration:underline}

/* Article body typography (scoped so it never affects other pages) */
.te-guide__body{font-size:1.05rem;line-height:1.7;color:#243441}
.te-guide__section{margin-bottom:2.75rem;scroll-margin-top:6rem}
.te-guide__section:first-child{margin-top:0}
.te-guide__section h2{margin:0 0 1rem;font-size:clamp(1.4rem,2.5vw,1.8rem)}
.te-guide__body p{margin:0 0 1.15rem}
.te-guide__body p:last-child{margin-bottom:0}
.te-guide__list{margin:.25rem 0 1.25rem;padding-left:1.25rem;display:grid;gap:.55rem}
.te-guide__list li{padding-left:.15rem}

/* Info / note stripe inside the article: generous vertical breathing room so
   it never crowds the heading that follows. */
.te-guide__body .te-note{margin:1.75rem 0 2rem;padding:1.1rem 1.35rem}
.te-guide__section .te-note:last-child{margin-bottom:0}

/* Key takeaways */
.te-takeaways{margin:2.75rem 0;padding:1.6rem 1.85rem;border-radius:var(--te-radius-lg);
  background:var(--mint);border:1px solid #c9e8de}
.te-takeaways .te-subhead{margin-top:0}
.te-takeaways__list{margin:0;padding-left:1.25rem;display:grid;gap:.6rem}
.te-takeaways__list li{font-weight:600;color:#0f3b30}

/* Aside: highlighted related blocks + sticky on desktop.
   Soft tinted surface so the blocks read as distinct highlighted cards. */
.te-panel--aside{margin-bottom:1.25rem;padding:1.4rem 1.5rem;
  background:linear-gradient(180deg,#f3f8fb,#eef5f9);
  border:1px solid #dbe7ef;box-shadow:none}
.te-panel--aside .te-subhead{margin-bottom:1rem;padding-bottom:.7rem;
  border-bottom:1px solid rgba(10,34,56,.10)}
@media (min-width:992px){
  .te-guide__sticky{position:sticky;top:6rem}
}
.te-guide__section:target h2{color:var(--green)}

/* Shared small meta heading (Last reviewed, etc.) — replaces inline styles */
.te-meta-heading{margin:0 0 .5rem;font-size:.8rem;font-weight:800;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muted)}

/* Sub-heading within a guide section (h3) */
.te-guide__subheading{margin:1.75rem 0 .75rem;font-size:1.2rem;font-weight:800;color:var(--navy)}

/* Worked example — reuses the result-panel language (soft mint, tabular nums) */
.te-worked{margin:1.75rem 0 2rem;padding:1.25rem 1.4rem;border:1px solid #c9e8de;
  border-radius:var(--te-radius-lg);background:var(--mint)}
.te-worked__title{margin:0 0 .75rem;font-weight:800;color:var(--navy)}
.te-worked__list{margin:0}
.te-worked__row{display:flex;justify-content:space-between;gap:1rem;padding:.5rem 0;
  border-top:1px solid rgba(10,34,56,.10)}
.te-worked__row:first-child{border-top:0}
.te-worked__row dt{margin:0;color:#3d6a5f;font-weight:600}
.te-worked__row dd{margin:0;color:var(--navy);font-weight:800;font-variant-numeric:tabular-nums}
.te-worked__row--note dt{font-weight:500;color:var(--muted)}
.te-worked__row--result{border-top:2px solid var(--green);margin-top:.25rem;padding-top:.7rem}
.te-worked__row--result dt{color:var(--navy);font-weight:800}
.te-worked__row--result dd{color:var(--green);font-size:1.15rem}

/* In-article data / comparison table */
.te-guide__table{margin:1.5rem 0 2rem}
/* .te-table-wrap (the bordered container these tables sit in) has no
   padding of its own -- <td>/<th> cells get their inset from Bootstrap's
   own .5rem cell padding, but a <caption> has none by default, so it sat
   flush against the wrap's top-left border with nothing left/above it.
   Matching that same .5rem horizontal inset here lines the caption up
   with the header row below it instead of hugging the border. */
.te-guide__table-caption{caption-side:top;text-align:left;padding:.6rem .5rem;
  color:var(--muted);font-size:.9rem;font-weight:600}
.te-guide__table td,.te-guide__table th{font-variant-numeric:tabular-nums}

/* Official-source / HMRC reference list */
.te-refs{margin:1.75rem 0 2rem;padding:1.25rem 1.4rem;border:1px solid var(--line);
  border-radius:var(--te-radius-lg);background:var(--soft)}
.te-refs .te-guide__subheading{margin-top:0}
.te-refs .te-linklist a[target=_blank]::after{content:"\2197";margin-left:.3rem;font-size:.85em;color:var(--muted)}

/* Downloadable resource */
.te-download{display:flex;align-items:center;gap:.9rem;margin:1.5rem 0 2rem;padding:1rem 1.25rem;
  border:1px solid var(--line);border-radius:var(--te-radius-lg);background:#fff;
  text-decoration:none;transition:border-color .18s ease,box-shadow .18s ease}
.te-download:hover{border-color:#bad2cb;box-shadow:var(--te-shadow-sm)}
.te-download__icon{display:grid;place-items:center;flex:none;width:2.5rem;height:2.5rem;
  border-radius:.6rem;background:var(--mint);color:var(--green);font-size:1.2rem;font-weight:800}
.te-download__title{display:block;font-weight:800;color:var(--navy)}
.te-download__note{display:block;font-size:.85rem;color:var(--muted)}

/* Responsive video embed — fixed aspect box prevents layout shift */
.te-video{position:relative;margin:1.5rem 0 2rem;aspect-ratio:16/9;border-radius:var(--te-radius-lg);
  overflow:hidden;background:var(--soft);border:1px solid var(--line)}
.te-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0}

/* Contact form: textarea reuses the input styling */
.te-textarea{min-height:8rem;resize:vertical;line-height:1.5}
.te-contact-form{padding:clamp(1.4rem,3vw,2rem)}

/* ---- 18c. Financial Snapshot ------------------------------------- */
/* Honeypot: visually hidden but present for bots */
.te-hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

/* Progress indicator */
.te-snap-progress{margin:0 0 2rem}
.te-snap-steps{display:flex;flex-wrap:wrap;gap:.5rem 1rem;list-style:none;margin:0 0 1rem;padding:0}
.te-snap-steps__item{display:flex;align-items:center;gap:.5rem;color:var(--muted);font-weight:600;font-size:.92rem}
.te-snap-steps__num{display:grid;place-items:center;width:1.9rem;height:1.9rem;border-radius:50%;
  background:var(--soft);color:var(--muted);border:1px solid var(--line);font-size:.85rem;font-weight:800;flex:none}
.te-snap-steps__item.is-active .te-snap-steps__num{background:var(--green);color:#fff;border-color:var(--green)}
.te-snap-steps__item.is-active{color:var(--navy)}
.te-snap-steps__item.is-done .te-snap-steps__num{background:var(--navy);color:#fff;border-color:var(--navy)}
.te-snap-steps__btn{display:flex;align-items:center;gap:.5rem;background:none;border:0;padding:0;
  font:inherit;color:inherit;cursor:pointer;border-radius:.4rem}
.te-snap-steps__btn:focus-visible{outline:2px solid var(--green);outline-offset:2px}
.te-snap-progress__bar{height:.5rem;border-radius:1rem;background:var(--soft);overflow:hidden}
.te-snap-progress__bar span{display:block;height:100%;background:var(--green);transition:width .25s ease}
.te-snap-progress__text{margin:.6rem 0 0;font-weight:700;color:var(--navy);font-size:.95rem}

/* Steps */
.te-snap-step{border:0;margin:0;padding:0;min-width:0}
.te-snap-step__legend{float:none;width:auto;margin-bottom:1rem}
/* The card look (border/background) lives on this inner __body wrapper,
   never directly on the <fieldset> itself. Browsers give a bordered
   <fieldset>'s <legend> special native positioning that straddles the
   top border line (the classic "title cuts through the border" look) --
   harmless on a plain fieldset, but it broke the rounded corner and left
   a background patch behind the "STEP 1" label once the fieldset itself
   had a visible border. Keeping the border/background one level down,
   after the legend, sidesteps that native behaviour entirely rather
   than fighting it. */
.te-snap-step__body{border:1px solid var(--line);padding:clamp(1.4rem,3vw,2rem);
  background:var(--soft);border-radius:var(--te-radius-lg)}
/* The step TITLE (.te-snap-step__title, not the outer __legend) is what
   the wizard JS actually focuses programmatically on every step change
   (see the "var legend=...querySelector('.te-snap-step__title')" line
   below) -- purely so screen readers announce it. Sighted keyboard users
   never land here via Tab (tabindex="-1"), so the default focus ring just
   reads as a stray green box around the title on page load, with nothing
   to focus toward. Suppressed on both :focus and :focus-visible, since
   browsers vary on which one a script-triggered focus() satisfies.
   Suppressed here only; the focus() call itself stays. */
.te-snap-step__title:focus,
.te-snap-step__title:focus-visible{outline:none}
.te-snap-step__title{display:block;font-size:clamp(1.4rem,3vw,1.9rem);font-weight:800;color:var(--navy);line-height:1.15}
.te-snap-step__intro{color:var(--muted);margin:0 0 1.25rem;max-width:44rem}
.te-snap-step__note{background:#fff;border:1px solid var(--line);border-radius:var(--te-radius-md);padding:.7rem 1rem;font-size:.92rem;margin:0 0 1.25rem}

/* Wizard controls */
.te-snap-nav{display:flex;flex-wrap:wrap;gap:.75rem;margin-top:2rem;align-items:center}
.te-snap-nav [data-snap-next],.te-snap-nav [data-snap-submit]{margin-left:auto}
.te-snap-actions{display:flex;flex-wrap:wrap;gap:.75rem}
/* Reset/secondary actions on this page use the shared .btn-outline-secondary
   variant, which is transparent until hover elsewhere on the site (e.g. the
   cookie-consent controls) -- here, against the tinted step card, that read
   as an empty control next to the solid "Next"/"Calculate" button. Filling
   it with the same soft tint gives it visible weight without competing with
   the primary green CTA. Scoped to these two containers only, so the
   shared .btn-outline-secondary elsewhere on the site is unaffected. */
.te-snap-nav .btn-outline-secondary,
.te-snap-actions .btn-outline-secondary{--bs-btn-bg:var(--soft)}

/* Results dashboard */
.te-result-card{background:var(--soft);border:1px solid var(--line);border-radius:var(--te-radius-lg);padding:1.5rem 1.75rem}
.te-result-card--alt{background:linear-gradient(180deg,#f3f8fb,#eef5f9)}
.te-result-value{font-size:clamp(2rem,5vw,2.8rem);font-weight:800;color:var(--green);margin:.35rem 0 .35rem;line-height:1;font-variant-numeric:tabular-nums}
.te-result-value--neg{color:var(--warn,#b45309)}
.te-result-meta{color:var(--muted);font-size:.9rem;margin:0}

/* Income vs costs comparison (bars never exceed their track) */
.te-snap-compare{display:grid;gap:.85rem;margin:.5rem 0 0}
.te-snap-compare__row{display:grid;grid-template-columns:5.5rem 1fr auto;align-items:center;gap:.75rem}
.te-snap-compare__label{font-weight:700;color:var(--navy);font-size:.95rem}
.te-snap-compare__track{position:relative;height:1.6rem;background:var(--soft);border:1px solid var(--line);border-radius:1rem;overflow:hidden}
.te-snap-compare__bar{display:block;height:100%;max-width:100%;border-radius:1rem;transition:width .3s ease}
.te-snap-compare__bar--income{background:var(--green)}
.te-snap-compare__bar--costs{background:#4f9d7e}
.te-snap-compare__bar--remaining{background:#a8cfbd}
.te-snap-compare__bar--shortfall{background:#b45309}
.te-snap-compare__val{font-weight:800;color:var(--navy);font-variant-numeric:tabular-nums;white-space:nowrap}
.te-snap-compare__val--neg{color:#b45309}
@media (max-width:520px){
  .te-snap-compare__row{grid-template-columns:4.5rem 1fr;grid-template-areas:"label val" "track track";row-gap:.35rem}
  .te-snap-compare__label{grid-area:label}
  .te-snap-compare__val{grid-area:val;justify-self:end}
  .te-snap-compare__track{grid-area:track}
}

/* Sub-note within a results table row heading */
.te-snap-sub{display:block;font-weight:400;font-size:.82rem;color:var(--muted)}

/* Validation: inline field errors + error summary */
.te-field-error{display:block;margin-top:.35rem;color:#b42318;font-size:.85rem;font-weight:600}
.te-input[aria-invalid="true"],.te-inputgroup:has([aria-invalid="true"]){border-color:#b42318}
.te-error-summary{border:2px solid #b42318;border-radius:var(--te-radius-md);padding:1rem 1.25rem;margin:0 0 1.5rem}
.te-error-summary__title{font-size:1.1rem;font-weight:800;color:#b42318;margin:0 0 .5rem}
.te-error-summary ul{margin:0;padding-left:1.1rem}
.te-error-summary a{color:#b42318;font-weight:600}

/* Result table emphasis rows */
.te-snap-row--total th,.te-snap-row--total td{border-top:2px solid var(--line);font-weight:800;color:var(--navy)}
.te-snap-row--result th,.te-snap-row--result td{border-top:2px solid var(--green);font-weight:800;color:var(--green);font-size:1.05rem}

/* Insights */
.te-snap-insights{list-style:none;padding:0;margin:1rem 0 0;display:grid;gap:.75rem}
.te-snap-insight{padding:.9rem 1.15rem;border-radius:var(--te-radius-md);border-left:4px solid var(--green);
  background:var(--mint);font-weight:600;color:#0f3b30}
.te-snap-insight--warning{border-left-color:#b45309;background:#fdf4e7;color:#7a4a12}

/* ---- 18. Print ---------------------------------------------------- */
@media print{
  .te-header,.te-footer,.te-breadcrumb,.te-calc__form,.te-tabs,.te-textbtn,
  .te-note--sm,.te-skip-link,.te-adslot,.te-related-row,.navbar-toggler,
  .te-snap-nav,.te-snap-actions,.te-snap-progress,.te-guide__aside,#faqs,
  .te-snap-step:not(.is-active),.te-consent{display:none!important}
  .te-section--soft{background:#fff!important;padding:0!important}
  .te-panel,.te-employer,.te-effective,.te-result-card,.te-snap-insight{box-shadow:none!important;border:1px solid #ccc!important;color:#000!important}
  .te-employer{background:#fff!important}
  .te-employer__row strong{color:#000!important}
  .te-headline,.te-result-card,.te-result-card--alt{border:1px solid #ccc!important;background:#fff!important}
  .te-result-value{color:#000!important}
  .te-snap-compare__track{border:1px solid #999!important}
  .te-snap-compare__bar{print-color-adjust:exact;-webkit-print-color-adjust:exact}
  .te-snap-insight,.te-snap-insight--warning{background:#fff!important;color:#000!important}
  body{background:#fff!important}
}

/* ---- 19. Analytics consent (PRODUCTION-001) ------------------------
   Fixed position so it can never cause layout shift (CLS). Uses only
   existing design tokens; no new colours, radii or shadows introduced. */
.te-consent{
  position:fixed;left:0;right:0;bottom:0;z-index:1050;
  background:var(--navy);color:#d7e2ea;
  box-shadow:var(--te-shadow-md);
  padding:1rem 1.25rem;
}
.te-consent[hidden]{display:none}
/* #te-consent-manage is a functional re-open target only (the footer's
   styled "Cookie settings" link delegates its click here via site.js).
   It was never meant to be its own visible control, so it stays hidden
   unconditionally, regardless of the "hidden" attribute consent.js
   toggles on it -- programmatic .click() still fires on a display:none
   element, so the footer link keeps working. */
.te-consent__manage{display:none!important}
.te-consent__inner{
  max-width:1200px;margin:0 auto;
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:1rem 1.5rem;
}
.te-consent__inner p{margin:0;flex:1 1 24rem;font-size:.92rem;line-height:1.5}
.te-consent__inner a{color:#fff;text-decoration:underline}
.te-consent__actions{display:flex;gap:.6rem;flex:0 0 auto}

/* Reject button contrast fix (UX-001): btn-outline-secondary defaults to
   grey text/border (3.78:1 against navy, below WCAG AA's 4.5:1 minimum),
   designed for light backgrounds. Scoped to .te-consent only; no other
   outline-secondary button on the site is affected. White text/border
   gives 17.72:1 (text) and 11.73:1 (border), both well above the WCAG AA
   minimums (4.5:1 text, 3:1 non-text). */
.te-consent .btn-outline-secondary{
  color:#fff;border-color:rgba(255,255,255,.8);background:transparent;
}
.te-consent .btn-outline-secondary:hover,
.te-consent .btn-outline-secondary:focus-visible{
  color:var(--navy);background:#fff;border-color:#fff;
}
.te-consent .btn-outline-secondary:focus-visible{
  outline:3px solid #fff;outline-offset:2px;box-shadow:none;
}
@media (max-width:575.98px){
  .te-consent__inner{flex-direction:column;align-items:stretch;text-align:center}
  .te-consent__actions{justify-content:center}
}

/* Cookie settings footer control (UX-001): replaces the old fixed/floating
   button. Shares the existing footer link's colour, spacing and hover
   treatment via this compound selector, plus button-specific resets and an
   explicit focus-visible outline (buttons don't reliably get a visible
   default outline in every browser, and the dark footer background needs
   one regardless, same reasoning as the Reject button above). */
.te-footer__col button{
  background:none;border:none;padding:0;margin:.5rem 0;
  font:inherit;text-align:left;cursor:pointer;color:#e8eef2;
}
.te-footer__col button:hover{color:#fff;text-decoration:underline}
.te-footer__col button:focus-visible{outline:3px solid #fff;outline-offset:2px}

/* ---- 20. Segmented tax band bar (CALC-003) ---------------------------
   Purely presentational: colours and widths are supplied by the calling
   calculator definition via inline style (see includes/guide/blocks.php,
   'segmented_bar' block type). No tax-specific values live here. */
.te-taxbar{
  display:flex;width:100%;height:1.75rem;
  border-radius:var(--te-radius);overflow:hidden;
  border:1px solid var(--line);
}
.te-taxbar__seg{display:block;height:100%}
.te-taxbar__seg + .te-taxbar__seg{border-left:1px solid rgba(255,255,255,.5)}
.te-taxbar__legend{
  list-style:none;margin:.85rem 0 0;padding:0;
  display:flex;flex-wrap:wrap;gap:.5rem 1.25rem;
  font-size:.88rem;color:var(--muted);
}
.te-taxbar__legend li{display:flex;align-items:center;gap:.45rem}
.te-taxbar__swatch{
  display:inline-block;width:.7rem;height:.7rem;border-radius:2px;flex:0 0 auto;
}
@media (max-width:420px){
  .te-taxbar{height:1.4rem}
}

/* ---- FLAGSHIP-003: "How Much Tax Do I Really Pay in the UK?"
   (supersedes FLAGSHIP-001's stacked-bar treatment; the underlying
   figures are unchanged, only the visual encoding is a donut now) ---- */
.te-hmt-inputblock{
  display:flex;flex-wrap:wrap;align-items:flex-end;gap:.75rem 1rem;max-width:34rem;
}
.te-hmt-inputblock .te-label,.te-hmt-inputblock .te-inputgroup,
.te-hmt-inputblock .te-hint,.te-hmt-inputblock .te-field-error{width:100%}
.te-hmt-inputblock__cta{flex:0 0 auto}

.te-hmt-donut-wrap{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:1.5rem 2rem;margin-bottom:1.25rem;
}
.te-hmt-donut{width:100%;max-width:17rem;height:auto;flex:0 0 auto}
.te-hmt-donut__stat{font-family:var(--bs-font-sans-serif);font-size:.85rem;font-weight:700;fill:var(--muted)}
.te-hmt-donut__statnum{font-family:var(--bs-font-sans-serif);font-size:2.1rem;font-weight:800;fill:var(--navy)}

/* FLAGSHIP-004: donut legend -- real visible text (not aria-hidden),
   same order as the donut's own clockwise arc order (both are built
   from the same $segments array in render.php, so this can't drift).
   The VAT row's swatch is its own small hatched <svg>, never a flat
   colour chip, so it stays visually distinct from every other swatch
   in the one place people scan to identify segments. */
.te-hmt-legend{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem;flex:1 1 14rem;max-width:20rem}
.te-hmt-legend__row{display:flex;align-items:center;gap:.6rem;font-size:.9rem}
.te-hmt-legend__swatch{width:18px;height:18px;border-radius:4px;flex:0 0 auto;display:inline-block}
.te-hmt-legend__label{flex:1 1 auto;color:var(--ink)}
.te-hmt-legend__pct{font-weight:700;color:var(--navy);font-variant-numeric:tabular-nums}

.te-hmt-table{width:100%;border-collapse:collapse;margin-bottom:.75rem}
.te-hmt-table th,.te-hmt-table td{
  padding:.5rem .6rem;border-bottom:1px solid var(--line);text-align:left;font-size:.95rem;
}
.te-hmt-table td{text-align:right;font-variant-numeric:tabular-nums}
/* FLAGSHIP-005: header/amount column alignment -- the "Amount" header
   now right-aligns to match the amount column beneath it, instead of
   sitting left-aligned above right-aligned figures. */
.te-hmt-table th.te-hmt-table__amount-head{text-align:right}
/* FLAGSHIP-005: amount figures read as clearly dominant -- bumped
   weight/size, scoped to actual amount cells only (data-amount is only
   ever present on those, never on the band-breakdown disclosure row). */
.te-hmt-table td[data-amount]{font-size:1.05rem;font-weight:800}
.te-hmt-table__bandrow td{padding:0 .6rem .7rem}
.te-hmt-table__bandrow .te-band-breakdown-wrap{margin-top:-.15rem}
/* FLAGSHIP-004: same cost/positive colour system as UI-008b
   (.te-breakdown__row--deduction/--positive in the universal
   calculator template), re-expressed for this page's real <table>
   markup instead of that template's <dl>. */
.te-hmt-table__amount--deduction{color:var(--error)}
.te-hmt-table__amount--positive{color:var(--green)}
/* FLAGSHIP-006: Council Tax's own row colour -- navy, not the red cost
   family, matching the donut segment/legend swatch (see
   hmt_segment_color('council') in render.php) so the "different
   mechanism" signal survives inclusion in the totals. */
.te-hmt-table__amount--council{color:var(--navy)}

/* FLAGSHIP-005: twin highlight cards -- .te-headline/--cost/--positive
   reused verbatim (see render.php's hmt_render_highlight_cards()
   docblock); only the row spacing is new here. FLAGSHIP-006 removed
   the standalone navy Council Tax card (now redundant with the
   ring/table/red-card total), so no navy-specific card CSS remains. */
.te-hmt-cards{margin-bottom:1.5rem}
.te-hmt-footnote{font-size:.88rem;color:var(--muted);margin-bottom:1rem}
.te-hmt-counciltax-note{margin-top:-.25rem;margin-bottom:1rem}
.te-hmt-counciltax-caption{font-size:.88rem;color:var(--muted);margin-top:-.5rem;margin-bottom:1.25rem}
.te-hmt-freq{display:inline-flex;gap:.5rem;margin-bottom:.9rem}
.te-hmt-freq .te-tab{min-width:6rem}

/* "What's typically not taxed" (Table 2) -- deliberately distinct
   heading/framing/colour from Table 1 above, never personalised
   ("you"/"your") language: general education about the tax system,
   not a claim about this person's own spending. */
.te-hmt-nottaxed{
  margin-top:1.75rem;padding:1.25rem 1.4rem;background:var(--soft);border-radius:var(--te-radius);
}
.te-hmt-nottaxed__table{width:100%;border-collapse:collapse;margin-top:.75rem}
.te-hmt-nottaxed__table th,.te-hmt-nottaxed__table td{
  padding:.55rem .6rem;border-bottom:1px solid var(--line);text-align:left;font-size:.9rem;vertical-align:top;
}
.te-hmt-nottaxed__table th{white-space:nowrap;font-weight:700;color:var(--navy)}
.te-hmt-nottaxed__table--more{margin-top:.5rem}
.te-hmt-nottaxed__more summary{font-size:.85rem}
/* FLAGSHIP-007: Official Sources moved from this card-level tint to a
   full-width te-section--soft band (structurally matching the FAQ
   section directly below it) -- .te-hmt-sources-panel is no longer
   used anywhere, removed rather than left as dead CSS. */

.te-hmt-postcta{display:flex;flex-wrap:wrap;gap:.75rem}

/* FLAGSHIP-005: Official sources list -- fixes the "verified [date]"
   badge overlapping/misaligning with its link text. .te-linklist a is
   display:inline-flex (for its arrow-icon prefix), and the badge was a
   plain sibling <span> with no defined wrap relationship to it -- at
   some widths the two competed for the same line with nothing tying
   them together. Making the <li> itself a wrapping flex row (scoped to
   this page's own sources list only, not the shared .te-linklist used
   by 16+ other pages) lets the link and badge sit on one line when
   there's room and wrap cleanly onto their own lines when there isn't. */
.te-hmt-sources li{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:.4rem;row-gap:.1rem}

/* Wizard step summary (collapsed, completed step) */
.te-hmt-step__summary{
  background:var(--soft);border-radius:.5rem;padding:.75rem 1rem;margin-top:.5rem;
  font-size:.92rem;color:var(--ink);
}
.te-panel--step.is-complete{border-color:#c9e8de}

/* CALC-026: Council Tax Value Context pilot (5 named councils only).
   Navy/neutral throughout -- this is factual context, not a positive or
   negative signal, so it deliberately never reaches for --error/--green.
   Panel styling matches #yoy-comparison's own navy-left-border white
   card convention immediately above it on the same page, so the pilot
   content reads as part of the same family, not a bolted-on extra. */
.te-valuecontext__panel{padding:1.1rem 1.3rem;border-left:4px solid var(--navy);
  background:#fff;border-radius:var(--te-radius-lg);box-shadow:var(--te-shadow-sm)}
.te-valuecontext__text{margin:0;color:var(--ink);line-height:1.55}
.te-valuecontext__heading{margin:0 0 .5rem;font-size:1.05rem;font-weight:800;color:var(--navy)}
.te-valuecontext__caveat{margin:0 0 .8rem;font-size:.88rem;color:var(--muted);
  padding:.6rem .8rem;background:var(--soft);border-radius:.4rem;line-height:1.5}
.te-valuecontext__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.45rem}
.te-valuecontext__list li{display:flex;justify-content:space-between;gap:1rem;
  padding-bottom:.45rem;border-bottom:1px solid var(--line);font-size:.94rem}
.te-valuecontext__list li:last-child{border-bottom:0;padding-bottom:0}
.te-valuecontext__cat{color:var(--ink)}
.te-valuecontext__val{color:var(--navy);font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}

/* CALC-026 (restructure): the promoted, above-the-fold relatable-
   comparison panel. Icon reuses .te-card__icon verbatim (the exact
   pale-mint badge every calculator card icon already sits in --
   site.css, "UI-001") rather than inventing a new badge style, so the
   icon+text pairing reads as consistent with the rest of the site. */
.te-valuecontext__headline{display:flex;align-items:flex-start;gap:.9rem}
.te-valuecontext__headline .te-card__icon{flex:none;margin-bottom:0}
.te-valuecontext__headline .te-valuecontext__text{font-size:1.1rem;padding-top:.15rem}

/* Whole-budget items lead with percentage share (large, navy) with the
   raw £ figure as smaller secondary text underneath -- a percentage is
   readable at a glance, a raw £ millions figure isn't relatable at
   household scale. Council-Tax-specific items (Hull, Blackburn) are
   unaffected: they render through the plain .te-valuecontext__val path
   above, unchanged. */
.te-valuecontext__valwrap{display:flex;flex-direction:column;align-items:flex-end;line-height:1.25}
.te-valuecontext__valwrap .te-valuecontext__valsub{font-size:.78rem;font-weight:600;color:var(--muted);
  font-variant-numeric:tabular-nums;white-space:nowrap}

/* CALC-026b (Manchester-only pending founder sign-off): a permanently-
   visible section, replacing the <details>/<summary> reveal used
   elsewhere -- same heading scale/colour as .te-yoy-summary (the
   <summary> it replaces) so swapping one for the other is a pure
   markup change, not a visual one. No chevron, no pointer cursor,
   since there's nothing to expand. */
.te-yoy-heading-static{font-size:clamp(1.55rem,3vw,2.3rem);font-weight:800;
  color:var(--navy);line-height:1.18;letter-spacing:-.02em;margin:0 0 .75rem}

/* ====================================================================
   CALC-026d: three-tier section system (Manchester-only pending
   founder sign-off; named generically since this is meant to become
   the shared council-tax-page template after rollout to the other 4
   pilot councils). Briefly documented here AND in
   docs/CALC-026-section-tiers.md.

   Tier 1 -- .te-section--hero: tinted background panel, boldest
     treatment. Used for the increase/decrease badge panel below.
   Tier 2 -- .te-section--data: the site's EXISTING card look (white
     background, border, radius, soft shadow) -- an alias of .te-panel
     (see that rule above), not a second implementation of the same
     look. Used for: the band-table card, the YoY comparison card, the
     budget-breakdown card, and (via its own pale-blue variant) the
     take-home-pay panel.
   Tier 3 -- .te-section--reference: no card, no border. Heading +
     paragraph + generous whitespace, with a thin <hr> divider between
     sections instead of a box. Used for "How Council Tax bands work",
     "What is included in this bill" and "Discounts, reductions and
     premiums".
   ==================================================================== */
/* CALC-026e: the 35rem width constraint (CALC-026d, measured via canvas
   text metrics to land ~70 characters/line) is deliberately REVERTED
   here -- a knowing trade-off of visual column-width consistency with
   the band table above these sections, over the stricter 65-75 CPL
   target. No max-width at all now: these sections share the same
   .te-reading/.te-guide__body ancestor as the band table's own card, so
   removing the constraint lets them take that same natural width
   without needing to duplicate a specific rem value here. */
.te-section--reference__divider{border:0;border-top:1px solid var(--line);margin:0}
/* Tier 1's own base shape (padding/radius) -- kept generic so a future
   Tier-1 use beyond the badge panel doesn't need its own copy of this;
   the pale-red/pale-green tint itself is supplied by the more specific
   .te-valuecontext__panel1--cost/--positive modifiers below, since
   colour is Tier 1's per-instance choice, not a fixed part of the tier. */
.te-section--hero{border-radius:var(--te-radius-lg);padding:1.75rem 1.5rem}

/* CALC-026d: the badge and its caption sentence now merge into ONE
   Tier-1 panel (replacing CALC-026c's separate floating badge + text
   block, superseded and removed rather than left as dead CSS). Panel
   background is the pale-red/pale-green tint the badge USED to be
   filled with (CALC-026c); the badge itself is now a SOLID --error/
   --green circle with WHITE text, and the caption sentence uses the
   panel's own darker-red/-green text tone for contrast against the
   pale background, not the default body-text colour (--muted fails
   4.5:1 here: verified 4.33:1 before writing this, not assumed). */
.te-valuecontext__panel1{display:flex;flex-direction:column;align-items:center;text-align:center}
.te-valuecontext__panel1--cost{background:#fbeae8;color:#7c2c22}
.te-valuecontext__panel1--positive{background:#e9f7f2;color:#1f5a48}
.te-valuecontext__panel1 .te-valuecontext__text{text-align:left;font-size:1rem;margin-top:1.25rem;color:inherit}
/* CALC-026-badge-decouple: inline source citation for badge panels with
   no bottom Sources section to link to (Phase-A-only councils). Full
   inherited colour, no opacity reduction -- verified 8.05:1 (cost) and
   7.29:1 (positive), comfortably clearing 4.5:1 even at this smaller
   size, not assumed from the main sentence's own pass. */
.te-valuecontext__panel1 .te-valuecontext__text--source{font-size:.8125rem;margin-top:.5rem}
.te-valuecontext__panel1 .te-valuecontext__srclink{color:inherit;opacity:.75}
.te-valuecontext__panel1 .te-valuecontext__srclink:hover,
.te-valuecontext__panel1 .te-valuecontext__srclink:focus-visible{opacity:1}

.te-valuecontext__badge2{display:flex;flex-direction:column;align-items:center;justify-content:center;
  width:10rem;height:10rem;border-radius:50%;gap:.15rem;color:#fff}
.te-valuecontext__badge2--cost{background:var(--error)}
.te-valuecontext__badge2--positive{background:var(--green)}
.te-valuecontext__badge2pct{font-size:2.1rem;font-weight:900;letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;line-height:1;color:inherit}
.te-valuecontext__badge2sub{font-size:.875rem;font-weight:700;color:inherit;opacity:.9}

/* Tier-2 card applied to the always-visible YoY/budget-breakdown
   sections (see includes/council-tax-page/comparison.php and
   value-context.php) already nests each of THOSE sections' own
   .te-valuecontext__panel sub-blocks (navy-left-border mini-cards,
   CALC-026). Nested inside .te-section--data specifically (i.e. only
   on Manchester's always-visible layout, never the <details> version
   the other 4 councils still use), that inner card is redundant --
   stripped back to a plain sub-block so one section isn't a card
   inside a card, which is exactly the repetitive-styling this tier
   system exists to reduce. */
.te-section--data .te-valuecontext__panel{border-left:0;background:transparent;
  box-shadow:none;border-radius:0;padding:0;border-bottom:1px solid var(--line);padding-bottom:1.25rem}
.te-section--data .te-valuecontext__panel:last-child{border-bottom:0;padding-bottom:0}

/* Small caveat/source icon -- a plain anchor link down to #sources
   (confirmed with the user rather than guessed), NOT the UI-006
   click-to-reveal tooltip pattern, since that would duplicate the
   citation the Sources section already holds in full. Visually reuses
   UI-006's .te-infobtn circle-glyph styling (border:1.5px solid
   currentColor, italic serif "i") so it still reads as the site's
   established "more info" affordance, just wired as a real link. */
.te-valuecontext__srclink{display:inline-flex;margin-left:.3rem;vertical-align:-.15em;color:var(--muted)}
.te-valuecontext__srclink span{display:grid;place-items:center;width:1.15rem;height:1.15rem;
  border-radius:50%;border:1.5px solid currentColor;font:italic 700 .68rem/1 Georgia,serif}
.te-valuecontext__srclink:hover,.te-valuecontext__srclink:focus-visible{color:var(--green)}

/* CALC-026b: the consolidated bottom Sources section. Plain list, not
   .te-refs/.te-linklist (includes/guide/blocks.php's "references"
   block requires every item to be a link; the ONS citation has none). */
.te-sources-list{padding-left:1.1rem;margin:.75rem 0 0;font-size:.9rem;color:var(--muted);line-height:1.6}
.te-sources-list li{margin-bottom:.5rem}
.te-sources-list a{color:var(--navy);font-weight:700}

/* CALC-026d: recolours the take-home-pay panel from navy to pale blue
   (Manchester only -- every other council keeps the original navy
   .te-trust-card, unchanged). "#f3faff" was the lighter stop of the
   band table's own existing 10-month-column gradient (site.css above),
   reused rather than inventing a new light-blue token, since no
   dedicated "info/pale-blue" token exists in :root today. Navy text
   throughout; .te-hint reuses the muted-navy tone already established
   on .te-disclaimer rather than the sitewide --muted grey, which is
   tuned for a white background, not this one.
   CALC-026e: background darkened ~9% (243,250,255 -> 221,228,232,
   scaled uniformly, not eyeballed) per that ticket.
   CALC-026f: background changed again, to #EDF8FF. Contrast against
   navy text recomputed: 16.43:1 -- comfortably clear of the 4.5:1
   minimum, computed before writing this, not assumed. */
.te-trust-card--pale{background:#EDF8FF;color:var(--navy);border:1px solid #c7d2d8}
.te-trust-card--pale h2{color:var(--navy)}
.te-trust-card--pale .te-label{color:var(--navy)}
.te-trust-card--pale .te-hint{color:#4a5a66}
.te-trust-card--pale .te-hint a{color:var(--green)}
.te-trust-card--pale .te-hint a:hover,.te-trust-card--pale .te-hint a:focus-visible{color:var(--green2)}
.te-trust-card--pale .te-hint--warning{color:#7a4a12}
.te-trust-card--pale .te-bar--cost .te-bar__head,
.te-trust-card--pale .te-bar--positive .te-bar__head{color:var(--navy)}

/* CALC-026e: Manchester's hero CTA, gradient sampled directly from the
   band table's own "Monthly (12 months)" header cell
   (.te-table-wrap th.te-col-12mo, above) -- linear-gradient(135deg,
   #215c88,#04192f), not approximated. background-image paints over
   .btn-dark's own background-color (a Bootstrap CSS variable, which
   can't hold a gradient itself), so the solid navy fill never shows
   through. Every other council's CTA stays plain .btn-dark navy. */
.te-cta-gradient{background-image:linear-gradient(135deg,#215c88,#04192f)}

/* CALC-026e: removes the accent left-border from the YoY card's inner
   comparison block (#yoy-comparison, above) once it's nested inside
   the Tier-2 .te-section--data card -- Manchester only. The id selector
   above (specificity 1,0,0) needs a compound selector, not a plain
   class, to win regardless of source order.
   CALC-026g: also removes #yoy-comparison's own padding (20px 22.4px),
   which was stacking on top of .te-section--data's own card padding and
   inset the table further than the band table/budget-breakdown list --
   measured: band table and budget list both sat flush at the card's own
   padding edge (left 108px in a 728px-wide card), the YoY table sat 22px
   further in (left 130px) because of this div's own padding. Zeroing it
   here brings all three back to the same flush edge.
   CALC-026h: #yoy-comparison ALSO still had its own background:#fff,
   box-shadow and border-radius (CALC-026e/g only stripped border-left
   and padding) -- a white card-within-a-white-card, invisible as a
   colour difference but visible as the soft shadow reading as a border
   around the whole headline+chart+table block. Stripped here too, the
   same full de-carding already applied to .te-valuecontext__panel in
   CALC-026d for the same reason. */
.te-section--data #yoy-comparison{border-left:0;padding:0;background:transparent;
  box-shadow:none;border-radius:0}

/* ====================================================================
   CALC-026d: typography/contrast pass, Manchester-only pending founder
   sign-off (confirmed with the user: scoped to the council-tax page
   template, not a site-wide change). Base text bumped to 17.5px inside
   .te-council-tax-page -- this cascades via ordinary inheritance to any
   plain text that doesn't set its own font-size (paragraphs, table
   cells, FAQ answers), but "rem" is always root-relative, never
   ancestor-relative, so every rem-sized utility class actually used on
   this page needs its own explicit override alongside it. Audited
   every font-size below 14px that appears on this page (not a sitewide
   sweep of every class in this file) and listed each fix's "before"
   size in its own comment, so the audit is checkable, not just
   asserted. ==================================================== */
.te-council-tax-page{font-size:17.5px}
.te-council-tax-page p{line-height:1.6}
/* .te-guide__body sets its own font-size in rem (root-relative), so it
   doesn't inherit the 17.5px above -- measured 16.8px in the browser
   before finding this, not assumed. Overridden explicitly to the same
   17.5px target. */
.te-council-tax-page .te-guide__body{font-size:1.09375rem}
.te-council-tax-page .te-hint{font-size:.875rem;line-height:1.6} /* was .84rem/13.44px */
.te-council-tax-page .te-eyebrow{font-size:.875rem} /* was .78rem/12.48px */
.te-council-tax-page .te-disclaimer{font-size:.875rem;line-height:1.6} /* was .86rem/13.76px */
.te-council-tax-page .te-valuecontext__valwrap .te-valuecontext__valsub{font-size:.875rem} /* was .78rem/12.48px */
/* .te-valuecontext__badge2sub is already .875rem (14px) above -- CALC-026c
   shipped it at .82rem/13.12px; fixed at the source rather than a second
   override here. */

/* ====================================================================
   CALC-026h (mobile): Manchester-only pending founder sign-off.

   1. Hero CTA centred on mobile only -- desktop keeps the existing
      left-aligned flex row (.te-hero-jumplinks, above) untouched. */
@media (max-width:767.98px){
  .te-council-tax-page .te-hero-jumplinks{justify-content:center}
}

/* 2. Both data tables (band table, YoY comparison) were technically
   inside an overflow-x:auto wrapper (.te-table-wrap, above) already,
   but a table with the default auto layout shrinks/wraps cell text to
   fit the AVAILABLE width before it ever triggers real overflow --
   measured on this page at 375px: the wrapper's scrollWidth barely
   exceeded its clientWidth (delta of 30-127px) while header cells
   wrapped to 3-4 lines ("Monthly (10 months)" is one of them, exactly
   as flagged). Forcing white-space:nowrap on every header/cell gives
   the table its real, unwrapped intrinsic width, so the SAME
   overflow-x:auto now genuinely scrolls instead of squeezing.

   TABLE-001: originally landed scoped to .te-council-tax-page
   (Manchester only), then confirmed via Hull (unmodified layout) as a
   PRE-EXISTING, SITEWIDE issue affecting all ~350 council pages plus
   the interactive council-tax-calculator's own band table -- all of
   which share this exact .te-table-wrap--full markup. Promoted to a
   single shared rule here, scoped to --full specifically (short,
   multi-word headers prone to wrapping) rather than bare
   .te-table-wrap, which guide-article and Financial Snapshot tables
   also use for genuinely-wrapping descriptive content that must NOT
   get white-space:nowrap forced onto it. */
@media (max-width:991.98px){
  .te-table-wrap--full th,
  .te-table-wrap--full td{white-space:nowrap}
}

/* Visible, always-on scroll affordance (no JS/scroll-detection needed
   to discover it) -- a short static hint directly above each
   scrollable table, shown only at the same narrow widths where the
   table actually needs to scroll. TABLE-001: sitewide, not scoped to
   .te-council-tax-page -- markup adds this hint wherever
   .te-table-wrap--full is used. */
.te-table-scroll-hint{display:none;font-size:.875rem;color:var(--muted);
  font-weight:600;margin:0 0 .5rem}
@media (max-width:767.98px){
  .te-table-scroll-hint{display:block}
}
