/* ╔══════════════════════════════════════════════════════════════════════╗
   ║  חוסך — landing site styles. Brand: white glass + black ink.           ║
   ║  Ink #111827 (CTAs/accents/borders), charcoal #374151, light-grey      ║
   ║  highlight #E5E7EB, glass-white #F5F7F8. Formal, editorial, mono.      ║
   ║  Fonts: Rubik (display) + Assistant (body). RTL.                       ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

:root {
  --green: #111827;         /* ink black — CTAs / accents / borders */
  --green-2: #374151;       /* slate charcoal */
  --green-d: #000000;       /* deepest ink for gradients */
  --lime: #E5E7EB;          /* light-grey highlight (DARK text on this) */
  --mint: #F0F2F4;          /* subtle grey tint surface */
  --sage: #6B7280;          /* muted slate accent */
  --sand: #fbf3e0;          /* warm tint */
  --cream: #F5F7F8;         /* glass white */
  --ink: #0B0F14;           /* near-black text */
  --muted: #4B5563;
  --white: #ffffff;
  --line: #E4E8EC;          /* formal hairline */

  /* Ink scale — a calibrated monochrome ramp the whole system tunes against. */
  --ink-900: #0B0F14;
  --ink-800: #111827;
  --ink-700: #1F2733;
  --ink-600: #374151;
  --ink-500: #4B5563;
  --ink-400: #6B7280;
  --ink-300: #9CA3AF;
  --ink-200: #CBD2D9;
  --ink-100: #E4E8EC;
  --ink-050: #F0F2F4;

  /* Refined accent system — color used with intent over the ink/glass base.
     Green = action (CTAs, links, active, focus), matching the Switchy logo.
     Amber = value/savings. */
  --accent: #16A34A;        /* brand green — primary action (fills/CTAs/borders/icons) */
  --accent-d: #15803D;      /* deep green for gradient depth + hover */
  --accent-t: #DCFCE7;      /* light green surface tint */
  --value: #F59E0B;         /* amber — savings / value emphasis (fills/badges/icons) */
  --value-t: #FEF3C7;       /* light amber surface tint — "best value" table row */
  --value-d: #D97706;
  /* On-light TEXT tiers — the same brand hues, darkened so green/amber used as
     small text clear WCAG AA (≥4.5:1) on white/glass. --accent (3.3:1 on white)
     is fine for fills, borders, icons and large display, but fails for label-
     sized text; these are the values to use whenever the colour IS the ink.
     In dark mode the lifted --accent/--value already pass, so these alias back. */
  --accent-ink: #15803D;    /* green text on light — 4.6:1 on white */
  --value-ink: #B45309;     /* amber text on light — 5.9:1 on white */

  /* Semantic status colours — driven from one place so toasts / field-errors /
     callouts stop hand-coding raw hex. Light surfaces (--*-t) for tinted ground. */
  --error: #DC2626;   --error-t: #FEE2E2;
  --warning: #D97706; --warning-t: #FEF3C7;
  --info: #2563EB;    --info-t: #DBEAFE;

  --radius-xs: 8px;         /* chips, tight tablets, inner controls */
  --radius-sm: 12px;
  --radius: 20px;           /* friendlier rounding */
  --radius-lg: 26px;

  /* Layered elevation — a soft ambient wash + a tighter key shadow, so cards
     read as lifted glass rather than a flat drop. Cool ink-tinted, never black.
     An explicit elevation SCALE (--elev-0…3) names the same ramp by depth, so
     components can request a tier rather than reach for a raw shadow token. */
  --shadow-sm: 0 1px 2px rgba(15,27,34,.04), 0 4px 14px rgba(15,27,34,.05);
  --shadow: 0 2px 6px rgba(15,27,34,.05), 0 14px 38px rgba(15,27,34,.09);
  --shadow-lg: 0 6px 16px rgba(15,27,34,.08), 0 30px 70px rgba(15,27,34,.16);
  --shadow-ink: 0 10px 24px rgba(17,24,39,.26), 0 2px 6px rgba(17,24,39,.18);
  --elev-0: none;
  --elev-1: var(--shadow-sm);
  --elev-2: var(--shadow);
  --elev-3: var(--shadow-lg);
  /* Glass-glint — the signature 1px top-edge light that makes a surface read as
     lifted glass. Layer it FIRST in a box-shadow list, before the elevation. */
  --glint: inset 0 1px 0 rgba(255,255,255,.7);
  /* Focus rings — a two-layer ring (white inner gap + green halo) so the
     outline reads cleanly on both light glass and the dark ink bands. The
     value variant is for amber "best/value" controls. */
  --ring: 0 0 0 2px #fff, 0 0 0 5px rgba(22,163,74,.42);   /* focus ring (green) */
  --ring-value: 0 0 0 2px #fff, 0 0 0 5px rgba(245,158,11,.45);
  --ring-flush: 0 0 0 3px rgba(22,163,74,.34);   /* no white gap — for borderless/dark contexts */

  /* Spacing scale — a single rhythm the whole system can tune against, so
     gaps/padding share one cadence instead of drifting magic numbers. */
  --space-xs: 8px;
  --space-sm: 16px;
  --space-md: 28px;
  --space-lg: 56px;
  --space-xl: 86px;

  --maxw: 1140px;

  /* Fluid type scale — one clamp() ramp the headings tune against, so display
     sizes breathe between phone and desktop without per-component media queries.
     min / preferred (vw) / max are hand-tuned to the existing hero & section sizes. */
  --fs-h1:   clamp(40px, 6.4vw, 76px);
  --fs-h2:   clamp(30px, 4.4vw, 50px);
  --fs-h3:   clamp(20px, 2.4vw, 25px);
  --fs-lead: clamp(16px, 2vw, 19px);
  --fs-body: clamp(15px, 1.2vw, 17px);

  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E");
}

/* ── Dark theme ───────────────────────────────────────────────────────────
   A refined dark mode that re-skins the SAME token names, so every component
   below inherits it without per-rule overrides. Surfaces become dark ink, text
   lifts to light; the green ACTION and amber VALUE accents are nudged brighter
   so they stay legible (and clear WCAG AA) against the dark glass. */
/* ===== DARK THEME =====
   Driven by [data-theme="dark"] on <html>. A tiny inline <head> guard (emitted
   by build.js head() and present in index.html) sets data-theme from
   localStorage or the system preference BEFORE first paint — so system users
   still get dark with no flash, and the header toggle has full manual control.
   Light is the default :root above. */
:root[data-theme="dark"] {
    --green: #E5E7EB;        /* "ink" inverts to light for text/structure */
    --green-2: #C5CBD3;
    --green-d: #F3F5F7;       /* deepest "ink" → brightest text on dark */
    --lime: #2A3340;          /* highlight surface (LIGHT text now sits on it) */
    --mint: #1B232E;          /* subtle tint surface */
    --sage: #9AA4B2;
    --cream: #11161C;         /* page background — dark ink, not pure black */
    --ink: #E8EBEF;           /* primary body text */
    --muted: #AEB6C2;         /* ≥4.5:1 on the dark surfaces */
    --white: #161C24;         /* "white" cards become raised dark panels */
    --line: #2A3340;          /* hairline on dark */

    --ink-900: #F3F5F7;
    --ink-800: #E5E7EB;
    --ink-700: #CBD2D9;
    --ink-600: #AEB6C2;
    --ink-500: #9AA4B2;
    --ink-400: #828B98;       /* lifted: timestamps/eyebrow labels now clear AA (>=4.5:1) on dark cards */
    --ink-300: #5A6573;
    --ink-200: #3A4452;
    --ink-100: #2A3340;
    --ink-050: #1B232E;

    --accent: #4ADE80;        /* green lifted for contrast on dark glass */
    --accent-d: #22C55E;
    --accent-t: #0B2A18;      /* tinted green surface */
    --value: #FBBF24;         /* amber lifted */
    --value-d: #F59E0B;
    --value-t: #2A2410;       /* dark amber tint — "best value" table row */
    /* On dark glass the lifted accents already clear AA (10:1+), so the on-light
       text tiers alias back to them — green/amber text stays bright, not dark. */
    --accent-ink: #4ADE80;
    --value-ink: #FBBF24;

    /* Semantic status — lifted hues + dark tinted grounds so callouts/toasts
       stay legible on dark glass (the light --*-t tints would glare). */
    --error: #F87171;   --error-t: #2A1416;
    --warning: #FBBF24; --warning-t: #2A2110;
    --info: #60A5FA;    --info-t: #11233A;

    /* Glass-glint softens on dark surfaces (a bright white edge would shout). */
    --glint: inset 0 1px 0 rgba(255,255,255,.08);

    --shadow-sm: 0 1px 2px rgba(0,0,0,.4), 0 4px 14px rgba(0,0,0,.45);
    --shadow: 0 2px 6px rgba(0,0,0,.45), 0 14px 38px rgba(0,0,0,.55);
    --shadow-lg: 0 6px 16px rgba(0,0,0,.5), 0 30px 70px rgba(0,0,0,.6);
    --shadow-ink: 0 10px 24px rgba(0,0,0,.6), 0 2px 6px rgba(0,0,0,.5);
    --shadow-glass: 0 2px 6px rgba(0,0,0,.45), 0 14px 38px rgba(0,0,0,.55);

    --ring: 0 0 0 2px var(--cream), 0 0 0 5px rgba(129,140,248,.5);
    --ring-value: 0 0 0 2px var(--cream), 0 0 0 5px rgba(251,191,36,.5);
    --ring-flush: 0 0 0 3px rgba(129,140,248,.45);
  }
/* Glass utility adapts to a dark frosted panel rather than translucent white. */
:root[data-theme="dark"] .glass { background: rgba(28,36,46,.6); border-color: rgba(255,255,255,.08); }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) {
  :root[data-theme="dark"] .glass { background: var(--white); }
}
:root[data-theme="dark"] .nav { background: rgba(17,22,28,.82); }
:root[data-theme="dark"] .nav.scrolled { background: rgba(17,22,28,.95); }
:root[data-theme="dark"] .feature, :root[data-theme="dark"] .guide-card, :root[data-theme="dark"] .plan, :root[data-theme="dark"] .post-card { background: rgba(28,36,46,.6); border-color: rgba(255,255,255,.08); }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) {
  :root[data-theme="dark"] .feature, :root[data-theme="dark"] .guide-card, :root[data-theme="dark"] .plan, :root[data-theme="dark"] .post-card { background: var(--white); }
}
:root[data-theme="dark"] .plogo--img, :root[data-theme="dark"] .pchip { background: var(--white); }
/* Surfaces with a HARD-CODED light background (#fff) and NO token to re-skin:
   in dark mode their text flips light → light-on-light. Re-skin them to dark so
   contrast holds. (.feature/.plan/etc. already covered above via their own
   overrides; these are the remaining hand-coded whites.) */
:root[data-theme="dark"] .trust { background: #161C24; }
:root[data-theme="dark"] .section--alt { background: #0E141A; }
:root[data-theme="dark"] .chip { background: #161C24; border-color: rgba(255,255,255,.10); color: var(--green-d); }
:root[data-theme="dark"] a.chip:hover { background: #1F2733; border-color: rgba(255,255,255,.18); }
:root[data-theme="dark"] .faq__list details[open] { background: rgba(28,36,46,.6); border-color: rgba(255,255,255,.12); }
/* Hero phone is a device MOCKUP — its screen stays a light glass panel in both
   themes, so pin its inner text to dark ink (it would otherwise inherit the
   light-flipped tokens and vanish on the white screen). */
:root[data-theme="dark"] .phone__screen .card { background: #fff; }
:root[data-theme="dark"] .phone__screen .card__text b { color: #111827; }
:root[data-theme="dark"] .phone__screen .card__text small { color: #4B5563; }
:root[data-theme="dark"] .phone__screen .tag { color: #111827; }
/* Community + booking: re-skin the few surfaces that carry their own light-mode
   tints so they read on dark glass; the rest inherit the re-skinned tokens. */
:root[data-theme="dark"] .post-card:hover { border-color: rgba(255,255,255,.14); }
:root[data-theme="dark"] .stars-row { color: var(--ink-200); }
:root[data-theme="dark"] .booking__note.is-error { color: #f87171; }
:root[data-theme="dark"] .booking__consent label, :root[data-theme="dark"] .post-card__body, :root[data-theme="dark"] .review-card__body { color: var(--ink); }
/* The green "join the app" panel keeps its tint but on dark it must stay legible. */
:root[data-theme="dark"] .community__join { color: var(--ink); }
:root[data-theme="dark"] .community__join small { color: var(--muted); }
:root[data-theme="dark"] .slot[disabled], :root[data-theme="dark"] .slot:disabled, :root[data-theme="dark"] .slot--taken { color: var(--ink-400); }

/* Premium INK bands — the dark hero cards, CTA, footer, calc card, compare
   header and the "me" chat bubble are built on var(--green-d)/var(--green),
   which INVERT to light in dark mode (turning these into near-white bands with
   hardcoded white text → ~1:1 contrast). Pin them to a fixed dark ink so they
   stay dark-on-light-text in BOTH themes, per the brand's "big dark cards stay
   ink, not coloured" rule. Fixed hexes (not tokens) so theme inversion can't
   reach them. */
:root[data-theme="dark"] .cta,
:root[data-theme="dark"] .calc__card,
:root[data-theme="dark"] .article-cta,
:root[data-theme="dark"] .card--save { background: linear-gradient(140deg, #0B0F14, #1F2733); }
:root[data-theme="dark"] .footer { background: #0B0F14; }
:root[data-theme="dark"] .cmp-table thead th { background: #1F2733; }
:root[data-theme="dark"] .ai-bubble--me { background: #1F2733; color: #fff; }
/* Text that sits ON these fixed-dark bands uses --lime (a LIGHT highlight in
   light mode, but a DARK surface token in dark mode) — pin it light so the
   note / consent links stay legible on the dark CTA band. */
:root[data-theme="dark"] .cta__note,
:root[data-theme="dark"] .consent__row a,
:root[data-theme="dark"] .cta__form .consent__row input[type="checkbox"] { color: #E5E7EB; }
:root[data-theme="dark"] .calc__row output { color: #E5E7EB; }
/* Active/selected green fills carry WHITE text in light mode, but the dark theme
   lifts --accent/--accent-d to BRIGHT green (#4ADE80/#22C55E) where white is only
   1.7–2.3:1. Flip the label to dark ink (8–11:1) on every solid green fill. */
:root[data-theme="dark"] .filter-btn.active,
:root[data-theme="dark"] .community__chan--active,
:root[data-theme="dark"] .community__chan[aria-pressed="true"],
:root[data-theme="dark"] .community__chip[aria-pressed="true"],
:root[data-theme="dark"] .booking__providers .provider-pick[aria-pressed="true"],
:root[data-theme="dark"] .booking__providers .provider-pick.is-chosen,
:root[data-theme="dark"] .booking__providers .booking__provider[aria-pressed="true"],
:root[data-theme="dark"] .booking__providers .booking__provider.is-chosen,
:root[data-theme="dark"] .slot--chosen,
:root[data-theme="dark"] .slot[aria-pressed="true"],
:root[data-theme="dark"] .step__num,
:root[data-theme="dark"] .wa-fab { color: #0B0F14; }
/* The calc card's range track + result figures already read on the dark ink. */

* { margin: 0; padding: 0; box-sizing: border-box; }

html { scroll-behavior: smooth; scroll-padding-top: 84px; }

body {
  font-family: 'Assistant', system-ui, sans-serif;
  color: var(--ink);
  background: var(--cream);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
  position: relative;
}

/* Fine film grain over the whole page — adds tactile, premium depth without
   any colour. Pointer-transparent, fixed, and very subtle. */
body::after {
  content: ""; position: fixed; inset: 0; z-index: 9999; pointer-events: none;
  background-image: var(--grain); background-size: 160px; opacity: .022;
}

::selection { background: var(--ink-800); color: #fff; }

h1, h2, h3, .brand__name { font-family: 'Rubik', sans-serif; line-height: 1.12; }
/* Display headings get balanced wrapping so multi-line titles break evenly
   (no lonely orphan word on the last line) — a quiet editorial polish. */
h1, h2 { text-wrap: balance; }
.prose p, .hero__sub, .section__head p, .lead-hero p { text-wrap: pretty; }

/* Ink-gradient headings — a whisper of dimensionality on big display type
   (ink → charcoal), still strictly monochrome. Applied to hero & section h2. */
.hero h1, .section__head h2, .lead-hero h1, .cta h2 {
  background: linear-gradient(160deg, var(--ink-900) 0%, var(--ink-700) 60%, var(--ink-500) 100%);
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: var(--ink-900);
}
.cta h2 { background: linear-gradient(160deg, #fff 0%, #fff 55%, #c9ced6 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }

/* Global focus ring — keyboard users get a crisp, on-brand outline. The
   box-shadow follows each element's OWN radius (no geometry rewrite — a 6px
   override used to visibly reshape pills and buttons on focus); bare inline
   links opt into a small radius so the ring hugs the text. */
:focus-visible { outline: none; box-shadow: var(--ring); }
/* Bare inline links: a flush ring (no white gap) hugs the text tightly. */
a:not([class]):focus-visible { border-radius: 6px; box-shadow: var(--ring-flush); }

/* ── Scroll progress bar (injected by script.js) ─────────────────────────── */
.scroll-progress {
  position: fixed; inset: 0 0 auto 0; height: 3px; z-index: 60; transform-origin: right center;
  transform: scaleX(var(--p, 0)); background: linear-gradient(90deg, var(--ink-800), var(--ink-500));
  will-change: transform; pointer-events: none;
}
@media (prefers-reduced-motion: reduce) { .scroll-progress { display: none; } }

.container { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: 20px; }

a { color: inherit; text-decoration: none; }
/* Bare inline links carry a persistent underline (not hover-only) so they're
   distinguishable from body text without relying on colour alone — an AA must.
   Classed links (nav, buttons, chips, cards) keep their own affordances. */
a:not([class]) { text-decoration: underline; text-underline-offset: 2px; text-decoration-thickness: 1px; }

/* ── Glass surface ───────────────────────────────────────────────────────
   Frosted white-glass utility for cards/panels. Falls back to opaque white
   where backdrop-filter is unsupported, so text stays readable. */
.glass {
  background: rgba(255, 255, 255, .62);
  backdrop-filter: blur(16px) saturate(135%);
  -webkit-backdrop-filter: blur(16px) saturate(135%);
  border: 1px solid rgba(255, 255, 255, .7);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.7), var(--shadow-sm);
}
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) {
  .glass { background: #fff; }
}

/* ── Buttons ─────────────────────────────────────────────────────────── */
.btn {
  position: relative; overflow: hidden;
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 15px;
  padding: 13px 24px; border-radius: 16px; border: 0; cursor: pointer;
  transition: transform .2s var(--ease-spring), box-shadow .2s var(--ease), background .18s;
  white-space: nowrap; isolation: isolate;
}
/* A diagonal light sheen that sweeps across on hover — a quiet premium tell. */
.btn::before {
  content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(115deg, transparent 30%, rgba(255,255,255,.22) 50%, transparent 70%);
  transform: translateX(120%); transition: transform .6s var(--ease);
}
.btn:hover::before, .btn:focus-visible::before { transform: translateX(-120%); }
/* Inset top highlight = the glass edge that makes the gradient read dimensional. */
/* Fixed deep-green gradient (theme-independent) so WHITE label text clears AA
   (≥5:1) in BOTH themes — white on the brighter --accent (#16A34A) is only
   3.3:1, and the dark theme would lift --accent to #4ADE80 (1.7:1). The vivid
   brand green still reads through the green glow/halo shadows below. */
.btn--primary {
  background: linear-gradient(165deg, #15803D, #126C34); color: #fff;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 10px 24px rgba(22,163,74,.32), 0 2px 6px rgba(21,128,61,.24);
}
.btn--primary:hover { transform: translateY(-2px); filter: brightness(1.05); box-shadow: inset 0 1px 0 rgba(255,255,255,.22), 0 18px 36px rgba(22,163,74,.4), 0 3px 8px rgba(21,128,61,.26); }
/* Keyboard focus keeps the button's depth AND adds the ring halo, so the CTA
   never goes flat when tabbed to (a bare box-shadow would erase its lift). */
.btn--primary:focus-visible { box-shadow: inset 0 1px 0 rgba(255,255,255,.22), 0 10px 24px rgba(22,163,74,.32), var(--ring); }
.btn--ghost:focus-visible { box-shadow: inset 0 0 0 1px var(--ink-200), var(--ring); }
.btn--inverse:focus-visible { box-shadow: inset 0 1px 0 rgba(255,255,255,.6), var(--ring-value); }
.btn--primary:active { transform: translateY(0) scale(.97); filter: brightness(.97); box-shadow: inset 0 2px 4px rgba(0,0,0,.18), 0 6px 14px rgba(22,163,74,.3); }
.btn--ghost { background: var(--mint); color: var(--green); box-shadow: inset 0 0 0 1px var(--line); }
.btn--ghost:hover { background: #fff; transform: translateY(-2px); box-shadow: inset 0 0 0 1px var(--ink-200), var(--shadow-sm); }
.btn--ghost:active { transform: translateY(0) scale(.985); }
/* White-on-ink — the dark .article-cta bands (was inline-styled, stateless). */
.btn--inverse { background: #fff; color: var(--ink-800); box-shadow: inset 0 1px 0 rgba(255,255,255,.6), 0 8px 20px rgba(0,0,0,.28); }
.btn--inverse:hover { transform: translateY(-2px); box-shadow: inset 0 1px 0 rgba(255,255,255,.6), 0 14px 30px rgba(0,0,0,.36); }
.btn--inverse:active { transform: translateY(0) scale(.985); }
.btn--lg { padding: 16px 30px; font-size: 16px; border-radius: 18px; }
.btn--sm { padding: 8px 16px; font-size: 13px; }
.btn--block { width: 100%; }
/* Disabled + async-send states — a disabled button must LOOK disabled. */
.btn[disabled], .btn:disabled { opacity: .55; cursor: not-allowed; transform: none !important; filter: none !important; }
.btn.is-loading { pointer-events: none; }
.btn.is-loading::after {
  content: ""; width: 16px; height: 16px; border-radius: 50%;
  border: 2px solid currentColor; border-inline-start-color: transparent;
  animation: btn-spin .7s linear infinite;
}
@keyframes btn-spin { to { transform: rotate(360deg); } }

.pill {
  display: inline-block; background: var(--accent-t); color: var(--accent-ink);
  font-weight: 700; font-size: 13px; padding: 7px 15px; border-radius: 999px; margin-bottom: 18px;
}
.eyebrow {
  display: inline-block; color: var(--accent-ink); font-weight: 700; font-size: 13px;
  letter-spacing: .04em; text-transform: uppercase; margin-bottom: 10px;
}

/* ── Navbar ──────────────────────────────────────────────────────────── */
.nav {
  position: sticky; top: 0; z-index: 50;
  background: rgba(246,248,249,.82); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid transparent; transition: border-color .25s, box-shadow .25s, background .25s;
}
.nav.scrolled { border-bottom-color: var(--line); box-shadow: 0 4px 18px rgba(15,27,34,.05); background: rgba(246,248,249,.95); }
.nav__inner { display: flex; align-items: center; gap: 18px; height: 68px; }
.brand { display: flex; align-items: center; gap: 9px; }
.brand__mark {
  width: 32px; height: 32px; display: grid; place-items: center;
  background: var(--lime); color: var(--green-d); border-radius: 9px; font-size: 17px; font-weight: 900;
}
.brand__name { font-size: 22px; font-weight: 800; color: var(--green-d); }
.brand--light .brand__name { color: #fff; }
.nav__links { display: flex; gap: 26px; margin-inline-start: auto; }
.nav__links a { position: relative; font-weight: 600; color: var(--muted); transition: color .15s; padding-bottom: 2px; border-radius: 6px; }
.nav__links a:focus-visible { box-shadow: var(--ring-flush); }
.nav__links a::after {
  content: ""; position: absolute; inset-inline: 0; bottom: -2px; height: 2px; border-radius: 2px;
  background: var(--accent); transform: scaleX(0); transform-origin: right; transition: transform .25s var(--ease);
}
.nav__links a:hover { color: var(--accent-ink); }
.nav__links a:hover::after { transform: scaleX(1); }
/* Current page — stamped by script.js as aria-current="page". */
.nav__links a[aria-current="page"] { color: var(--accent-ink); font-weight: 700; }
.nav__links a[aria-current="page"]::after { transform: scaleX(1); }
.nav__mobile a[aria-current="page"] { color: var(--accent-ink); font-weight: 700; }
/* Compact, quieter nav CTA — it lives on EVERY viewport, so it must not
   compete with the page-level primaries below it. */
.nav__cta { margin-inline-start: 6px; padding: 9px 16px; font-size: 14px; border-radius: 12px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 4px 12px rgba(22,163,74,.24); }
.nav__wa { display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;background:#25d366;color:#fff;flex-shrink:0;transition:transform .15s,box-shadow .15s; }
@media (hover: hover) and (pointer: fine) {
  .nav__wa:hover { transform:scale(1.1);box-shadow:0 4px 14px rgba(37,211,102,.4); }
}
.nav__wa svg { width:20px;height:20px; }
.nav__zoom-link { display:flex;align-items:center;gap:4px; }
.nav__zoom-icon { width:14px;height:14px;flex-shrink:0; }
/* ── Theme toggle (light/dark) ───────────────────────────────────────────────
   An icon-only control (sun in dark mode → switch to light; moon in light mode →
   switch to dark). 44px hit area, a quiet glass hover, and the standard focus
   ring. Only ONE glyph shows per theme; the other is hidden from layout AND from
   assistive tech so the accessible name (button aria-label) stays unambiguous. */
.theme-toggle {
  flex: none; width: 44px; height: 44px; display: grid; place-items: center;
  background: none; border: 0; cursor: pointer; color: var(--green-d); border-radius: 12px;
  transition: background .15s, color .15s;
}
.theme-toggle:hover { background: var(--mint); color: var(--accent-ink); }
.theme-toggle .ico { width: 20px; height: 20px; }
.theme-toggle__sun, .theme-toggle__moon { display: grid; place-items: center; }
/* Light theme shows the moon (go-dark); dark theme shows the sun (go-light). */
.theme-toggle__sun { display: none; }
:root[data-theme="dark"] .theme-toggle__moon { display: none; }
:root[data-theme="dark"] .theme-toggle__sun { display: grid; }
.nav__toggle { display: none; background: none; border: 0; width: 44px; height: 44px; cursor: pointer; padding: 10px; }
.nav__toggle span { display: block; height: 2.5px; background: var(--green-d); border-radius: 2px; margin: 4px 0; transition: .25s var(--ease); }
.nav__toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
.nav__toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav__toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }
.nav__mobile { display: none; flex-direction: column; gap: 4px; padding: 8px 20px 18px; }
.nav__mobile a { padding: 13px 6px; min-height: 44px; display: flex; align-items: center; font-weight: 600; color: var(--ink); border-bottom: 1px solid var(--line); }
.nav__mobile .btn { margin-top: 10px; }

/* ── Hero ────────────────────────────────────────────────────────────── */
.hero { padding: 56px 0 40px; position: relative; }
/* Parallax-ready: script.js may set --parallax (px) on .hero from scrollY; the
   ambient light + dot-grid layers ride it at different rates for layered depth.
   Defaults to 0 and is fully inert under reduced-motion (rules below). */
.hero::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 560px; z-index: -1;
  background:
    radial-gradient(820px 420px at 82% -12%, rgba(17,24,39,.07), transparent 60%),
    radial-gradient(620px 380px at 8% 4%, rgba(55,65,81,.05), transparent 62%);
  transform: translate3d(0, calc(var(--parallax, 0px) * .35), 0); will-change: transform;
}
/* A fine ink dot-grid that fades out downward — engineered, formal texture. */
.hero::after {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 560px; z-index: -1; pointer-events: none;
  background-image: radial-gradient(rgba(17,24,39,.10) 1px, transparent 1.4px);
  background-size: 26px 26px;
  -webkit-mask-image: linear-gradient(180deg, rgba(0,0,0,.5), transparent 72%);
  mask-image: linear-gradient(180deg, rgba(0,0,0,.5), transparent 72%);
  transform: translate3d(0, calc(var(--parallax, 0px) * .6), 0); will-change: transform;
}
@media (prefers-reduced-motion: reduce) { .hero::before, .hero::after { transform: none; } }
.hero__inner { display: grid; grid-template-columns: 1.05fr .95fr; gap: 48px; align-items: center; }
.hero h1 { font-size: var(--fs-h1); font-weight: 900; color: var(--green-d); letter-spacing: -2px; line-height: 1.02; }
.hero .hl { color: var(--accent); position: relative; -webkit-text-fill-color: var(--accent); }
.hero .hl::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 6%; height: 26%;
  background: var(--accent); opacity: .16; border-radius: 6px; z-index: -1;
}
.hero__sub { font-size: var(--fs-lead); color: var(--muted); margin: 20px 0 28px; max-width: 30em; }
.hero__sub strong { color: var(--green); font-weight: 700; }
.hero__fineprint { display: block; font-size: 12.5px; line-height: 1.5; color: var(--ink-600); margin-top: 10px; }
.hero__fineprint a { color: inherit; text-decoration: underline; }
.hero__cta { display: flex; flex-wrap: wrap; gap: 12px; }
.hero__social { margin-top: 14px; font-size: 13px; color: var(--muted); }
.hero__social strong { color: var(--ink); }
.hero__stats { list-style: none; display: flex; flex-wrap: wrap; gap: 28px; margin-top: 34px; }
.hero__stats li { display: flex; flex-direction: column; }
.hero__stats b { font-family: 'Rubik'; font-size: 26px; font-weight: 800; color: var(--green-d); }
.hero__stats span { font-size: 13px; color: var(--muted); }

/* Hero robot video — framed to match the site (rounded, soft shadow, accent glow) */
.hero__video {
  position: relative; margin: 0; width: 100%; max-width: 420px; isolation: isolate;
}
/* Accent glow puddle behind the framed video. */
.hero__video::before {
  content: ""; position: absolute; inset: -8% -6% -12%; z-index: -1; pointer-events: none;
  background: radial-gradient(60% 55% at 50% 42%, color-mix(in srgb, var(--accent) 30%, transparent), transparent 70%);
  filter: blur(26px);
}
.hero__video-el {
  display: block; width: 100%; height: auto; aspect-ratio: 1 / 1; object-fit: cover;
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg), inset 0 0 0 1.5px rgba(255,255,255,.10);
  background: linear-gradient(155deg, #1b232f, #000);
}
:root[data-theme="dark"] .hero__video-el { box-shadow: var(--shadow-lg), inset 0 0 0 1.5px rgba(255,255,255,.06); }

/* ── Hero with full-bleed background video — the robot becomes part of the UI ── */
.hero--video { overflow: hidden; isolation: isolate; }
.hero--video::before, .hero--video::after { display: none; } /* drop the dot-grid/parallax under the video */
.hero--video .hero__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.hero--video .hero__bg-el {
  position: absolute; inset: 0; width: 100%; height: 100%; display: block;
  object-fit: cover; object-position: 32% 50%;
  /* Feather the white-background character into the page → borderless, seamless in both themes. */
  -webkit-mask-image: radial-gradient(125% 118% at 31% 47%, #000 40%, transparent 80%);
          mask-image: radial-gradient(125% 118% at 31% 47%, #000 40%, transparent 80%);
}
/* Legibility scrim: solid on the text side (physical right = RTL start), clears toward the robot. Theme-aware via --cream. */
.hero--video .hero__bg::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(to left,
    var(--cream) 0%, var(--cream) 27%,
    color-mix(in srgb, var(--cream) 72%, transparent) 45%,
    transparent 67%);
}
.hero--video .hero__inner--overlay {
  position: relative; z-index: 2;
  grid-template-columns: minmax(0, 580px); justify-content: start;
  min-height: clamp(440px, 56vh, 620px); align-content: center;
}
@media (max-width: 760px) {
  .hero--video .hero__bg-el { object-position: 50% 12%;
    -webkit-mask-image: linear-gradient(to bottom, #000 34%, transparent 74%);
            mask-image: linear-gradient(to bottom, #000 34%, transparent 74%); }
  .hero--video .hero__bg::after {
    background: linear-gradient(to bottom, color-mix(in srgb, var(--cream) 22%, transparent) 0%, var(--cream) 50%); }
  .hero--video .hero__inner--overlay { min-height: auto; grid-template-columns: 1fr; }
}

/* Phone mockup */
.hero__visual { display: grid; place-items: center; }
.phone {
  width: 290px; background: linear-gradient(155deg, #1b232f, #000); border-radius: 42px; padding: 14px;
  box-shadow: var(--shadow-lg), inset 0 0 0 1.5px rgba(255,255,255,.08);
  position: relative; animation: float 4.5s ease-in-out infinite;
}
/* Soft specular highlight raking across the phone glass. */
.phone::before {
  content: ""; position: absolute; inset: 0; border-radius: 42px; pointer-events: none;
  background: linear-gradient(150deg, rgba(255,255,255,.12), transparent 38%);
}
/* Reflected glow puddle beneath the floating device. */
.phone::after {
  content: ""; position: absolute; left: 12%; right: 12%; bottom: -34px; height: 44px; z-index: -1;
  background: radial-gradient(closest-side, rgba(17,24,39,.22), transparent 78%);
  filter: blur(2px); animation: floatShadow 4.5s ease-in-out infinite;
}
.phone__notch { width: 120px; height: 22px; background: #000; border-radius: 0 0 14px 14px; margin: 0 auto 8px; }
.phone__screen { background: var(--cream); border-radius: 28px; padding: 16px; display: grid; gap: 12px; }
@keyframes float { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-12px); } }
@keyframes floatShadow { 0%,100% { transform: scaleX(1); opacity: .55; } 50% { transform: scaleX(.86); opacity: .35; } }

.card { background: #fff; border-radius: 18px; padding: 14px; box-shadow: var(--shadow-sm); }
.card--save { background: linear-gradient(135deg, var(--green-d), var(--green)); color: #fff; text-align: center; padding: 18px; }
.card__label { font-size: 12px; opacity: .8; }
.card__big { display: block; font-family: 'Rubik'; font-size: 38px; font-weight: 900; color: var(--value); margin: 4px 0; }
.card__hint { font-size: 11px; opacity: .7; }
.card--row { display: flex; align-items: center; gap: 10px; padding: 11px 13px; }
.card--row.best { border: 2px solid var(--green); }
.card__text { display: flex; flex-direction: column; line-height: 1.25; }
.card__text b { font-size: 14px; }
.card__text small { font-size: 11px; color: var(--muted); }
.logo { width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center; font-family: 'Rubik'; font-weight: 800; font-size: 13px; flex: none; }
.logo--cel { background: #ece7fb; color: #4527a0; }
.logo--par { background: #e6f3e8; color: #2e7d32; }
.logo--gol { background: #e0f1ee; color: #00695c; }
.tag { margin-inline-start: auto; font-family: 'Rubik'; font-weight: 800; color: var(--green); font-size: 15px; }
.tag--win { background: var(--value); color: #3a2900; font-weight: 800; padding: 4px 9px; border-radius: 9px; font-size: 12px; }

/* ── Providers strip ─────────────────────────────────────────────────── */
.providers { padding: 22px 0 8px; }
.providers__title { text-align: center; color: var(--muted); font-weight: 600; font-size: 14px; margin-bottom: 16px; }
.providers__row { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
.chip {
  display: inline-flex; align-items: center; background: #fff; border: 1px solid var(--line); color: var(--green-d); font-weight: 700;
  font-size: 14px; padding: 9px 16px; min-height: 40px; border-radius: 999px; box-shadow: var(--shadow-sm); text-decoration: none;
  transition: transform .18s var(--ease), box-shadow .18s var(--ease), border-color .18s;
}
/* Only LINK chips lift — decorative span.chip must not pretend to be a button. */
a.chip:hover { transform: translateY(-2px); border-color: var(--green-2); box-shadow: 0 8px 18px rgba(17,24,39,.10); color: var(--green); }
.providers__more { text-align: center; margin-top: 16px; }
.providers__more a { color: var(--green); font-weight: 700; text-decoration: none; }
.providers__more a:hover { text-decoration: underline; }

/* ── Trust strip (honest process signals, just below the hero) ─────────── */
.trust { padding: 16px 0; background: #fff; border-block: 1px solid var(--line); }
.trust__row { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px 30px; }
.trust__item { display: inline-flex; align-items: center; gap: 8px; font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 14px; color: var(--ink-700); }
.trust__item .ico { width: 18px; height: 18px; color: var(--accent); flex: none; }
@media (max-width: 560px) { .trust__row { gap: 10px 18px; } .trust__item { font-size: 12.5px; } }

/* ── Sections ────────────────────────────────────────────────────────── */
.section { padding: 86px 0; }
.section--alt { background: #fff; }
.section__head { text-align: center; max-width: 640px; margin: 0 auto 52px; }
.section__head h2 { font-size: var(--fs-h2); font-weight: 900; color: var(--green-d); letter-spacing: -1.4px; line-height: 1.05; }
.section__head p { color: var(--muted); margin-top: 14px; font-size: var(--fs-lead); line-height: 1.65; }

/* Steps */
.steps { list-style: none; display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; counter-reset: s; position: relative; }
/* Numbered step rail — a faint hairline connects the three numbered nodes so the
   sequence reads as one guided path, not three loose cards. Sits behind the
   badges, fades at both ends, and disappears once the grid stacks (≤900px). */
.steps::before {
  content: ""; position: absolute; z-index: 0;
  top: calc(28px + 22px); height: 2px; inset-inline: 16%;
  background: linear-gradient(90deg, transparent, var(--accent-t) 12%, var(--accent-t) 88%, transparent);
  pointer-events: none;
}
.step { background: var(--cream); border: 1px solid var(--line); border-radius: var(--radius); padding: 28px 24px; position: relative; z-index: 1; }
.section--alt .step { background: var(--cream); }
.step { box-shadow: var(--shadow-sm); transition: transform .2s var(--ease), box-shadow .2s; }
/* .step:hover lift moved under @media (hover:hover) and (pointer:fine) — see card-hover block */
.step__num { position: relative; width: 44px; height: 44px; display: grid; place-items: center; background: linear-gradient(140deg, var(--accent), var(--accent-d)); color: #fff; font-family: 'Rubik'; font-weight: 800; border-radius: 14px; font-size: 19px; margin-bottom: 16px; box-shadow: var(--glint), 0 6px 16px rgba(22,163,74,.32); }
@media (max-width: 900px) { .steps::before { display: none; } }
.step h3 { font-size: 19px; color: var(--green-d); margin-bottom: 8px; }
.step p { color: var(--muted); }

/* Categories */
.cats { display: grid; grid-template-columns: repeat(5, 1fr); gap: 16px; }
.cat { background: var(--cream); border: 1px solid var(--line); border-radius: var(--radius); padding: 26px 16px; text-align: center; transition: transform .2s var(--ease), box-shadow .2s; }
.section--alt .cat { background: var(--cream); }
/* .cat:hover lift moved under @media (hover:hover) and (pointer:fine) — see card-hover block */
.cat:focus-visible { transform: translateY(-5px); box-shadow: var(--ring), var(--shadow); border-color: var(--accent); }
.cat:focus-visible .cat__go { opacity: 1; }
.cat { display: block; color: inherit; }
.cat__icon { font-size: 38px; display: block; margin-bottom: 10px; }
.cat h3 { font-size: 17px; color: var(--green-d); }
.cat p { color: var(--muted); font-size: 14px; margin-top: 3px; }
/* Category cards are links to their landing pages — a quiet action cue that is
   always visible (so it reads as tappable on touch, where there is no hover)
   and nudges its arrow on hover. */
.cat__go { display: block; margin-top: 12px; color: var(--accent-ink); font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 13px; opacity: 1; transition: letter-spacing .18s var(--ease); }
.cat:hover .cat__go { letter-spacing: .01em; }

/* Calculator */
.calc { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; align-items: center; }
.calc__copy h2 { font-size: clamp(26px, 3.5vw, 38px); color: var(--green-d); font-weight: 800; }
.calc__copy p { color: var(--muted); margin-top: 14px; font-size: 16px; }
.calc__card { position: relative; overflow: hidden; background: linear-gradient(140deg, var(--green-d), var(--green)); border-radius: 24px; padding: 30px; color: #fff; box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,.08); }
/* Raking specular light across the dark calculator glass. */
.calc__card::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(600px 240px at 80% -20%, rgba(255,255,255,.10), transparent 65%);
}
.calc__card > * { position: relative; }
.calc__row { display: flex; justify-content: space-between; align-items: center; font-weight: 600; margin-bottom: 12px; }
.calc__row output { font-family: 'Rubik'; font-weight: 800; font-size: 22px; color: var(--lime); }
.calc__card input[type="range"] { width: 100%; -webkit-appearance: none; appearance: none; height: 6px; border-radius: 999px; background: rgba(255,255,255,.25); outline: none; }
.calc__card input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; width: 26px; height: 26px; border-radius: 50%; background: var(--accent); border: 3px solid #fff; cursor: pointer; box-shadow: 0 3px 10px rgba(0,0,0,.35); }
.calc__card input[type="range"]::-moz-range-thumb { width: 22px; height: 22px; border: 3px solid #fff; border-radius: 50%; background: var(--accent); cursor: pointer; }
/* Keyboard focus on the slider — a ring around the thumb (the bare outline:none
   above left arrow-key users with no focus cue on the dark calc card). */
.calc__card input[type="range"]:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 3px var(--green-d), 0 0 0 6px #fff; }
.calc__card input[type="range"]:focus-visible::-moz-range-thumb { box-shadow: 0 0 0 3px var(--green-d), 0 0 0 6px #fff; }
.calc__result { text-align: center; margin: 26px 0 22px; }
.calc__resultLabel { display: block; font-size: 14px; opacity: .8; }
.calc__resultBig { display: block; font-family: 'Rubik'; font-size: 52px; font-weight: 900; color: var(--value); letter-spacing: -1px; }
.calc__resultUnit { font-size: 14px; opacity: .8; }
.calc__fine { font-size: 12px; opacity: .65; text-align: center; margin-top: 12px; }

/* Features */
.features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.feature { background: rgba(255,255,255,.66); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border: 1px solid rgba(255,255,255,.6); border-radius: var(--radius); padding: 26px; box-shadow: var(--shadow-sm); transition: transform .2s var(--ease), box-shadow .2s; }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) { .feature { background: #fff; } }
/* .feature:hover lift moved under @media (hover:hover) and (pointer:fine) — see card-hover block */
.feature__icon { font-size: 30px; display: grid; place-items: center; width: 56px; height: 56px; background: var(--mint); border-radius: 16px; margin-bottom: 16px; }
.feature h3 { font-size: 18px; color: var(--green-d); margin-bottom: 6px; }
.feature p { color: var(--muted); }
.feature em { color: var(--accent-ink); font-style: normal; font-weight: 700; }

/* Testimonials */
.quotes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.quote { background: var(--cream); border: 1px solid var(--line); border-radius: var(--radius); padding: 26px; }
.section--alt .quote { background: var(--cream); }
/* Rating stars — amber VALUE, darkened to clear the 3:1 graphical bar on white
   (the bright #f5a623 fill sat at ~2.3:1). Still reads as warm gold. */
.stars { color: var(--value-ink); letter-spacing: 2px; margin-bottom: 12px; }
.quote blockquote { font-size: 17px; font-weight: 600; color: var(--green-d); line-height: 1.5; }
.quote figcaption { color: var(--muted); font-size: 14px; margin-top: 12px; }
.quote figcaption span { font-size: 12px; opacity: .7; }

/* FAQ */
.faq__list { max-width: 760px; margin: 0 auto; display: grid; gap: 12px; }
.faq__list details { background: var(--cream); border: 1px solid var(--line); border-radius: 14px; padding: 4px 20px; transition: box-shadow .2s var(--ease), border-color .2s, background .2s; }
.faq__list details:hover { border-color: var(--ink-200); }
.faq__list details[open] { box-shadow: var(--shadow); background: #fff; border-color: var(--ink-100); }
.faq__list summary { font-family: 'Rubik'; font-weight: 700; font-size: 17px; color: var(--green-d); padding: 16px 0; cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: center; gap: 12px; transition: color .15s; border-radius: 8px; }
.faq__list summary::-webkit-details-marker { display: none; }
.faq__list summary:focus-visible { outline: none; box-shadow: var(--ring-flush); }
.faq__list details:not([open]) summary:hover { color: var(--accent-ink); }
/* The toggle marker as a soft ink chip — rotates to an × when the panel opens. */
.faq__list summary::after {
  content: "+"; flex: none; width: 28px; height: 28px; display: grid; place-items: center;
  font-size: 22px; line-height: 1; color: var(--ink-600); background: var(--mint); border-radius: 9px;
  transition: transform .25s var(--ease), color .15s, background .15s;
}
.faq__list details:not([open]) summary:hover::after { color: var(--accent-ink); background: var(--accent-t); }
.faq__list details[open] summary::after { transform: rotate(45deg); color: var(--accent-ink); background: var(--accent-t); }
.faq__list details p { color: var(--muted); padding: 0 0 18px; }

/* CTA band */
.cta { background: linear-gradient(140deg, var(--green-d), var(--green)); color: #fff; padding: 72px 0; position: relative; overflow: hidden; }
/* Premium ink surface: a soft overhead light pool + a top edge highlight, so
   the dark band reads as a lit object rather than a flat fill. */
.cta::before {
  content: ""; position: absolute; inset: 0; pointer-events: none; z-index: 0;
  background:
    radial-gradient(900px 360px at 50% -30%, rgba(255,255,255,.10), transparent 70%),
    linear-gradient(180deg, rgba(255,255,255,.06), transparent 22%);
}
.cta .container { position: relative; z-index: 1; }
.cta__inner { text-align: center; max-width: 640px; margin: 0 auto; }
.cta h2 { font-size: clamp(30px, 4.6vw, 52px); font-weight: 900; letter-spacing: -1.4px; line-height: 1.04; }
.cta p { opacity: .85; margin-top: 12px; font-size: 18px; }
.cta__form { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; margin: 30px 0 12px; }
.cta__form input { flex: 1 1 220px; min-width: 0; padding: 14px 16px; border: 0; border-radius: 14px; font-family: 'Assistant'; font-size: 16px; background: rgba(255,255,255,.95); color: var(--ink); }
/* Offset white ring — a flush light-grey outline vanished against the white
   input itself; the offset lets it read against the dark band. */
.cta__form input:focus { outline: 3px solid #fff; outline-offset: 2px; }
.cta__form .btn { flex: 0 0 auto; }
.cta__note { min-height: 22px; font-weight: 700; color: var(--lime); }
.cta__wa { display: inline-block; margin-top: 8px; color: #fff; font-weight: 700; opacity: .9; border-bottom: 1px dashed rgba(255,255,255,.5); padding-bottom: 2px; }
.cta__wa:hover { opacity: 1; }
.cta__wa .ico { width: 16px; height: 16px; vertical-align: -3px; margin-inline-end: 4px; }

/* Legal consent (terms / privacy mandatory, marketing optional) — RTL, sits
   above the submit button on the dark CTA band. Real <label for> + checkbox.
   The id-based input rules below override the broad `.cta__form input` styling
   so the checkboxes render as native boxes, not white text fields. */
.consent { flex: 1 1 100%; display: flex; flex-direction: column; gap: 8px; text-align: start; margin: 2px 0 6px; }
.consent__row { display: flex; align-items: flex-start; gap: 10px; cursor: pointer; font-size: 13.5px; line-height: 1.45; color: rgba(255,255,255,.92); font-weight: 500; }
.cta__form .consent__row input[type="checkbox"] { flex: 0 0 auto; width: 20px; height: 20px; min-width: 20px; margin: 1px 0 0; padding: 0; border-radius: 5px; background: none; accent-color: var(--green); cursor: pointer; }
.cta__form .consent__row input[type="checkbox"]:focus-visible { outline: 3px solid var(--lime); outline-offset: 2px; }
.consent__row a { color: var(--lime); font-weight: 700; text-decoration: underline; text-underline-offset: 2px; }
.consent__row a:hover { opacity: .85; }

/* Footer */
.footer { background: var(--green-d); color: rgba(255,255,255,.8); padding: 56px 0 28px; position: relative; }
/* A 1px luminous top edge — the same glass-glint language, scaled to the band. */
.footer::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 1px; background: linear-gradient(90deg, transparent, rgba(255,255,255,.14), transparent); }
.footer__inner { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr 1fr; gap: 28px; }
.footer__col { position: relative; }
/* Hairline dividers between the link columns — a quiet editorial rhythm. RTL:
   the rule sits on the inline-start of each column except the brand block. */
.footer__col + .footer__col::before {
  content: ""; position: absolute; inset-block: 0 8px; inset-inline-start: -14px; width: 1px;
  background: linear-gradient(180deg, transparent, rgba(255,255,255,.10) 18%, rgba(255,255,255,.10) 82%, transparent);
}
.footer__col h4 { font-family: 'Rubik'; font-size: 13px; letter-spacing: .04em; text-transform: uppercase; color: rgba(255,255,255,.5); font-weight: 700; margin-bottom: 14px; }
/* Brand row — the logo + tagline lead the footer with a touch more presence. */
.footer__brand .brand { margin-bottom: 4px; }
.footer__brand p { margin-top: 12px; max-width: 30em; font-size: 14px; color: rgba(255,255,255,.72); }
.footer__links, .footer__contact { display: flex; flex-direction: column; gap: 11px; padding-top: 6px; }
.footer__links a, .footer__contact a { position: relative; width: fit-content; color: rgba(255,255,255,.8); font-weight: 600; transition: color .15s; border-radius: 6px; }
.footer__links a:hover, .footer__contact a:hover { color: var(--lime); }
.footer__links a:focus-visible, .footer__contact a:focus-visible { box-shadow: var(--ring); }
/* Social row — a horizontal set of ink-glass icon buttons (markup may add
   .footer__social with .footer__social-link children carrying an .ico/svg). */
.footer__social { display: flex; gap: 10px; margin-top: 16px; }
.footer__social-link {
  width: 40px; height: 40px; flex: none; display: grid; place-items: center;
  border-radius: 50%; color: rgba(255,255,255,.85);
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.12);
  box-shadow: var(--glint);
  transition: background .18s, color .18s, transform .18s var(--ease-spring), border-color .18s;
}
.footer__social-link:hover { background: var(--accent); color: #fff; border-color: var(--accent); transform: translateY(-2px); }
/* On dark, --accent lifts to bright green; a dark-ink glyph keeps the hover AA. */
:root[data-theme="dark"] .footer__social-link:hover { color: #0B0F14; }
/* Trust + form-reassurance microcopy (commission honesty + phone data-use). */
.hero__trust-note { margin-top: 10px; font-size: 13px; color: var(--muted); }
.cta__form-note { margin: 6px 2px 2px; font-size: 12px; color: var(--muted); line-height: 1.5; }
.footer__social-link:focus-visible { box-shadow: var(--ring); }
.footer__social-link svg, .footer__social-link .ico { width: 18px; height: 18px; }
.footer__bottom { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; margin-top: 24px; padding-top: 22px; border-top: 1px solid rgba(255,255,255,.12); font-size: 13px; color: rgba(255,255,255,.62); }
/* Commission disclosure (Consumer-Protection §7b) — prominent, full-width, on
   every page; brighter than the copyright line so the honesty reads at a glance. */
.footer__disclosure { width: 100%; max-width: var(--maxw); margin: 40px auto 0; padding: 14px 20px 0; font-size: 13.5px; line-height: 1.65; color: rgba(255,255,255,.78); border-top: 1px solid rgba(255,255,255,.12); }
.footer__disclosure a { color: #fff; text-decoration: underline; }

/* ── Floating WhatsApp contact (mobile only) ─────────────────────────────────
   Keeps the editorial desktop layout clean; on touch it gives a one-tap line
   to a human. On-brand green "action" (not WhatsApp-green) per the palette. */
.wa-fab { display: none; }
@media (max-width: 760px) {
  .wa-fab {
    position: fixed; inset-inline-end: 16px; bottom: 16px; z-index: 45;
    width: 54px; height: 54px; border-radius: 50%;
    display: grid; place-items: center; color: #fff;
    background: linear-gradient(165deg, var(--accent), var(--accent-d));
    box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 10px 24px rgba(22,163,74,.36), 0 2px 6px rgba(21,128,61,.26);
    transition: transform .2s var(--ease-spring), box-shadow .2s var(--ease);
  }
  .wa-fab:active { transform: scale(.94); }
  .wa-fab svg { width: 26px; height: 26px; display: block; }
}
@media (prefers-reduced-motion: reduce) { .wa-fab { transition: none; } }

/* ── Sticky mobile CTA bar ────────────────────────────────────────────────────
   Injected by script.js once the visitor scrolls past the first screen; hidden
   again while the real lead form is in view so we never show two CTAs at once. */
.sticky-cta {
  display: none;
  position: fixed; inset-inline: 0; bottom: 0; z-index: 46;
  padding: 10px 14px calc(10px + env(safe-area-inset-bottom));
  background: var(--white); border-top: 1px solid var(--line);
  box-shadow: 0 -8px 24px rgba(15,27,34,.10);
  transform: translateY(110%); transition: transform .25s var(--ease);
}
.sticky-cta .btn { width: 100%; }
.sticky-cta.is-visible { transform: translateY(0); }
@media (max-width: 720px) { .sticky-cta { display: block; } }
@media (prefers-reduced-motion: reduce) { .sticky-cta { transition: none; } }
/* Lift the WhatsApp FAB above the sticky bar so they never overlap. */
body:has(.sticky-cta.is-visible) .wa-fab { bottom: 76px; }

/* ── Post-submit referral nudge ──────────────────────────────────────────── */
.cta__referral { margin-top: 14px; text-align: center; font-size: 14px; color: var(--muted); }
.cta__referral a { color: var(--accent-ink); font-weight: 700; }

/* ── CTA objection-handling chips ─────────────────────────────────────────────
   Sits inside the dark CTA band, just below the submit button — light-on-dark
   reassurance (free / neutral / no-commitment / number-kept). Every line is an
   already-true fact about the service, not a marketing claim. */
.cta__objections {
  list-style: none; margin: 16px 0 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: 8px 14px; justify-content: center;
  flex: 1 1 100%;
}
.cta__objections li {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 13px; font-weight: 600; line-height: 1.3;
  color: rgba(255,255,255,.88);
}
.cta__objections .ico { width: 15px; height: 15px; flex: none; color: var(--lime); }

/* ── Honest trust block (real-only E-E-A-T strip before a CTA) ─────────────────
   Verifiable catalogue counts + transparent methodology + commission disclosure
   + price caveat. Light-surface glass panel using the standard tokens; the dark
   theme overrides come for free from the [data-theme] token swap. */
.trust-block__inner {
  max-width: 920px; margin: 0 auto; padding: clamp(24px, 4vw, 40px);
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
}
.trust-block__head { text-align: center; margin-bottom: 22px; }
.trust-block__head .eyebrow { justify-content: center; }
.trust-block__head h2 { font-family: 'Rubik'; font-size: clamp(22px, 3vw, 30px); font-weight: 800; color: var(--green-d); letter-spacing: -.6px; margin-top: 8px; }
/* Real catalogue counters — the only numbers shown are the provable ones. */
.trust-stats {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
  margin: 0 0 22px; padding: 0;
}
.trust-stat {
  text-align: center; padding: 16px 8px;
  background: var(--mint); border: 1px solid var(--line);
  border-radius: var(--radius-sm);
}
.trust-stat dd { font-family: 'Rubik'; font-size: clamp(28px, 5vw, 40px); font-weight: 900; color: var(--accent-ink); line-height: 1; }
.trust-stat dt { margin-top: 6px; font-size: 13px; font-weight: 600; color: var(--muted); }
.trust-points { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 14px; }
.trust-points li { display: flex; align-items: flex-start; gap: 12px; font-size: 15px; line-height: 1.6; color: var(--muted); }
.trust-points li b { color: var(--green-d); font-weight: 700; }
.trust-points .ico { width: 22px; height: 22px; flex: none; margin-top: 2px; color: var(--accent); }
.trust-points a { color: var(--accent-ink); font-weight: 700; text-decoration: underline; text-underline-offset: 2px; white-space: nowrap; }
.trust-points a:hover { opacity: .85; }
@media (max-width: 560px) {
  .trust-stats { grid-template-columns: 1fr; }
  .trust-points a { white-space: normal; }
}

/* ── Category landing hero (generated pages) ─────────────────────────── */
.lead-hero { padding: 56px 0 8px; text-align: center; position: relative; }
.lead-hero::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 360px; z-index: -1;
  background: radial-gradient(800px 380px at 70% -20%, rgba(17,24,39,.06), transparent 60%);
}
.lead-hero h1 { font-family: 'Rubik'; font-size: clamp(34px, 5.4vw, 66px); font-weight: 900; color: var(--green-d); letter-spacing: -1.6px; line-height: 1.04; }
.lead-hero h1 .hl { color: var(--green); }
.lead-hero p { color: var(--muted); font-size: 18px; margin: 16px auto 26px; max-width: 38em; }
.lead-hero .hero__cta { justify-content: center; }
.feature--check .feature__icon { background: var(--lime); color: var(--green-d); font-weight: 900; }
.crumbs { font-size: 14px; color: var(--muted); margin-bottom: 18px; }
.crumbs a { color: var(--green); font-weight: 600; }

/* ── Guides / articles (generated) ───────────────────────────────────── */
.article-hero { padding: 44px 0 4px; }
.article-hero h1 { font-family: 'Rubik'; font-size: clamp(27px, 3.8vw, 44px); font-weight: 900; color: var(--green-d); letter-spacing: -.4px; max-width: 17em; }
.article-meta { color: var(--muted); font-size: 14px; margin-top: 12px; display: flex; gap: 14px; flex-wrap: wrap; }
.prose { max-width: 760px; margin: 0 auto; }
.prose > p { font-size: 17px; color: var(--ink-700); margin: 0 0 20px; line-height: 1.8; }
.prose h2 { font-family: 'Rubik'; font-size: 25px; color: var(--green-d); margin: 36px 0 12px; }
.prose h3 { font-family: 'Rubik'; font-size: 19px; color: var(--green-d); margin: 22px 0 8px; }
.prose ul { padding-inline-start: 22px; margin: 0 0 18px; }
.prose li { margin-bottom: 9px; font-size: 17px; color: var(--ink-700); line-height: 1.72; }
/* Inline links in long-form copy: green (action), with an underline that
   thickens on hover — clearly clickable without shouting through the body. */
.prose a:not([class]) { color: var(--accent-ink); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; transition: text-decoration-thickness .15s, color .15s; }
.prose a:not([class]):hover { color: var(--accent-d); text-decoration-thickness: 2px; }
.tldr { background: var(--cream); border: 1px solid var(--line); border-inline-start: 4px solid var(--green); border-radius: 12px; padding: 16px 18px; margin: 0 0 30px; }
.tldr b { color: var(--green-d); }
.article-cta { position: relative; overflow: hidden; max-width: 760px; margin: 36px auto 0; background: linear-gradient(140deg, var(--green-d), var(--green)); color: #fff; border-radius: 18px; padding: 28px; text-align: center; box-shadow: var(--shadow-ink), inset 0 1px 0 rgba(255,255,255,.08); }
.article-cta::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(560px 220px at 50% -30%, rgba(255,255,255,.09), transparent 70%); }
.article-cta > * { position: relative; }
.article-cta h3 { font-family: 'Rubik'; font-size: 22px; margin-bottom: 6px; }
.article-cta p { opacity: .9; margin-bottom: 16px; }
.guide-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.guide-card { background: rgba(255,255,255,.66); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border: 1px solid rgba(255,255,255,.6); border-radius: var(--radius); padding: 24px; box-shadow: 0 3px 10px rgba(15,27,34,.03); transition: transform .2s var(--ease), box-shadow .2s; display: flex; flex-direction: column; }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) { .guide-card { background: #fff; } }
/* .guide-card:hover lift moved under @media (hover:hover) and (pointer:fine) — see card-hover block */
/* The whole card is an <a> — give it the focus ring + the same lift as hover. */
.guide-card:focus-visible { box-shadow: var(--ring), var(--shadow); border-color: var(--accent); transform: translateY(-4px); }
.guide-card .tag-cat { align-self: flex-start; background: var(--accent-t); color: var(--accent-ink); font-weight: 700; font-size: 12px; padding: 4px 11px; border-radius: 999px; margin-bottom: 14px; letter-spacing: .01em; transition: background .18s, color .18s; }
.guide-card h3 { font-family: 'Rubik'; font-size: 19px; color: var(--green-d); margin-bottom: 8px; line-height: 1.32; transition: color .15s; }
.guide-card:hover h3, .guide-card:focus-visible h3 { color: var(--accent-ink); }
.guide-card p { color: var(--muted); flex: 1; line-height: 1.6; }
/* Meta line sits under a hairline rule — separates the date/read-time from the
   body copy and gives the card a clear, editorial footer. */
.guide-card .meta { color: var(--ink-500); font-size: 13px; margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--ink-100); }
.guide-cards--2 { grid-template-columns: repeat(2, 1fr); max-width: 760px; margin-inline: auto; }
/* Category-page related guides: a balanced 2×2 with a touch more air than the
   3-up guides grid, so each card reads as a deliberate pick, not a list item. */
.guide-cards--4 { grid-template-columns: repeat(2, 1fr); max-width: 900px; margin-inline: auto; gap: 22px; }
@media (max-width: 900px) { .guide-cards, .guide-cards--2, .guide-cards--4 { grid-template-columns: 1fr; } }
@media (max-width: 560px) { .guide-cards, .guide-cards--2, .guide-cards--4 { gap: 14px; } }

/* ── Plan catalogue cards ────────────────────────────────────────────── */
.plan-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(248px, 1fr)); gap: 14px; }
/* Homepage "featured deals" — a centered 3-up showcase of real plan cards. */
.plan-grid--featured { grid-template-columns: repeat(3, 1fr); max-width: 880px; margin-inline: auto; }
@media (max-width: 860px) { .plan-grid--featured { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .plan-grid--featured { grid-template-columns: 1fr; } }
.plan { background: rgba(255,255,255,.7); backdrop-filter: blur(16px) saturate(130%); -webkit-backdrop-filter: blur(16px) saturate(130%); border: 1px solid rgba(255,255,255,.65); border-radius: 18px; padding: 16px; display: flex; flex-direction: column; box-shadow: var(--shadow-sm); transition: box-shadow .22s var(--ease), transform .22s var(--ease), border-color .18s; }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) { .plan { background: #fff; } }
/* .plan:hover lift moved under @media (hover:hover) and (pointer:fine) — see card-hover block */
/* Keyboard parity — tabbing into a card's link lifts it like a hover, with a
   ring so the whole card is the visible focus target (its inner link's own
   ring would be lost against the glass). */
.plan:focus-within { transform: translateY(-4px); box-shadow: var(--ring), var(--shadow); border-color: var(--accent); }
.plan__top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.plan__provider { font-family: 'Rubik'; font-weight: 800; color: var(--green-d); font-size: 16px; }
.plan__id { display: flex; align-items: center; gap: 9px; min-width: 0; }
.plogo { display: inline-grid; place-items: center; border-radius: 50%; border: 1.5px solid; border-color: currentColor; font-family: 'Rubik'; font-weight: 800; flex: none; vertical-align: middle; letter-spacing: -.5px; }
/* Real logo image variant: a UNIFORM white rounded badge container that every
   provider logo sits inside — a consistent tile rim + glass-glint, so a row of
   mixed brand marks reads as one tidy set. The mark itself is never recoloured. */
.plogo--img { background: #fff; border: 1px solid var(--line); border-radius: var(--radius-xs); overflow: hidden; box-shadow: var(--glint), var(--shadow-sm); }
.plogo--img img { width: 100%; height: 100%; object-fit: contain; padding: 4px; display: block; }
.provider-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 14px; }
.provider-card { background: var(--white); border: 1px solid var(--line); border-radius: 18px; padding: 18px; display: flex; align-items: center; gap: 12px; box-shadow: var(--shadow-sm); transition: transform .2s var(--ease), box-shadow .2s; }
/* .provider-card:hover lift moved under @media (hover:hover) and (pointer:fine) — see card-hover block */
.provider-card:focus-visible, .provider-card:focus-within { transform: translateY(-3px); box-shadow: var(--ring), var(--shadow); border-color: var(--accent); }
.provider-card b { font-family: 'Rubik'; color: var(--green-d); font-size: 16px; display: block; }
.provider-card small { color: var(--muted); font-size: 13px; display: block; }
.provider-card__cats { font-size: 11px !important; opacity: .65; margin-top: 2px; }
.plan__provider:hover { color: var(--green); text-decoration: underline; }
.plan__net { background: var(--mint); color: var(--green); font-weight: 700; font-size: 11px; padding: 3px 8px; border-radius: 8px; white-space: nowrap; }
.plan__name { color: var(--muted); font-size: 13px; margin-top: 3px; }
.plan__chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
/* Spec chips — a crisp inset rim + faint top-light so they read as small
   pressed tablets rather than flat outlines; tight, even tracking for the
   numeric specs they carry. */
.pchip {
  background: linear-gradient(180deg, #fff, var(--cream));
  border: 1px solid var(--ink-100); color: var(--ink-700);
  font-size: 12px; font-weight: 600; line-height: 1.4; padding: 3px 10px; border-radius: 999px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.8); letter-spacing: -.005em;
}
.plan__flags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.pflag { font-size: 11px; font-weight: 700; padding: 3px 8px; border-radius: 8px; background: var(--mint); color: var(--green); }
.pflag--5g { background: var(--lime); color: var(--green-d); }
.plan__bottom { margin-top: auto; padding-top: 14px; display: flex; align-items: flex-end; justify-content: space-between; gap: 8px; }
.plan__price b { font-family: 'Rubik'; font-size: 24px; font-weight: 800; color: var(--green); }
.plan__price span { color: var(--muted); font-size: 12px; }
.plan__after { display: block; color: var(--muted); font-size: 11px; }
.plan--hasjump .plan__after { color: var(--value-ink); font-weight: 600; }
.plan--hasjump .plan__after::before { content: '⚠ '; }
/* The site's most-repeated CTA (every plan card) — a real green tertiary
   button: ACTION colour, 44px hit area (negative margin keeps the layout),
   hover pill + arrow nudge, tactile press. */
.plan__actions { display: flex; align-items: center; gap: 6px; margin-top: 10px; }
.plan__cta {
  flex: 1 1 auto; align-self: flex-start;
  display: inline-flex; align-items: center; gap: 6px;
  font-family: 'Rubik'; font-weight: 700; font-size: 14px; color: var(--accent-ink);
  text-decoration: none; padding: 10px 14px; margin-inline-start: -14px; min-height: 44px;
  border-radius: 12px; transition: background .18s, color .15s, transform .15s var(--ease-spring);
}
.plan__cta:hover { background: var(--accent-t); color: var(--accent-d); }
.plan__cta:hover .ico { transform: translateX(-2px); }
.plan__cta .ico { transition: transform .2s var(--ease); }
.plan__cta:active { transform: scale(.97); }
.plan__compare { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 8px; border: 1px solid var(--line); background: var(--cream); font-size: 16px; text-decoration: none; transition: border-color .15s, background .15s, transform .15s; flex-shrink: 0; }
.plan__compare:hover { border-color: var(--accent); background: var(--accent-t); transform: scale(1.07); }

/* filter bar (all-plans page) */
.filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 22px; }
.filter-btn { background: var(--white); border: 1px solid var(--line); color: var(--green-d); font-family: 'Rubik'; font-weight: 700; font-size: 14px; padding: 8px 16px; min-height: 44px; display: inline-flex; align-items: center; border-radius: 999px; cursor: pointer; transition: background .15s, color .15s, border-color .15s, transform .15s var(--ease-spring), box-shadow .18s; }
.filter-btn:hover { transform: translateY(-1px); border-color: var(--ink-300); box-shadow: var(--shadow-sm); }
.filter-btn:active { transform: scale(.97); }
/* Selected = green, the one "active" language across the site (matches the
   nav's aria-current) — was solid ink here and grey one row below. */
/* Solid green fills behind WHITE text use --accent-d: white on --accent (#16A34A)
   is only 3.3:1 (fails normal AA), while on --accent-d (#15803D) it's 5.0:1. */
.filter-btn.active { background: var(--accent-d); color: #fff; border-color: var(--accent-d); }
.filter-search { flex: 1 1 220px; min-width: 0; min-height: 44px; padding: 10px 16px; border: 1px solid var(--line); border-radius: 999px; font-family: 'Assistant'; font-size: 15px; background: var(--white); transition: border-color .15s, box-shadow .15s; }
.filter-search:hover { border-color: var(--ink-300); }
/* Use the site's own focus ring (was a raw 2px outline — inconsistent with
   :focus-visible everywhere else, and it fired on mouse clicks too). */
.filter-search:focus { outline: none; }
.filter-search:focus-visible { outline: none; box-shadow: var(--ring); border-color: var(--accent); }
select.filter-search { cursor: pointer; -webkit-appearance: none; appearance: none; padding-inline-end: 36px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%23111827' d='M6 8 0 0h12z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: left 14px center; }
input[type="number"].filter-search { flex: 0 0 auto; width: 90px; -moz-appearance: textfield; }
input[type="number"].filter-search::-webkit-outer-spin-button,
input[type="number"].filter-search::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.filter-price { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
.filter-price__label { font-size: 14px; color: var(--sage); font-family: 'Assistant'; font-weight: 600; white-space: nowrap; }
.flag-chip { background: var(--white); border: 1px solid var(--line); color: var(--green-d); font-family: 'Rubik'; font-weight: 700; font-size: 13px; padding: 8px 14px; min-height: 44px; border-radius: 999px; cursor: pointer; transition: background .15s, color .15s, border-color .15s, transform .15s var(--ease-spring), box-shadow .18s; }
.flag-chip:hover { transform: translateY(-1px); border-color: var(--ink-300); box-shadow: var(--shadow-sm); }
.flag-chip:active { transform: scale(.97); }
.flag-chip.active { background: var(--accent-t); color: var(--accent-ink); border-color: var(--accent); }
/* Empty state (no plans match the filters) — an intentional, illustrated
   pause rather than a bare line of grey text that could read as broken. */
.plan-count { margin-right: auto; font-size: 13px; color: var(--ink-500, #6b7280); white-space: nowrap; }
.calc-result { display: grid; gap: 10px; }
.calc-result__row { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; }
.calc-result__row strong { font-family: 'Rubik'; text-align: left; }
.calc-result__sep { border: none; border-top: 1px solid #D1D5DB; margin: 2px 0; }
.calc-result__row--main { font-size: 1.05rem; }
.calc-result__row--main .saving { color: var(--value-ink); font-size: 1.15rem; }
.plan-empty {
  text-align: center; color: var(--muted); padding: 56px 24px; display: none;
  background: var(--cream); border: 1px dashed var(--ink-200); border-radius: var(--radius);
}
.plan-empty::before { content: "🔍"; display: block; font-size: 30px; margin-bottom: 12px; opacity: .7; }
.plan-empty strong { display: block; font-family: 'Rubik'; font-weight: 800; color: var(--green-d); font-size: 17px; margin-bottom: 4px; }
.plan-empty__reset {
  background: none; border: none; padding: 0; font: inherit; color: var(--accent-ink);
  font-weight: 700; text-decoration: underline; cursor: pointer;
}
.plan-empty__reset:hover, .plan-empty__reset:focus-visible { color: var(--accent-d, var(--accent-ink)); }
.cat-plans-head { display: flex; align-items: baseline; gap: 10px; margin: 30px 0 14px; }
.cat-plans-head h2 { font-family: 'Rubik'; font-size: 24px; color: var(--green-d); }
.cat-plans-head .count { color: var(--muted); font-size: 14px; }

/* ── Side-by-side comparison (compare.html) ──────────────────────────────── */
.compare-picks { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-bottom: 24px; }
.compare-pick { flex: none; width: 100%; }
.compare-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.cmp-empty {
  text-align: center; color: var(--muted); padding: 56px 24px;
  background: var(--cream); border: 1px dashed var(--ink-200); border-radius: var(--radius);
}
.cmp-empty::before { content: "⇄"; display: block; font-size: 26px; margin-bottom: 10px; opacity: .7; color: var(--accent); }
.cmp-table { width: 100%; border-collapse: collapse; background: var(--white); border: 1px solid var(--line); border-radius: 14px; overflow: hidden; }
.cmp-table th, .cmp-table td { padding: 13px 14px; text-align: center; border-bottom: 1px solid var(--line); font-size: 15px; }
.cmp-table thead th { background: var(--green-d); color: #fff; font-family: 'Rubik'; font-weight: 800; vertical-align: top; }
.cmp-table thead th small { display: block; font-weight: 500; font-size: 12px; opacity: .8; margin-top: 3px; }
.cmp-table tbody th[scope="row"] { text-align: start; font-family: 'Rubik'; font-weight: 700; color: var(--green-d); background: rgba(17,24,39,.04); white-space: nowrap; }
.cmp-table tbody tr { transition: background .15s; }
.cmp-table tbody tr:hover td { background: var(--accent-t); }
.cmp-table tbody tr:last-child th, .cmp-table tbody tr:last-child td { border-bottom: none; }
.cmp-price { font-family: 'Rubik'; font-weight: 900; font-size: 18px; color: var(--green-d); }
.cmp-after { display: block; font-size: 11px; color: var(--muted); }
.cmp-yes { color: var(--green); font-weight: 900; }
/* "Absent" mark — must stay VISIBLE (it carries meaning: feature not included).
   --line was near-invisible on both white (1.2:1) and dark cards; --muted reads
   as a quiet-but-legible grey in both themes. */
.cmp-no { color: var(--muted); }
.cmp-cta-row td { background: rgba(17,24,39,.05); }
.cmp-cta-row .plan__cta { margin-top: 0; align-self: center; }
.cmp-share { margin-top: 16px; font-size: 13px; }
@media (max-width: 640px) {
  .compare-picks { grid-template-columns: 1fr; }
  .cmp-table th, .cmp-table td { padding: 10px 9px; font-size: 13.5px; }
}

/* ── App showcase page (app.html) ────────────────────────────────────────── */
.lead-hero__cta { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; margin-top: 6px; }
.app-group { margin-top: 30px; }
.app-group .section__head { margin-bottom: 18px; }
.app-group:first-of-type { margin-top: 8px; }

/* AI advisor preview */
.ai-demo { max-width: 600px; margin: 0 auto; }
.ai-chat { display: grid; gap: 12px; background: var(--white); border: 1px solid var(--line); border-radius: 20px; padding: 20px; box-shadow: var(--shadow); }
.ai-bubble { padding: 12px 16px; border-radius: 16px; line-height: 1.5; max-width: 82%; font-size: 15px; }
.ai-bubble--bot { background: rgba(17,24,39,.05); color: var(--ink); border-bottom-inline-start: 4px solid var(--green); justify-self: start; border-bottom-left-radius: 4px; }
.ai-bubble--me { background: var(--green); color: #fff; justify-self: end; border-bottom-right-radius: 4px; }
.ai-chips { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-top: 16px; }
.ai-chip { background: var(--white); border: 1px solid var(--line); color: var(--green-d); font-weight: 600; font-size: 13px; padding: 8px 14px; border-radius: 999px; cursor: pointer; transition: background .15s, border-color .15s, transform .15s var(--ease-spring); }
.ai-chip:hover { background: var(--accent-t); border-color: var(--accent); color: var(--accent-ink); }
.ai-chip:active { transform: scale(.97); }
.ai-foot { text-align: center; color: var(--muted); font-size: 13px; margin-top: 14px; }
.ai-input { display: flex; gap: 8px; margin-top: 14px; }
.ai-input input { flex: 1; min-width: 0; padding: 12px 16px; border: 1px solid var(--line); border-radius: 999px; font-family: inherit; font-size: 15px; background: var(--white); color: var(--ink); }
.ai-input input:focus-visible { outline: none; box-shadow: var(--ring); border-color: var(--accent); }
.ai-input .btn { padding: 12px 20px; white-space: nowrap; }
.ai-bubble--typing { display: inline-flex; gap: 4px; align-items: center; }
.ai-bubble--typing span { width: 6px; height: 6px; border-radius: 50%; background: currentColor; opacity: .5; animation: ai-typing 1s ease-in-out infinite; }
.ai-bubble--typing span:nth-child(2) { animation-delay: .15s; }
.ai-bubble--typing span:nth-child(3) { animation-delay: .3s; }
@keyframes ai-typing { 0%, 80%, 100% { opacity: .25; } 40% { opacity: .9; } }
@media (prefers-reduced-motion: reduce) {
  .ai-bubble--typing span { animation: none; opacity: .6; }
}

/* ── Real app screenshots (app.html "הצצה פנימה") ──────────────────────────── */
.app-shots { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 280px)); gap: 28px; justify-content: center; }
.app-shot { margin: 0; text-align: center; }
.app-shot > img {
  width: 100%; height: auto; display: block;
  border-radius: 26px; border: 1px solid var(--line);
  box-shadow: var(--shadow-lg);
  background: var(--cream);
}
.app-shot figcaption {
  margin-top: 12px; font-family: 'Rubik'; font-weight: 700; font-size: 14px; color: var(--ink-700);
  display: inline-flex; align-items: center; gap: 6px;
}
.app-shot__zoom { width: 16px; height: 16px; vertical-align: -3px; }
@media (max-width: 640px) {
  .ai-bubble { max-width: 90%; }
}

/* ── Scroll reveal ───────────────────────────────────────────────────── */
.reveal { opacity: 0; transform: translateY(22px); transition: opacity .4s var(--ease), transform .4s var(--ease); }
.reveal.in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
  .phone { animation: none; }
  html { scroll-behavior: auto; }
}

/* ── Responsive ──────────────────────────────────────────────────────── */
@media (max-width: 900px) {
  .hero__inner { grid-template-columns: 1fr; gap: 36px; }
  .hero__visual { order: -1; }
  .steps, .features, .quotes { grid-template-columns: 1fr; }
  .cats { grid-template-columns: repeat(2, 1fr); }
  .calc { grid-template-columns: 1fr; gap: 28px; }
  .footer__inner { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 520px) { .footer__inner { grid-template-columns: 1fr; } }
@media (max-width: 760px) {
  .nav__links, .nav__cta, .nav__wa { display: none; }
  .nav__toggle { display: block; }
  .nav__mobile.open { display: flex; }
  .section { padding: 56px 0; }
  .section__head { margin-bottom: 36px; }
  .hero { padding: 36px 0 28px; }
  .hero__stats { gap: 22px; }
  /* Stack the lead-form CTA full-width on phones so the primary action never
     gets squeezed to a tiny pill beside the input. */
  .cta__form .btn { flex: 1 1 100%; }
}
@media (max-width: 600px) {
  /* Tighten the plan grid gutters so two-thumb scrolling feels dense, not gappy. */
  .plan-grid { gap: 12px; }
  .filters { gap: 7px; }
  .hero h1 { letter-spacing: -1.2px; }
}
@media (max-width: 420px) {
  .cats { grid-template-columns: 1fr; }
}
/* ── Small phones (320–480) ────────────────────────────────────────────────
   Tighten to a single column, shrink the hero headline into a phone-safe
   clamp, fully stack the calculator + its card, and let the trust strip wrap
   without crowding. Uses the --space-* rhythm for consistent gutters. */
@media (max-width: 480px) {
  .hero h1 { font-size: clamp(28px, 9vw, 48px); letter-spacing: -1px; }
  .hero__sub { font-size: 16px; }
  .hero__cta .btn { flex: 1 1 100%; }   /* full-width stacked CTAs */
  /* Single-column plan grids everywhere on small phones. */
  .plan-grid, .plan-grid--featured { grid-template-columns: 1fr; gap: var(--space-xs); }
  /* Calculator stacks vertically and the dark card gets calmer padding. */
  .calc { grid-template-columns: 1fr; gap: var(--space-md); }
  .calc__card { padding: 22px; }
  .calc__resultBig { font-size: 42px; }
  /* Trust strip wraps to a comfortable two-up rather than one cramped line. */
  .trust__row { gap: var(--space-xs) var(--space-sm); }
  .trust__item { font-size: 12px; }
  /* Nav: trim the gutter and brand size so the toggle never collides. */
  .container { padding-inline: var(--space-sm); }
  .nav__inner { gap: 10px; }
  .brand__name { font-size: 19px; }
  /* Section heads & rhythm breathe a touch less on tiny screens. */
  .section { padding: var(--space-lg) 0; }
  .subscribe, .advisor { width: 100%; }
}

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║  PREMIUM LAYER — depth, pointer-reactive surfaces, staggered motion.   ║
   ║  Strictly monochrome; the richness comes from light, texture & timing. ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

/* ── Editorial eyebrow: a short ink rule precedes the kicker ─────────────── */
.eyebrow { display: inline-flex; align-items: center; gap: 9px; }
.eyebrow::before { content: ""; width: 22px; height: 2px; border-radius: 2px; background: var(--accent); opacity: .9; }
.section__head .eyebrow { display: inline-flex; }

/* ── Line icons (replace emoji; inherit ink via currentColor) ─────────────── */
.ico { width: 1em; height: 1em; display: inline-block; vertical-align: middle; flex: none; }
.cat__icon { color: var(--green); line-height: 0; }
.cat__icon .ico { width: 34px; height: 34px; }
.feature__icon { color: var(--green); }
.feature__icon .ico { width: 28px; height: 28px; }
.feature--check .feature__icon { color: var(--green-d); }
.pill--ico { display: inline-flex; align-items: center; gap: 7px; }
.pill--ico .ico { width: 15px; height: 15px; color: var(--green); }
.plan__cta .ico { width: 16px; height: 16px; vertical-align: -3px; margin-inline-end: 3px; }

/* ── "Best value" anchor — the lowest-price plan in a category listing ─────── */
.plan.plan--best { box-shadow: inset 0 1px 0 rgba(255,255,255,.7), 0 0 0 2px var(--value), var(--shadow); }
.plan.plan--best:hover { box-shadow: inset 0 1px 0 rgba(255,255,255,.7), 0 0 0 2px var(--value), var(--shadow-lg); }
.plan__badge {
  position: absolute; top: -10px; inset-inline-start: 14px; z-index: 2;
  background: var(--value); color: #3a2900; font-family: 'Rubik'; font-weight: 800;
  font-size: 11px; padding: 4px 11px; border-radius: 999px; box-shadow: 0 6px 14px rgba(217,119,6,.34);
}

/* ── Interaction: kill the 300ms mobile tap delay on all controls ─────────── */
a, button, summary, input, select, label, .btn, .chip, .ai-chip, [role="button"] { touch-action: manipulation; }

/* ── Pointer-tracking spotlight on cards ────────────────────────────────────
   A soft ink glow follows the cursor (coords fed by script.js as --mx/--my),
   plus a crisp inset top highlight so each surface catches the light. */
.feature, .step, .cat, .guide-card, .plan, .provider-card, .quote {
  position: relative; isolation: isolate;
}
.feature::after, .step::after, .cat::after, .guide-card::after, .plan::after, .provider-card::after {
  content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; pointer-events: none;
  background: radial-gradient(220px circle at var(--mx, 50%) var(--my, 0%), rgba(17,24,39,.06), transparent 60%);
  opacity: 0; transition: opacity .3s var(--ease);
}
/* Spotlight reveal-on-hover moved under @media (hover:hover) and (pointer:fine) — see card-hover block */
.feature, .step, .cat, .guide-card, .plan, .provider-card {
  /* Glass-glint (1px top-edge light) + elevation — the signature card surface. */
  box-shadow: var(--glint), var(--shadow-sm);
  /* 3D-tilt readiness: a perspective context + GPU hint, so script.js can apply
     a pointer-driven rotateX/rotateY without re-triggering layout. The default
     transform is identity, so nothing tilts until JS opts a card in. */
  transform-style: preserve-3d;
}
.feature:hover, .step:hover, .cat:hover, .guide-card:hover, .plan:hover, .provider-card:hover {
  border-color: var(--ink-200);
  will-change: transform;
}

/* ── Card hover-lift + spotlight — pointer-only ──────────────────────────────
   Gated behind (hover:hover) and (pointer:fine) so touch devices never fire a
   sticky :hover transform/spotlight on tap (the "touch-hover false positive").
   Keyboard :focus-visible / :focus-within parity lifts stay device-agnostic. */
@media (hover: hover) and (pointer: fine) {
  .step:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
  .cat:hover { transform: translateY(-5px); box-shadow: var(--shadow); }
  .feature:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
  .guide-card:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
  .plan:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
  .provider-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); }
  .feature:hover::after, .step:hover::after, .cat:hover::after, .guide-card:hover::after, .plan:hover::after, .provider-card:hover::after { opacity: 1; }
}

/* ── Staggered reveals ──────────────────────────────────────────────────────
   script.js sets --i per element within a group; cheap, GPU-friendly, and it
   degrades gracefully (reduced-motion already neutralises .reveal above). */
.reveal { transition-delay: calc(var(--i, 0) * 65ms); }
.reveal--blur { filter: blur(6px); }
.reveal--blur.in { filter: none; }
/* Signature choreographed entrance — a restrained 6px lift on the system easing,
   staggered on the 0/80/160/240ms cadence (script.js sets --i 0..n). Opt-in so
   existing reveals keep their current feel; reduced-motion already neutralises
   .reveal above. */
.reveal--choreo { transform: translateY(6px); transition-duration: .5s; transition-delay: calc(var(--i, 0) * 80ms); }
.reveal--choreo.in { transform: none; }

/* ── Hero savings card: deeper, glassier, with a moving spec highlight ────── */
.card--save { position: relative; overflow: hidden; box-shadow: var(--shadow-ink); }
.card--save::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(140deg, rgba(255,255,255,.16), transparent 45%);
}
.card__big { letter-spacing: -1px; }

/* ── "Winner" row in the hero phone gets a quiet ink ring pulse ─────────────── */
.card--row.best { box-shadow: 0 0 0 2px var(--green), var(--shadow-sm); border: 0; }

/* ── Section rhythm: a faint hairline divider option for alt sections ─────── */
.section--alt { border-block: 1px solid var(--line); }

/* ── Popular collections grid ────────────────────────────────────────────── */
.collections-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
.collection-chip { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; padding: 18px 20px; background: var(--cream); border: 1px solid var(--line); border-radius: var(--radius); text-decoration: none; color: inherit; box-shadow: var(--glint), var(--shadow-sm); transition: transform .18s var(--ease), box-shadow .18s, border-color .18s; }
.collection-chip:hover { transform: translateY(-4px); box-shadow: var(--shadow); border-color: var(--accent); }
.collection-chip:focus-visible { transform: translateY(-4px); box-shadow: var(--ring), var(--shadow); border-color: var(--accent); }
.collection-chip__icon { font-size: 1.5rem; line-height: 1; }
.collection-chip__title { font-family: 'Rubik'; font-size: 14px; font-weight: 600; color: var(--ink); }
.collection-chip__sub { font-size: 12px; color: var(--muted); }
@media (max-width: 1024px) { .collections-grid { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 700px) { .collections-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; }
  .collection-chip { padding: 14px 14px; }
  .collection-chip__title { font-size: 13px; } }

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║  DESIGN-SYSTEM COMPONENTS — plan tiers, callouts, TOC, mega-menu,      ║
   ║  toast, field-error, skeleton, advisor, bill-drop, subscribe.         ║
   ║  Green  = ACTION, amber = VALUE. RTL-safe, reduced-motion honoured.    ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

/* ── Plan tiers ────────────────────────────────────────────────────────────
   Premium = green ACTION accent (top stripe + ring); budget = quiet, lighter
   weight; the score badge wears the amber VALUE colour for "best value". */
.plan--premium { position: relative; border-color: var(--accent); box-shadow: inset 0 1px 0 rgba(255,255,255,.7), 0 0 0 1px var(--accent), var(--shadow); }
.plan--premium::before {
  content: ""; position: absolute; inset-inline: 0; top: 0; height: 4px; z-index: 2;
  border-start-start-radius: inherit; border-start-end-radius: inherit;
  background: linear-gradient(90deg, var(--accent), var(--accent-d));
}
.plan--premium:hover { box-shadow: inset 0 1px 0 rgba(255,255,255,.7), 0 0 0 1px var(--accent), var(--shadow-lg); }
.plan--budget { border-color: var(--line); background: var(--cream); box-shadow: var(--shadow-sm); }
.plan--budget .plan__price b { color: var(--ink-700); }
/* Score badge — a compact amber pill rating the plan's value (e.g. "9.2"). */
.plan__score {
  display: inline-flex; align-items: center; gap: 4px;
  font-family: 'Rubik', sans-serif; font-weight: 800; font-size: 12px; line-height: 1;
  color: #3a2900; background: var(--value); padding: 4px 9px; border-radius: 999px;
  box-shadow: 0 3px 10px rgba(217,119,6,.3);
}
.plan__score::before { content: "★"; font-size: 11px; }

/* ── Callout ───────────────────────────────────────────────────────────────
   An aside block with a left (inline-start) accent rule and a tinted ground.
   --callout-c drives both colours, so tip/warn variants are one-line swaps. */
.callout {
  --callout-c: var(--accent);
  --callout-bg: var(--accent-t);
  border: 1px solid var(--line); border-inline-start: 4px solid var(--callout-c);
  background: var(--callout-bg); border-radius: 12px;
  padding: 16px 18px; margin: 0 0 24px; color: var(--ink-700);
  display: flex; gap: 12px; align-items: flex-start;
}
.callout__icon { flex: none; width: 22px; height: 22px; color: var(--callout-c); margin-top: 1px; }
.callout__icon .ico { width: 22px; height: 22px; }
.callout b, .callout strong { color: var(--green-d); }
.callout p { margin: 0; }
.callout p + p { margin-top: 6px; }
.callout--tip { --callout-c: var(--value); --callout-bg: rgba(245,158,11,.10); }
.callout--warn { --callout-c: var(--warning); --callout-bg: var(--warning-t); }
.callout--info { --callout-c: var(--info); --callout-bg: var(--info-t); }

/* ── Table of contents ─────────────────────────────────────────────────────
   A sticky in-article nav with a scrollspy active state. Vertical ink rail on
   the inline-start; the active link gets the green ACTION colour + a marker. */
.toc {
  position: sticky; top: 96px; align-self: start;
  font-size: 14px; line-height: 1.5; padding-inline-start: 2px;
  border-inline-start: 2px solid var(--line);
}
.toc__title { font-family: 'Rubik', sans-serif; font-weight: 800; font-size: 12px; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-400); margin: 0 0 10px; padding-inline-start: 12px; }
.toc ul, .toc ol { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
.toc__link {
  display: block; position: relative; padding: 6px 12px; border-radius: 8px;
  color: var(--muted); font-weight: 600; text-decoration: none;
  transition: color .15s, background .15s;
}
.toc__link:hover { color: var(--accent-ink); background: var(--accent-t); }
.toc__link:focus-visible { box-shadow: var(--ring-flush); }
.toc__link--active { color: var(--accent-ink); font-weight: 700; }
.toc__link--active::before {
  content: ""; position: absolute; inset-inline-start: -2px; top: 50%; transform: translateY(-50%);
  width: 2px; height: 70%; background: var(--accent); border-radius: 2px;
}
@media (max-width: 900px) { .toc { position: static; border-inline-start: 0; padding-inline-start: 0; } }

/* ── Mega-menu ─────────────────────────────────────────────────────────────
   An accessible dropdown panel anchored to a nav item. Shown via [hidden]
   removal OR a parent [aria-expanded] / :focus-within / :hover, so it works
   with keyboard, mouse, and JS toggling. RTL-anchored to the inline-start. */
.mega-menu { position: relative; }
.mega-menu__panel {
  position: absolute; inset-inline-start: 0; top: calc(100% + 12px); z-index: 55;
  min-width: 500px; max-width: 92vw; padding: 22px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--glint), var(--shadow-lg);
  display: grid; grid-template-columns: 1fr 1fr; gap: 8px 22px;
  opacity: 0; visibility: hidden; transform: translateY(-6px);
  transition: opacity .18s var(--ease), transform .18s var(--ease), visibility .18s;
}
.mega-menu:hover .mega-menu__panel,
.mega-menu:focus-within .mega-menu__panel,
.mega-menu[aria-expanded="true"] .mega-menu__panel,
.mega-menu__panel:not([hidden]).is-open {
  opacity: 1; visibility: visible; transform: translateY(0);
}
.mega-menu__panel[hidden] { display: none; }
.mega-menu__col h4 { grid-column: 1 / -1; font-family: 'Rubik', sans-serif; font-size: 12px; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-400); margin: 4px 0 6px; }
.mega-menu__link {
  display: flex; align-items: center; gap: 12px; padding: 11px 12px; border-radius: var(--radius-sm);
  color: var(--ink); font-weight: 600; text-decoration: none; transition: background .15s, color .15s, transform .15s var(--ease);
}
.mega-menu__link:hover { background: var(--accent-t); color: var(--accent-ink); }
.mega-menu__link:hover .mega-menu__ico, .mega-menu__link:hover .ico { transform: translateX(-2px); }
.mega-menu__link:focus-visible { box-shadow: var(--ring-flush); }
.mega-menu__link small { display: block; color: var(--muted); font-size: 12px; font-weight: 500; }
/* Icon slot — a tinted rounded tile housing each item's line-icon, so the menu
   reads as a set of destinations rather than a bare link list. */
.mega-menu__ico {
  width: 34px; height: 34px; flex: none; display: grid; place-items: center;
  border-radius: var(--radius-xs); background: var(--accent-t); color: var(--accent);
  box-shadow: var(--glint); transition: transform .15s var(--ease);
}
.mega-menu__ico .ico { width: 18px; height: 18px; }
.mega-menu__link .ico { width: 18px; height: 18px; color: var(--accent); flex: none; transition: transform .15s var(--ease); }
@media (max-width: 560px) { .mega-menu__panel { min-width: 0; inset-inline: 0; grid-template-columns: 1fr; } }

/* ── Toast ─────────────────────────────────────────────────────────────────
   A bottom, centred notification that slides up and fades in once .is-visible
   is set. Polite by default; --toast-c tints the inline-start accent rule. */
.toast {
  --toast-c: var(--accent);
  position: fixed; inset-inline: 0; bottom: 24px; z-index: 70;
  margin-inline: auto; width: max-content; max-width: calc(100vw - 32px);
  display: flex; align-items: center; gap: 10px;
  padding: 13px 18px; border-radius: 14px;
  background: var(--ink-800); color: #fff;
  border-inline-start: 4px solid var(--toast-c);
  box-shadow: var(--shadow-lg);
  font-weight: 600; font-size: 14.5px;
  opacity: 0; transform: translateY(16px); pointer-events: none;
  transition: opacity .25s var(--ease), transform .25s var(--ease-spring);
}
.toast.is-visible { opacity: 1; transform: translateY(0); pointer-events: auto; }
.toast--success { --toast-c: var(--value); }
.toast--error { --toast-c: var(--error); }
.toast--info { --toast-c: var(--info); }
.toast .ico { width: 18px; height: 18px; color: var(--toast-c); flex: none; }
.toast__close { margin-inline-start: 6px; background: none; border: 0; color: rgba(255,255,255,.7); font-size: 18px; line-height: 1; cursor: pointer; padding: 2px 4px; border-radius: 6px; }
.toast__close:hover { color: #fff; }
.toast__close:focus-visible { box-shadow: var(--ring); }
@media (prefers-reduced-motion: reduce) {
  .toast, .toast.is-in, .toast.is-out { transition: none; }
}

/* ── Field error ───────────────────────────────────────────────────────────
   Invalid inputs get a red rim + a small message. Driven by aria-invalid so
   markup stays semantic; the message hides until the field is actually invalid. */
.field { display: grid; gap: 6px; }
.field-error { display: none; color: var(--error); font-size: 13px; font-weight: 600; display: flex; align-items: center; gap: 6px; }
.field-error .ico { width: 14px; height: 14px; flex: none; }
[aria-invalid="true"] {
  border-color: var(--error) !important;
  box-shadow: 0 0 0 1px var(--error);
}
[aria-invalid="true"]:focus-visible { box-shadow: 0 0 0 2px #fff, 0 0 0 5px rgba(220,38,38,.4); }
[aria-invalid="true"] ~ .field-error,
.field--invalid .field-error { display: flex; }

/* ── Floating-label fields ──────────────────────────────────────────────────
   A premium input micro-interaction: the label rests inside the field, then
   floats up + shrinks when the input is focused or filled. RTL-anchored to the
   inline-start. Add `.field--float` to a .field that wraps <input>+<label> (the
   label AFTER the input so `:placeholder-shown ~ label` can sense empty state).
   The input must carry placeholder=" " so :placeholder-shown tracks emptiness. */
.field--float { position: relative; display: block; }
.field--float > input,
.field--float > textarea {
  width: 100%; padding: 20px 16px 8px; min-height: 56px;
  border: 1px solid var(--line); border-radius: var(--radius-sm);
  font-family: 'Assistant', sans-serif; font-size: 16px; background: var(--white); color: var(--ink);
  transition: border-color .15s, box-shadow .2s var(--ease), background .15s;
}
.field--float > label {
  position: absolute; inset-inline-start: 16px; top: 17px; margin: 0;
  color: var(--ink-400); font-size: 16px; font-weight: 600; pointer-events: none;
  transform-origin: inline-start top;
  transition: transform .18s var(--ease), color .18s var(--ease), top .18s var(--ease);
}
.field--float > input:focus,
.field--float > textarea:focus {
  outline: none; border-color: var(--accent);
  /* Focus-glow: the system focus ring + a soft accent halo for that lifted feel. */
  box-shadow: var(--ring), 0 6px 20px rgba(22,163,74,.14);
}
.field--float > input:focus ~ label,
.field--float > input:not(:placeholder-shown) ~ label,
.field--float > textarea:focus ~ label,
.field--float > textarea:not(:placeholder-shown) ~ label {
  top: 8px; transform: scale(.74); color: var(--accent-ink); font-weight: 700;
}
/* Filled (but blurred) inputs keep a quietly tinted ground so the form reads as
   "progress made", and the floated label settles to ink rather than accent. */
.field--float > input:not(:placeholder-shown):not(:focus),
.field--float > textarea:not(:placeholder-shown):not(:focus) { background: var(--cream); }
.field--float > input:not(:placeholder-shown):not(:focus) ~ label,
.field--float > textarea:not(:placeholder-shown):not(:focus) ~ label { color: var(--ink-500); }
.field--float > input:hover:not(:focus),
.field--float > textarea:hover:not(:focus) { border-color: var(--ink-300); }

/* Focus-glow + filled affordance for the existing flat inputs too, so the polish
   is system-wide rather than opt-in. Pairs with the rings already defined. */
.subscribe input[type="email"]:focus-visible,
.booking__input:focus-visible,
.booking__date:focus-visible,
.ai-input input:focus-visible {
  box-shadow: var(--ring), 0 6px 20px rgba(22,163,74,.14);
}
.booking__input:not(:placeholder-shown):not(:focus) { background: var(--cream); }

/* ── Skeleton ──────────────────────────────────────────────────────────────
   A shimmering placeholder block for loading states. The sheen sweeps RTL→LTR;
   under reduced-motion it falls back to a steady, non-animated tint. */
.skeleton {
  position: relative; overflow: hidden;
  background: var(--ink-050); border-radius: 8px;
  min-height: 14px;
}
.skeleton::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.55), transparent);
  transform: translateX(-100%); animation: skeleton-sweep 1.4s ease-in-out infinite;
}
.skeleton--text { height: 12px; margin: 6px 0; }
.skeleton--title { height: 22px; width: 60%; margin: 0 0 12px; }
.skeleton--line-short { width: 70%; }
.skeleton--block { min-height: 120px; border-radius: var(--radius); }
.skeleton--circle { border-radius: 50%; width: 40px; height: 40px; }
@keyframes skeleton-sweep { 100% { transform: translateX(100%); } }
@media (prefers-reduced-motion: reduce) {
  .skeleton { animation: none; opacity: .7; }
  .skeleton::after { animation: none; }
}

/* ── Advisor (multi-step card) ─────────────────────────────────────────────
   A guided question card (the plan-advisor flow). Steps stack; only the active
   one shows. A slim progress rail + dots track position. */
.advisor {
  position: relative; max-width: 560px; margin: 0 auto;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 28px; box-shadow: var(--shadow);
}
.advisor__progress { display: flex; gap: 6px; margin-bottom: 22px; }
.advisor__progress span { flex: 1; height: 4px; border-radius: 999px; background: var(--ink-100); transition: background .25s var(--ease); }
.advisor__progress span.is-done, .advisor__progress span.is-active { background: var(--accent); }
.advisor__step { display: none; }
.advisor__step.is-active { display: block; animation: advisor-in .3s var(--ease) both; }
.advisor__step h3 { font-family: 'Rubik', sans-serif; font-size: 20px; color: var(--green-d); margin-bottom: 6px; }
.advisor__step > p { color: var(--muted); margin-bottom: 18px; }
.advisor__options { display: grid; gap: 10px; }
.advisor__option {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: start;
  padding: 14px 16px; border: 1px solid var(--line); border-radius: 14px;
  background: var(--cream); color: var(--ink); font-family: inherit; font-size: 15px; font-weight: 600;
  cursor: pointer; transition: border-color .15s, background .15s, transform .15s var(--ease-spring);
}
.advisor__option:hover { border-color: var(--accent); background: var(--accent-t); }
.advisor__option:active { transform: scale(.98); }
.advisor__option:focus-visible { box-shadow: var(--ring); border-color: var(--accent); }
.advisor__option[aria-pressed="true"], .advisor__option.is-selected { border-color: var(--accent); background: var(--accent-t); color: var(--accent-ink); }
.advisor__nav { display: flex; justify-content: space-between; gap: 10px; margin-top: 22px; }
@keyframes advisor-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* ── Bill-drop (drag/drop upload zone) ─────────────────────────────────────
   A dashed target for dropping/choosing a bill image. .is-dragover lights it
   green; the whole zone is clickable (a label wrapping a hidden file input). */
.bill-drop {
  display: grid; place-items: center; gap: 10px; text-align: center;
  padding: 36px 24px; border: 2px dashed var(--ink-200); border-radius: var(--radius);
  background: var(--cream); color: var(--muted); cursor: pointer;
  transition: border-color .18s, background .18s, color .18s;
}
.bill-drop:hover { border-color: var(--accent); color: var(--ink-700); }
.bill-drop.is-dragover { border-color: var(--accent); background: var(--accent-t); color: var(--accent-ink); }
.bill-drop:focus-within { box-shadow: var(--ring); border-color: var(--accent); }
.bill-drop__icon { width: 40px; height: 40px; color: var(--accent); }
.bill-drop__icon .ico { width: 40px; height: 40px; }
.bill-drop strong { font-family: 'Rubik', sans-serif; color: var(--green-d); font-size: 16px; }
.bill-drop small { font-size: 13px; }
.bill-drop input[type="file"] { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; }
.bill-drop__preview { max-width: 220px; max-height: 160px; border-radius: 12px; border: 1px solid var(--line); box-shadow: var(--shadow-sm); }

/* ── Subscribe (email capture row) ─────────────────────────────────────────
   A compact inline email-capture: field + button that collapse to a stack on
   narrow widths. Lives on light surfaces (distinct from the dark .cta__form). */
.subscribe { display: flex; flex-wrap: wrap; gap: 10px; align-items: stretch; max-width: 440px; }
.subscribe__field { flex: 1 1 220px; min-width: 0; display: grid; gap: 6px; }
/* The footer newsletter renders label → row(input+btn) → consent → note. These
   were unstyled in markup; this lays them out as a tidy stacked capture block. */
.subscribe__label { display: block; font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 14px; color: rgba(255,255,255,.92); margin-bottom: 2px; flex: 1 1 100%; }
.footer .subscribe__label { color: rgba(255,255,255,.85); }
.subscribe__row { display: flex; flex-wrap: wrap; gap: 10px; align-items: stretch; flex: 1 1 100%; }
.subscribe input[type="email"], .subscribe__input {
  flex: 1 1 200px; min-width: 0;
  width: 100%; padding: 13px 16px; border: 1px solid var(--line); border-radius: var(--radius-sm);
  font-family: 'Assistant', sans-serif; font-size: 16px; background: var(--white); color: var(--ink);
  transition: border-color .15s, box-shadow .2s var(--ease);
}
.subscribe input[type="email"]:hover, .subscribe__input:hover { border-color: var(--ink-300); }
.subscribe input[type="email"]:focus-visible, .subscribe__input:focus-visible { outline: none; box-shadow: var(--ring), 0 6px 20px rgba(22,163,74,.14); border-color: var(--accent); }
.subscribe .btn, .subscribe__btn { flex: 0 0 auto; }
/* Consent line under the footer email field — small, legible fine print. */
.subscribe__consent { display: flex; align-items: flex-start; gap: 9px; flex: 1 1 100%; cursor: pointer; font-size: 12.5px; line-height: 1.45; color: rgba(255,255,255,.78); font-weight: 500; }
.subscribe__consent input[type="checkbox"] { flex: 0 0 auto; width: 18px; height: 18px; min-width: 18px; margin: 1px 0 0; border-radius: 5px; accent-color: var(--accent); cursor: pointer; }
.subscribe__consent input[type="checkbox"]:focus-visible { outline: none; box-shadow: var(--ring-flush); }
.subscribe__note { flex: 1 1 100%; font-size: 12.5px; color: var(--muted); }
.footer .subscribe__note { color: rgba(255,255,255,.6); }
.subscribe__note a { color: var(--accent-ink); font-weight: 600; }
.footer .subscribe__note a { color: var(--lime); }
@media (max-width: 480px) {
  .subscribe { flex-direction: column; }
  .subscribe__row { flex-direction: column; }
  .subscribe .btn, .subscribe__btn { width: 100%; }
}

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║  COMMUNITY + BOOKING — live Supabase-backed surfaces on the site.      ║
   ║  Read-only community feed (posts, replies, provider ratings/reviews)   ║
   ║  + an anonymous Zoom-meeting booking form. Green = ACTION, amber =     ║
   ║  VALUE. Glass/card patterns mirror the rest of the system; RTL-safe.   ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

/* ── Community page wrapper ─────────────────────────────────────────────────
   A single column of post cards with comfortable air; the join-the-app CTA
   and ratings block sit inside the same rhythm. */
.community { display: grid; gap: 16px; max-width: 760px; margin-inline: auto; }
.community__join {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 12px 18px; padding: 18px 22px; margin-bottom: 4px;
  background: var(--accent-t); border: 1px solid var(--accent); border-radius: var(--radius);
  color: var(--ink-700);
}
.community__join strong { font-family: 'Rubik', sans-serif; color: var(--green-d); display: block; font-size: 16px; }
.community__join small { color: var(--muted); font-size: 13.5px; }
.community__join .btn { flex: 0 0 auto; }
/* A quiet status/empty line while posts load or when none are available. */
.community__status { text-align: center; color: var(--muted); font-size: 14px; padding: 28px 16px; }

/* ── Community channel filter chips ──────────────────────────────────────────
   Selectable channel filters. build.js renders `.community__chan` (pre-JS);
   script.js swaps them for `.chip community__chip`. Both share this styling so
   the SELECTED chip shows a visible green ACTION state (not colour-only — it
   pairs with aria-pressed), with hover + the standard focus ring. */
.community__filter { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-bottom: 18px; }
.community__chan, .community__chip {
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 13.5px;
  padding: 8px 16px; min-height: 44px; display: inline-flex; align-items: center;
  background: var(--white); border: 1px solid var(--line); color: var(--green-d);
  border-radius: 999px; cursor: pointer; box-shadow: var(--shadow-sm);
  transition: background .15s, color .15s, border-color .15s, transform .15s var(--ease-spring), box-shadow .18s;
}
.community__chan:hover, .community__chip:hover { transform: translateY(-1px); border-color: var(--ink-300); box-shadow: var(--shadow-sm); }
.community__chan:active, .community__chip:active { transform: scale(.97); }
.community__chan:focus-visible, .community__chip:focus-visible { outline: none; box-shadow: var(--ring); border-color: var(--accent); }
.community__chan--active,
.community__chan[aria-pressed="true"],
.community__chip[aria-pressed="true"] {
  background: var(--accent-d); color: #fff; border-color: var(--accent-d);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 4px 12px rgba(22,163,74,.24);
}
@media (prefers-reduced-motion: reduce) {
  .community__chan, .community__chip { transition: box-shadow .01s, border-color .01s, background .01s, color .01s; }
  .community__chan:hover, .community__chip:hover { transform: none; }
}

/* ── Post card ──────────────────────────────────────────────────────────────
   White glass tile: author row (avatar + name + channel chip + time), body
   copy, optional media image, and an expandable replies thread. */
.post-card {
  position: relative; isolation: isolate;
  background: rgba(255,255,255,.7);
  backdrop-filter: blur(16px) saturate(130%); -webkit-backdrop-filter: blur(16px) saturate(130%);
  border: 1px solid rgba(255,255,255,.65); border-radius: 18px;
  padding: 18px 20px; box-shadow: inset 0 1px 0 rgba(255,255,255,.7), var(--shadow-sm);
  transition: box-shadow .22s var(--ease), border-color .18s;
}
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) { .post-card { background: #fff; } }
.post-card:hover { box-shadow: inset 0 1px 0 rgba(255,255,255,.7), var(--shadow); border-color: var(--ink-200); }
.post-card__head { display: flex; align-items: center; gap: 10px; }
.post-card__avatar {
  width: 40px; height: 40px; flex: none; border-radius: 50%; object-fit: cover;
  display: grid; place-items: center; background: var(--lime); color: var(--green-d);
  font-family: 'Rubik', sans-serif; font-weight: 800; font-size: 15px; overflow: hidden;
  border: 1px solid var(--line);
}
.post-card__avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.post-card__who { display: flex; flex-direction: column; min-width: 0; line-height: 1.25; }
.post-card__author { font-family: 'Rubik', sans-serif; font-weight: 700; color: var(--green-d); font-size: 15px; }
.post-card__time { color: var(--ink-400); font-size: 12.5px; }
/* Channel chip — quiet ink tablet identifying the community channel. */
.post-card__channel {
  margin-inline-start: auto; flex: none;
  background: var(--mint); color: var(--ink-700); border: 1px solid var(--line);
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 11.5px;
  padding: 4px 11px; border-radius: 999px; white-space: nowrap;
}
.post-card__body { color: var(--ink-700); margin-top: 12px; line-height: 1.7; white-space: pre-line; word-break: break-word; }
.post-card__media {
  display: block; margin-top: 12px; max-width: 100%; max-height: 360px;
  width: auto; border-radius: 14px; border: 1px solid var(--line);
  box-shadow: var(--shadow-sm); object-fit: cover;
}
/* Replies toggle — a borderless ACTION-coloured text button. */
.post-card__more {
  margin-top: 12px; background: none; border: 0; padding: 6px 4px; cursor: pointer;
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 13.5px; color: var(--accent-ink);
  display: inline-flex; align-items: center; gap: 6px; border-radius: 8px; transition: color .15s;
}
.post-card__more:hover { color: var(--accent-d); }
.post-card__more:focus-visible { box-shadow: var(--ring-flush); }
.post-card__replies { display: grid; gap: 8px; margin-top: 12px; }

/* ── Reply ──────────────────────────────────────────────────────────────────
   Indented, lighter than the parent post; an inline-start ink rail ties each
   reply to its thread. */
.reply {
  margin-inline-start: 18px; padding: 12px 14px;
  background: var(--cream); border: 1px solid var(--line);
  border-inline-start: 3px solid var(--ink-200); border-radius: 12px;
}
.reply__head { display: flex; align-items: baseline; gap: 8px; }
.reply__author { font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 13.5px; color: var(--green-d); }
.reply__time { color: var(--ink-400); font-size: 12px; }
.reply__body { color: var(--muted); font-size: 14px; line-height: 1.6; margin-top: 4px; white-space: pre-line; word-break: break-word; }
.reply__media { display: block; margin-top: 8px; max-width: 220px; max-height: 200px; border-radius: 10px; border: 1px solid var(--line); }

/* ── Provider ratings grid ──────────────────────────────────────────────────
   A responsive grid of compact rating cards (one per provider): avg stars,
   review count. Reviews list below shows individual verified reviews. */
.ratings { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 14px; }
.rating-card {
  background: var(--white); border: 1px solid var(--line); border-radius: 16px;
  padding: 18px; box-shadow: inset 0 1px 0 rgba(255,255,255,.7), var(--shadow-sm);
  transition: transform .2s var(--ease), box-shadow .2s, border-color .18s;
}
.rating-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); border-color: var(--ink-200); }
.rating-card__provider { font-family: 'Rubik', sans-serif; font-weight: 800; color: var(--green-d); font-size: 16px; }
.rating-card__score { display: flex; align-items: baseline; gap: 8px; margin-top: 8px; }
.rating-card__avg { font-family: 'Rubik', sans-serif; font-weight: 900; font-size: 26px; color: var(--green-d); letter-spacing: -.5px; }
.rating-card__count { color: var(--muted); font-size: 13px; }
/* Star rows — amber VALUE stars over a faint empty track. The filled width is
   driven by --stars (0–5) set inline from the average. */
.stars-row {
  position: relative; display: inline-block; font-size: 15px; line-height: 1;
  letter-spacing: 2px; color: var(--ink-200); white-space: nowrap;
}
.stars-row::before {
  content: "★★★★★"; position: absolute; inset-inline-start: 0; top: 0; overflow: hidden;
  width: calc(var(--stars, 0) / 5 * 100%); color: var(--value-ink);
}
.stars-row__base { color: inherit; }
.stars-row__base::before { content: "★★★★★"; }
.rating-card .stars-row { margin-top: 6px; }

/* ── Review card ─────────────────────────────────────────────────────────────
   An individual provider review: stars, body, and an optional verified pill. */
.reviews { display: grid; gap: 12px; margin-top: 22px; }
.review-card {
  background: var(--cream); border: 1px solid var(--line); border-radius: 14px;
  padding: 16px 18px; box-shadow: var(--shadow-sm);
}
.review-card__head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.review-card__provider { font-family: 'Rubik', sans-serif; font-weight: 700; color: var(--green-d); font-size: 14.5px; }
.review-card__time { color: var(--ink-400); font-size: 12px; margin-inline-start: auto; }
.review-card__body { color: var(--ink-700); margin-top: 8px; line-height: 1.65; word-break: break-word; }
/* Verified-customer pill — a small green VALUE-of-trust badge. */
.verified-badge {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--accent-t); color: var(--accent-ink); border: 1px solid var(--accent);
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 11px; line-height: 1;
  padding: 4px 9px; border-radius: 999px; white-space: nowrap;
}
.verified-badge::before { content: "✓"; font-weight: 900; }

/* ── Booking (Zoom meeting) form ─────────────────────────────────────────────
   Anonymous video-consultation booking: provider chips → slot grid → contact
   fields → consent → submit. White card on the page, mirrors .advisor padding. */
.booking {
  max-width: 620px; margin-inline: auto;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 28px; box-shadow: var(--shadow);
}

/* Form layout — one vertical stack of fields with comfortable, even rhythm.
   `.booking__row` lays two fields side-by-side on desktop and stacks them on
   mobile (see the breakpoint below). */
.booking__form { display: grid; gap: 18px; }
.booking__row {
  display: grid; grid-template-columns: 1fr 1fr; gap: 14px; align-items: start;
}

/* Field = a label that wraps its own control. The label text sits above the
   input; the input fills the field. Bare <input>/<select> inside a field get
   the shared control styling so name/phone/email/date all match exactly. */
.booking__field {
  display: flex; flex-direction: column; gap: 8px; min-width: 0;
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 14px; color: var(--green-d);
}
.booking__field-label {
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 14px; color: var(--green-d);
}
.booking__field input,
.booking__field select {
  width: 100%; min-height: 48px; padding: 12px 16px;
  border: 1px solid var(--line); border-radius: var(--radius-sm);
  font-family: 'Assistant', sans-serif; font-weight: 500; font-size: 16px;
  background: var(--white); color: var(--ink);
  transition: border-color .15s, box-shadow .15s, background .15s;
}
.booking__field input::placeholder { color: var(--ink-400); font-weight: 400; }
.booking__field input:hover,
.booking__field select:hover { border-color: var(--ink-300); }
.booking__field input:focus-visible,
.booking__field select:focus-visible { outline: none; box-shadow: var(--ring); border-color: var(--accent); }
.booking__field input[aria-invalid="true"],
.booking__field select[aria-invalid="true"] { border-color: var(--error); }
.booking__field select { cursor: pointer; appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--ink-400) 50%), linear-gradient(135deg, var(--ink-400) 50%, transparent 50%);
  background-position: left 18px center, left 13px center;
  background-size: 5px 5px, 5px 5px; background-repeat: no-repeat;
  padding-inline-start: 38px;
}

/* Provider chips — selectable; chosen = green ACTION. The rendered button class
   is `.booking__provider` (build.js/script.js); `.provider-pick` is kept as a
   forward-compat alias so both carry the focus ring + the pressed (green) state. */
.booking__providers { border: 0; padding: 0; margin: 0; min-width: 0; }
.booking__providers legend {
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 14px;
  color: var(--green-d); margin-bottom: 10px; padding: 0;
}
.booking__providers-grid { display: flex; flex-wrap: wrap; gap: 8px; }
.booking__providers .provider-pick,
.booking__providers-grid .booking__provider,
.booking__providers .booking__provider {
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 14px;
  gap: 8px; padding: 9px 16px; min-height: 44px; display: inline-flex; align-items: center;
  background: var(--cream); border: 1px solid var(--line); color: var(--green-d);
  border-radius: 999px; cursor: pointer;
  transition: background .15s, color .15s, border-color .15s, transform .15s var(--ease-spring), box-shadow .18s;
}
.booking__providers .provider-pick:hover,
.booking__providers .booking__provider:hover { transform: translateY(-1px); border-color: var(--ink-300); box-shadow: var(--shadow-sm); }
.booking__providers .provider-pick:active,
.booking__providers .booking__provider:active { transform: scale(.97); }
.booking__providers .provider-pick:focus-visible,
.booking__providers .booking__provider:focus-visible { outline: none; box-shadow: var(--ring); border-color: var(--accent); }
.booking__providers .provider-pick[aria-pressed="true"],
.booking__providers .provider-pick.is-chosen,
.booking__providers .booking__provider[aria-pressed="true"],
.booking__providers .booking__provider.is-chosen {
  background: var(--accent-d); color: #fff; border-color: var(--accent-d);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 4px 12px rgba(22,163,74,.24);
}

/* Slot grid — responsive grid of 30-min time buttons. Chosen = green; taken or
   out-of-window slots render disabled. */
.slot-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(82px, 1fr)); gap: 8px; }
.slot {
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 14px;
  min-height: 44px; padding: 10px 8px; text-align: center;
  background: var(--cream); border: 1px solid var(--line); color: var(--green-d);
  border-radius: var(--radius-xs); cursor: pointer;
  transition: background .15s, color .15s, border-color .15s, transform .15s var(--ease-spring), box-shadow .18s;
}
.slot:hover { transform: translateY(-1px); border-color: var(--accent); box-shadow: var(--shadow-sm); }
.slot:active { transform: scale(.96); }
.slot:focus-visible { outline: none; box-shadow: var(--ring); border-color: var(--accent); }
.slot--chosen, .slot[aria-pressed="true"] {
  background: var(--accent-d); color: #fff; border-color: var(--accent-d);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 4px 12px rgba(22,163,74,.24);
}
.slot--chosen:hover, .slot[aria-pressed="true"]:hover { transform: translateY(-1px); filter: brightness(1.04); }
.slot[disabled], .slot:disabled, .slot--taken {
  opacity: .4; cursor: not-allowed; background: var(--ink-050); color: var(--ink-400);
  border-color: var(--line); text-decoration: line-through;
  transform: none !important; box-shadow: none !important;
}
/* The "pick a date / no slots" hints render as a .booking__note inside the grid;
   span the full width and breathe, so they don't look like a stray broken cell. */
.slot-grid .booking__note,
.slot-grid__empty { grid-column: 1 / -1; color: var(--muted); font-size: 13.5px; margin: 0; padding: 12px 4px; text-align: start; }

/* Consent block — mandatory terms/privacy + optional marketing. Native checkbox
   tinted to the ACTION colour; rows read as quiet, legible fine print. */
.booking__consent { display: grid; gap: 10px; margin-top: 4px; }
.booking__consent label {
  display: flex; align-items: flex-start; gap: 10px; cursor: pointer;
  font-size: 13.5px; line-height: 1.5; color: var(--ink-700); font-weight: 500;
}
.booking__consent input[type="checkbox"] {
  flex: 0 0 auto; width: 20px; height: 20px; min-width: 20px; margin: 1px 0 0;
  border-radius: 5px; accent-color: var(--accent); cursor: pointer;
}
.booking__consent input[type="checkbox"]:focus-visible { outline: none; box-shadow: var(--ring); }
.booking__consent a { color: var(--accent-ink); font-weight: 700; text-decoration: underline; text-underline-offset: 2px; }
.booking__consent a:hover { color: var(--accent-d); }
.booking__consent .req { color: var(--accent-ink); font-weight: 800; }

/* Booking is built as one form today, but the slot/step language is ready for a
   multi-step flow: a `.booking__step` toggles on `.is-active` with a soft slide,
   mirroring the advisor's step transition. Inert until markup opts in. */
.booking__step { display: none; }
.booking__step.is-active { display: block; animation: advisor-in .3s var(--ease) both; }
@media (prefers-reduced-motion: reduce) { .booking__step.is-active { animation: none; } }

.booking__submit { margin-top: 22px; }

/* Email-OTP verification step — revealed after a code is requested. A calm,
   tinted panel so it reads as a distinct, deliberate gate rather than another
   form row. Honours the brand tokens (accent tint, radius, ring). */
.booking__verify {
  margin-top: 18px; padding: 16px 16px 14px; border-radius: var(--radius-sm);
  background: var(--accent-t); border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent);
  display: grid; gap: 12px;
}
.booking__verify[hidden] { display: none; }
.booking__verify-lead { margin: 0; font-weight: 700; font-size: 14.5px; color: var(--ink-800); line-height: 1.5; }
.booking__verify-row { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; }
.booking__field--code { flex: 1 1 150px; }
.booking__field--code input {
  letter-spacing: .5em; text-align: center; font-weight: 800; font-family: 'Rubik', inherit;
  font-size: 20px; padding-inline: 14px;
}
.booking__verify-row .btn { flex: 0 0 auto; }
.booking__verify-resend { margin: 0; font-size: 13px; color: var(--muted); }
.linklike {
  appearance: none; background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--accent-ink); font-weight: 700; font: inherit; text-decoration: underline; text-underline-offset: 2px;
}
.linklike:hover { color: var(--accent-d); }
.linklike:focus-visible { outline: none; box-shadow: var(--ring); border-radius: 4px; }
:root[data-theme="dark"] .booking__verify-lead { color: var(--ink); }

/* Status note — success = green, error = red. Hidden until a state is set. */
.booking__note {
  min-height: 22px; margin-top: 14px; font-weight: 700; font-size: 14.5px;
  text-align: center; line-height: 1.5;
}
.booking__note:empty { display: none; }
.booking__note.is-success { color: var(--accent-ink); }
.booking__note.is-error { color: var(--error); }

@media (max-width: 560px) {
  .booking { padding: 20px; }
  .booking__row { grid-template-columns: 1fr; gap: 18px; }
  .booking__form #bookSubmit { width: 100%; }
  .community__join { padding: 16px; }
  .reply { margin-inline-start: 10px; }
  .slot-grid { grid-template-columns: repeat(auto-fill, minmax(72px, 1fr)); gap: 6px; }
}

/* ── Chips & pills: tactile press (links only) ─────────────────────────────── */
a.chip:active { transform: translateY(0) scale(.97); }
.pill { box-shadow: inset 0 0 0 1px var(--line); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }

/* ── Magnetic primary CTA (JS nudges it toward the cursor) ─────────────────
   The nudge rides the CSS `translate` property so it COMPOSES with the
   :hover lift and :active press transforms instead of clobbering them. */
.btn--primary.magnetic { transition: transform .25s var(--ease-spring), translate .25s var(--ease-spring), box-shadow .2s var(--ease); }

/* ── Honour reduced-motion for all the new flourishes ───────────────────── */
@media (prefers-reduced-motion: reduce) {
  .phone::after { animation: none; }
  .btn::before { display: none; }
  .feature::after, .step::after, .cat::after, .guide-card::after, .plan::after, .provider-card::after { display: none; }
  .reveal { transition-delay: 0ms !important; }
  /* Hover/focus lifts and the FAQ marker spin still convey state via colour
     and shadow — drop only the motion. Focus rings (box-shadow) stay intact. */
  .plan, .guide-card, .provider-card, .cat, .collection-chip, .step, .feature,
  .faq__list summary::after, .faq__list details, .plan__cta, .plan__compare,
  .filter-btn, .flag-chip, .ai-chip, a.chip, .cmp-table tbody tr { transition: box-shadow .01s, border-color .01s, background .01s, color .01s; }
  .plan:hover, .plan:focus-within, .guide-card:hover, .guide-card:focus-visible,
  .provider-card:hover, .provider-card:focus-visible, .provider-card:focus-within,
  .cat:hover, .cat:focus-visible, .collection-chip:hover, .collection-chip:focus-visible,
  .step:hover, .feature:hover { transform: none; }
}

/* ── Comparison table (kamaze-style category scan) ───────────────────────────
   At-a-glance price table above the detail cards. Desktop = scrollable table
   with a sticky header; mobile = each row collapses into a labelled card via
   td[data-th]. Colors come from theme tokens so it adapts to dark mode. */
.section--tight { padding-block: clamp(28px, 4vw, 46px); }
.cmp-wrap {
  overflow-x: auto; -webkit-overflow-scrolling: touch;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--white); box-shadow: var(--glint), var(--shadow-sm);
}
.cmp-wrap:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.cmp { width: 100%; border-collapse: collapse; font-size: .92rem; min-width: 780px; }
.cmp thead th {
  position: sticky; top: 0; z-index: 1;
  background: var(--cream); color: var(--ink); font-weight: 700; text-align: right;
  padding: 13px 14px; border-bottom: 2px solid var(--line); white-space: nowrap;
}
.cmp td { padding: 12px 14px; border-bottom: 1px solid var(--line); vertical-align: middle; color: var(--ink); }
.cmp tbody tr:last-child td { border-bottom: 0; }
.cmp tbody tr:nth-child(even) { background: rgba(127,127,127,.04); }
.cmp tbody tr:hover { background: var(--accent-t); }
.cmp__num { font-variant-numeric: tabular-nums; white-space: nowrap; }
.cmp__best { background: var(--value-t) !important; }
.cmp__best td:first-child { box-shadow: inset 3px 0 0 var(--value); }
.cmp__prov { display: inline-flex; align-items: center; gap: 8px; text-decoration: none; color: inherit; font-weight: 600; white-space: nowrap; }
.cmp__prov:hover span { color: var(--accent); }
.cmp__name { font-weight: 700; }
.cmp__jump { color: var(--ink); }
.cmp__fixed { color: var(--accent); font-weight: 600; }
.cmp__info { display: inline-block; max-width: 280px; white-space: normal; color: var(--muted); font-size: .84rem; line-height: 1.4; }
/* VAT-inclusive + "accurate as of <date>, verify with provider" caveat under the
   comparison table — consumer-protection price honesty next to the figures. */
.cmp__caveat { margin: 12px 2px 0; font-size: .82rem; line-height: 1.55; color: var(--muted); }
.cmp__cta { width: 1%; white-space: nowrap; }
.cmp__cta a { display: inline-flex; width: 34px; height: 34px; align-items: center; justify-content: center; border-radius: var(--radius-xs); background: var(--accent-t); color: var(--accent); transition: background .16s, color .16s; }
.cmp__cta a:hover { background: var(--accent); color: #fff; }
.cmp__cta svg { width: 18px; height: 18px; }

@media (max-width: 720px) {
  .cmp-wrap { overflow: visible; border: 0; background: transparent; box-shadow: none; }
  .cmp { min-width: 0; font-size: .9rem; }
  .cmp thead { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; }
  .cmp tbody tr { display: block; background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-sm); box-shadow: var(--shadow-sm); margin-bottom: 14px; padding: 4px 2px; }
  .cmp tbody tr:nth-child(even) { background: var(--white); }
  .cmp tbody tr.cmp__best { background: var(--value-t); border-color: var(--value); }
  .cmp td { display: flex; justify-content: space-between; align-items: center; gap: 16px; border: 0; padding: 8px 14px; text-align: left; }
  .cmp td[data-th]::before { content: attr(data-th); font-weight: 700; color: var(--muted); text-align: right; flex: none; }
  .cmp td:first-child { border-bottom: 1px solid var(--line); padding-bottom: 11px; margin-bottom: 4px; }
  .cmp td:first-child::before { display: none; }
  .cmp__info { max-width: 60%; text-align: left; }
  .cmp__best td:first-child { box-shadow: none; }
  .cmp__cta { width: auto; }
  .cmp__cta::before { display: none; }
  .cmp__cta a { width: 100%; gap: 8px; }
  .cmp__cta a::after { content: 'פנייה בוואטסאפ'; font-size: .9rem; font-weight: 600; }
}
@media (prefers-reduced-motion: reduce) { .cmp__cta a { transition: none; } }

/* ── "מידע נוסף" trigger buttons ─────────────────────────────────────────────── */
.plan__more {
  margin-top: 10px; width: 100%; display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  background: transparent; border: 1px solid var(--line); border-radius: var(--radius-sm);
  color: var(--ink); font: inherit; font-weight: 600; font-size: .92rem; padding: 9px 12px; cursor: pointer;
  transition: background .16s, border-color .16s, color .16s;
}
.plan__more svg { width: 17px; height: 17px; color: var(--accent); }
.plan__more:hover { background: var(--accent-t); border-color: var(--accent); }
.plan__more:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.cmp__name.cmp__more {
  background: none; border: 0; padding: 0; font: inherit; font-weight: 700; color: var(--ink);
  cursor: pointer; text-align: right; text-decoration: underline; text-decoration-color: var(--ink-200);
  text-underline-offset: 3px; transition: color .16s;
}
.cmp__name.cmp__more:hover { color: var(--accent); text-decoration-color: var(--accent); }
.cmp__name.cmp__more:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 3px; }

/* ── Plan details modal (מידע נוסף) ──────────────────────────────────────────── */
body.pmodal-lock { overflow: hidden; }
.pmodal { position: fixed; inset: 0; z-index: 1000; display: flex; align-items: flex-end; justify-content: center; }
.pmodal[hidden] { display: none; }
@media (min-width: 640px) { .pmodal { align-items: center; padding: 24px; } }
.pmodal__backdrop { position: absolute; inset: 0; background: rgba(8,12,18,.55); backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px); opacity: 0; transition: opacity .22s var(--ease); }
.pmodal--open .pmodal__backdrop { opacity: 1; }
.pmodal__panel {
  position: relative; width: 100%; max-width: 560px; max-height: 92vh; overflow-y: auto;
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0; box-shadow: var(--shadow-lg);
  padding: 26px 22px 22px; transform: translateY(26px);
  transition: transform .26s var(--ease); -webkit-overflow-scrolling: touch;
}
@media (min-width: 640px) { .pmodal__panel { border-radius: var(--radius-lg); transform: translateY(12px) scale(.98); } }
.pmodal--open .pmodal__panel { transform: none; }
.pmodal__x {
  position: absolute; inset-inline-start: 14px; top: 14px; width: 34px; height: 34px; border-radius: 50%;
  border: 1px solid var(--line); background: var(--cream); color: var(--ink); font-size: 15px; line-height: 1; cursor: pointer;
  display: grid; place-items: center; transition: background .16s, color .16s, border-color .16s;
}
.pmodal__x:hover { background: var(--accent); color: #fff; border-color: var(--accent); }
.pmodal__head { padding-inline-end: 40px; border-bottom: 1px solid var(--line); padding-bottom: 16px; }
.pmodal__brand { color: var(--muted); font-weight: 600; font-size: .9rem; }
.pmodal__title { font-family: 'Rubik', sans-serif; font-size: 1.4rem; margin: 4px 0 10px; color: var(--ink); line-height: 1.2; }
.pmodal__price { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.pmodal__price b { font-size: 1.7rem; color: var(--ink); }
.pmodal__price > span { color: var(--muted); }
.pmodal__after { color: var(--ink); font-weight: 600; background: var(--value-t); padding: 2px 9px; border-radius: 999px; font-size: .85rem; }
.pmodal__fixed { color: var(--accent); font-weight: 600; font-size: .9rem; }
.pmodal__flags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.pmodal__flag { font-size: .78rem; font-weight: 600; padding: 4px 10px; border-radius: 999px; background: var(--accent-t); color: var(--accent); }
.pmodal__sec { margin-top: 18px; }
.pmodal__sec h3 { font-family: 'Rubik', sans-serif; font-size: 1rem; margin: 0 0 10px; color: var(--ink); }
.pmodal__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
@media (max-width: 460px) { .pmodal__grid { grid-template-columns: 1fr; } }
.pmodal__row { display: flex; justify-content: space-between; gap: 12px; background: var(--cream); border: 1px solid var(--line); border-radius: var(--radius-xs); padding: 9px 12px; }
.pmodal__k { color: var(--muted); font-size: .88rem; }
.pmodal__v { color: var(--ink); font-weight: 600; font-size: .9rem; text-align: left; }
.pmodal__ul { margin: 0; padding-inline-start: 20px; display: flex; flex-direction: column; gap: 6px; }
.pmodal__ul li { color: var(--ink); line-height: 1.5; }
.pmodal__ul--fine li { color: var(--muted); font-size: .88rem; }
.pmodal__elig { margin-top: 14px; padding: 10px 14px; background: var(--accent-t); border-radius: var(--radius-sm); color: var(--ink); font-size: .9rem; }
.pmodal__cta { display: flex; flex-direction: column; gap: 10px; margin-top: 22px; }
.pmodal__cta .btn { width: 100%; }
.pmodal__upd { margin-top: 14px; text-align: center; color: var(--muted); font-size: .78rem; }
@media (prefers-reduced-motion: reduce) { .pmodal__backdrop, .pmodal__panel { transition: none; } }

/* ── Cookie consent banner (GA4 Consent Mode v2) ─────────────────────────────── */
.cbanner {
  position: fixed; inset-inline: 12px; bottom: 12px; z-index: 1100;
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px 18px;
  max-width: 760px; margin-inline: auto; padding: 14px 18px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--glint), var(--shadow-lg);
}
.cbanner[hidden] { display: none; }
/* Tiny slide only — the from-state (10px down, full opacity) is itself fully
   on-screen and visible, so even a paused/never-finished animation never hides
   the banner. No off-screen translate, no opacity dimming. */
@keyframes cbanner-in { from { transform: translateY(10px); } to { transform: none; } }
.cbanner:not([hidden]) { animation: cbanner-in .3s var(--ease); }
.cbanner__text { margin: 0; color: var(--ink); font-size: .9rem; line-height: 1.5; flex: 1 1 280px; }
.cbanner__text a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
.cbanner__actions { display: flex; gap: 8px; flex: 0 0 auto; }
.cbanner .cbanner__btn { padding-block: 10px; padding-inline: 20px; font-size: .9rem; }
@media (prefers-reduced-motion: reduce) { .cbanner:not([hidden]) { animation: none; } }
@media (max-width: 480px) { .cbanner__actions { width: 100%; } .cbanner .cbanner__btn { flex: 1; } }

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║  RUNTIME UI — surfaces that script.js BUILDS at runtime.              ║
   ║  Everything below styles class names emitted by script.js (toast      ║
   ║  stack, advisor recs, bill-analyzer results, bar charts, rating       ║
   ║  meters, community feed, 3D-tilt, press feedback). Markup-driven      ║
   ║  selectors above own first paint; these own the JS-rendered DOM, so   ║
   ║  the two never collided — they just weren't authored yet. Same        ║
   ║  token-driven, white-glass + ink + green/amber language; RTL-safe,    ║
   ║  dark-mode inherits via tokens, reduced-motion honoured.              ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

/* ── Toast host + lifecycle ──────────────────────────────────────────────────
   script.js stacks toasts inside a fixed .toast-host (bottom-centred) and drives
   each one with .is-in / .is-out — NOT the .is-visible the base .toast rule used,
   so toasts had no entrance, no pointer-events, and overlapped (each was its own
   position:fixed). The host now owns positioning; the toast is static within it
   and animates on .is-in. (.is-visible kept as a harmless alias.) */
.toast-host {
  position: fixed; inset-inline: 0; bottom: 24px; z-index: 70;
  display: flex; flex-direction: column-reverse; align-items: center; gap: 10px;
  padding-inline: 16px; pointer-events: none;
}
.toast-host .toast {
  position: static; inset: auto; margin: 0; bottom: auto;
}
.toast.is-in { opacity: 1; transform: translateY(0); pointer-events: auto; }
.toast.is-out { opacity: 0; transform: translateY(16px); pointer-events: none; }
.toast__msg { line-height: 1.4; }
@media (max-width: 480px) { .toast-host { inset-inline: 0; } .toast-host .toast { width: 100%; max-width: none; } }

/* ── Inline form error notes (cta + booking) ─────────────────────────────────
   script.js flags a failed submit by toggling these on the shared status note.
   They had no styling, so the error text stayed the band's default colour. */
.cta__note--err { color: #FECACA; }
.booking__note--err { color: var(--error); }
.booking__note.booking__note--err { color: var(--error); }

/* ── Skeleton stack (AI shells' loading state) ───────────────────────────────
   callAiFunction callers drop a .skeleton-stack of .skeleton rows in while a
   request is in flight. Give the rows graduated widths so they read as content. */
.skeleton-stack { display: grid; gap: 10px; margin: 4px 0; }
.skeleton-stack .skeleton { height: 14px; }
.skeleton-stack .skeleton:first-child { height: 20px; width: 55%; }
.skeleton-stack .skeleton:nth-child(3) { width: 80%; }

/* ── AI chat widget — prominent + robust busy states ─────────────────────────
   The on-site chat (.ai-chat) is the hero of app.html / the homepage AI band.
   Lift it into a real conversation surface: a glass shell with a soft accent
   wash, a scrollable log, and clear busy/disabled affordances so the input and
   the example chips visibly stop accepting taps mid-answer (script.js sets
   aria-busy / aria-disabled — these make that legible without colour alone). */
.ai-demo { position: relative; }
.ai-chat {
  max-height: min(58vh, 520px); overflow-y: auto; scroll-behavior: smooth;
  -webkit-overflow-scrolling: touch; scrollbar-width: thin;
}
.ai-chat::before {
  content: ""; position: absolute; inset: 0; z-index: -1; border-radius: 20px; pointer-events: none;
  background: radial-gradient(420px 200px at 90% -10%, var(--accent-t), transparent 70%);
  opacity: .5;
}
/* The input row reads as one pill: field + send button share a lifted ground. */
.ai-input { align-items: stretch; }
.ai-input input[aria-busy="true"] { opacity: .7; }
/* In-flight: the example chips dim and stop responding (aria-disabled), so a
   second question can't be queued mid-answer. */
.ai-chip[aria-disabled="true"] {
  opacity: .45; cursor: default; pointer-events: none; filter: saturate(.7);
}
/* Error bubble — same shell as a bot bubble but a quiet red rail, so a failed
   call reads as a state, not a normal answer. script.js reuses --bot; this is
   future-proofing for an explicit --error variant. */
.ai-bubble--error { border-bottom-inline-start-color: var(--error); }
@media (prefers-reduced-motion: reduce) { .ai-chat { scroll-behavior: auto; } }

/* ── Inline AI lead capture — injected when the server flags switch intent ────
   Sits inside the .ai-chat log (light surface), so ink-on-light. Mirrors the
   page lead form's consent contract: terms+privacy mandatory, marketing
   optional + default-off. No hard-coded brand colours — tokens flip in dark. */
.ai-lead {
  display: grid; gap: 10px; margin-top: 4px; padding: 16px;
  background: var(--accent-t); border: 1px solid var(--line); border-radius: 16px;
  border-bottom-inline-start: 4px solid var(--accent); justify-self: stretch;
}
.ai-lead__intro { margin: 0; font-weight: 600; color: var(--ink); font-size: 14.5px; line-height: 1.45; }
.ai-lead input[type="text"], .ai-lead input[type="tel"] {
  width: 100%; padding: 11px 14px; border: 1px solid var(--line); border-radius: 12px;
  font-family: inherit; font-size: 15px; background: var(--white); color: var(--ink);
}
.ai-lead input[type="text"]:focus-visible, .ai-lead input[type="tel"]:focus-visible {
  outline: none; box-shadow: var(--ring); border-color: var(--accent);
}
.ai-lead__consent { display: flex; align-items: flex-start; gap: 10px; cursor: pointer; font-size: 13.5px; line-height: 1.45; color: var(--ink); font-weight: 500; }
.ai-lead__consent input[type="checkbox"] { flex: 0 0 auto; width: 20px; height: 20px; min-width: 20px; margin: 1px 0 0; accent-color: var(--accent); cursor: pointer; }
.ai-lead__consent input[type="checkbox"]:focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; }
.ai-lead__consent a { color: var(--accent-ink); font-weight: 700; text-decoration: underline; text-underline-offset: 2px; }
.ai-lead__consent a:hover { opacity: .85; }
.ai-lead__note { margin: 0; min-height: 0; font-size: 13px; color: var(--muted); }
.ai-lead__note:empty { display: none; }
.ai-lead__note--err { color: var(--error); font-weight: 600; }
.ai-lead__submit { justify-self: stretch; }

/* ── Plan advisor — the JS-rendered question/recommendation flow ─────────────
   The static .advisor__step/option markup is the shell; script.js renders the
   live flow into .advisor__stage with these classes. Mirror the advisor's card
   language so the rendered steps + recs read as one component. */
.advisor__stage { display: grid; gap: 4px; }
.advisor__q { font-family: 'Rubik', sans-serif; font-size: 20px; color: var(--green-d); margin: 4px 0 14px; line-height: 1.25; }
.advisor__progress { color: var(--ink-400); font-size: 13px; font-weight: 700; letter-spacing: .02em; margin-bottom: 2px; }
.advisor__back { align-self: start; margin-top: 14px; }
.advisor__followup { color: var(--muted); margin: -6px 0 14px; line-height: 1.6; }
.advisor__recs { display: grid; gap: 12px; }
/* Each recommendation = a tinted glass card; the first (top pick) wears the
   green ACTION rail so the lead recommendation stands out. */
.advisor__rec {
  background: var(--cream); border: 1px solid var(--line);
  border-inline-start: 4px solid var(--ink-200); border-radius: 14px;
  padding: 16px 18px; box-shadow: var(--shadow-sm);
}
.advisor__rec:first-child { border-inline-start-color: var(--accent); background: var(--accent-t); }
.advisor__rec h4 { font-family: 'Rubik', sans-serif; font-size: 16px; color: var(--green-d); margin: 0 0 4px; }
.advisor__rec-price { font-family: 'Rubik', sans-serif; font-weight: 800; font-size: 18px; color: var(--green-d); margin: 2px 0; }
/* Saving = amber VALUE; the one figure on the card that wears the value colour. */
.advisor__rec-saving { color: var(--value-ink); font-weight: 700; font-size: 14px; margin: 2px 0; }
.advisor__rec-reason { color: var(--muted); font-size: 14px; line-height: 1.6; margin: 6px 0 0; }
.advisor__actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.advisor__actions .btn { flex: 1 1 auto; }

/* ── Bill analyzer — the JS-rendered upload result ───────────────────────────
   After site-bill-analyzer returns, script.js renders .bill-drop__result inside
   the drop zone. Style the summary + suggestion cards (same rec language as the
   advisor) and a busy state on the zone itself while the call is in flight. */
.bill-drop.is-loading { pointer-events: none; opacity: .75; cursor: progress; }
.bill-drop__result { width: 100%; display: grid; gap: 12px; margin-top: 6px; text-align: start; }
.bill-drop__title { font-family: 'Rubik', sans-serif; font-size: 17px; color: var(--green-d); margin: 0; }
.bill-drop__summary { color: var(--ink-700); font-size: 14.5px; line-height: 1.6; margin: 0; }
.bill-drop__suggestions { display: grid; gap: 10px; }
.bill-drop__suggestion {
  background: var(--cream); border: 1px solid var(--line);
  border-inline-start: 4px solid var(--accent); border-radius: 12px;
  padding: 14px 16px; box-shadow: var(--shadow-sm); text-align: start;
}
.bill-drop__suggestion h4 { font-family: 'Rubik', sans-serif; font-size: 15px; color: var(--green-d); margin: 0 0 4px; }
.bill-drop__suggestion-price { font-family: 'Rubik', sans-serif; font-weight: 800; font-size: 16px; color: var(--green-d); margin: 2px 0; }
.bill-drop__suggestion-saving { color: var(--value-ink); font-weight: 700; font-size: 13.5px; margin: 2px 0; }
.bill-drop__result .btn { justify-self: start; }

/* ── Bar charts — [data-chart] + the calc/ratings injected charts ────────────
   renderBarChart() builds an accessible RTL horizontal bar chart out of these
   classes. Bars animate width 0→n on reveal (script.js sets the inline width +
   transition); colours come ONLY from brand tokens via the kind modifier —
   never per-provider brand colours. */
.barchart { display: block; margin: 0 0 18px; }
.calc-result__chart.barchart { margin-bottom: 16px; }
.barchart__rows { display: grid; gap: 12px; }
.barchart__row { display: grid; grid-template-columns: minmax(72px, max-content) 1fr; align-items: center; gap: 12px; }
.barchart__label { font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 13.5px; color: var(--ink-700); white-space: nowrap; }
.barchart__track {
  position: relative; height: 30px; border-radius: 999px;
  background: var(--ink-050); border: 1px solid var(--line); overflow: hidden;
  display: flex; align-items: center;
}
.barchart__bar {
  height: 100%; border-radius: 999px; min-width: 2px;
  background: linear-gradient(90deg, var(--ink-500), var(--ink-700));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18);
}
/* kind=now → ink (today's spend); best/save → the value/accent figure. */
.barchart__row--now .barchart__bar { background: linear-gradient(90deg, var(--ink-500), var(--ink-700)); }
.barchart__row--best .barchart__bar { background: linear-gradient(90deg, var(--accent), var(--accent-d)); }
.barchart__row--save .barchart__bar { background: linear-gradient(90deg, var(--value), var(--value-d)); }
/* The value label rides at the inline-end of the track, on the inside. */
.barchart__val {
  position: absolute; inset-inline-end: 12px;
  font-family: 'Rubik', sans-serif; font-weight: 800; font-size: 13px;
  color: var(--green-d); font-variant-numeric: tabular-nums;
}
@media (max-width: 480px) {
  .barchart__row { grid-template-columns: 1fr; gap: 4px; }
  .barchart__label { font-size: 12.5px; }
}
@media (prefers-reduced-motion: reduce) { .barchart__bar { transition: none !important; } }

/* ── Rating meter — the animated 0→5 bar under each rating card ───────────────
   The community module renders .rating-card__stars (glyphs); the ratings-chart
   module then inserts a .rating-card__meter whose fill grows to score/5. */
.rating-card__stars { display: block; color: var(--value-ink); letter-spacing: 2px; font-size: 15px; line-height: 1; margin-top: 6px; }
.rating-card__meter {
  display: block; height: 8px; margin-top: 10px; border-radius: 999px;
  background: var(--ink-050); border: 1px solid var(--line); overflow: hidden;
}
.rating-card__meter-fill {
  display: block; height: 100%; border-radius: 999px;
  background: linear-gradient(90deg, var(--value), var(--value-d));
}
@media (prefers-reduced-motion: reduce) { .rating-card__meter-fill { transition: none !important; } }

/* ── Ratings + community runtime states ──────────────────────────────────────
   script.js paints these load/empty/error strings and the dynamic grid. The
   markup-side .ratings/.rating-card rules above style the cards; these add the
   container layout + status lines the build doesn't pre-render. */
.ratings__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 14px; }
.ratings__loading, .ratings__empty, .ratings__error,
.community__loading, .community__empty, .community__error {
  text-align: center; color: var(--muted); font-size: 14px; padding: 28px 16px;
}
.ratings__error, .community__error { color: var(--error); }
.rating-card__score { display: block; font-family: 'Rubik', sans-serif; font-weight: 900; font-size: 24px; color: var(--green-d); margin-top: 8px; letter-spacing: -.5px; }
.rating-card__count { display: block; color: var(--muted); font-size: 13px; margin-top: 2px; }

/* ── Post card runtime bits (dynamic feed) ───────────────────────────────────
   The build pre-renders one post-card shape (.post-card__who / __more); the live
   Supabase feed renders a sibling shape (.post-card__meta / __toggle). Style the
   latter to match so both look identical regardless of which path rendered. */
.post-card__meta { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1; }
.post-card__avatar--ph { background: var(--lime); color: var(--green-d); }
.post-card__toggle {
  margin-top: 12px; background: none; border: 0; padding: 6px 4px; cursor: pointer;
  font-family: 'Rubik', sans-serif; font-weight: 700; font-size: 13.5px; color: var(--accent-ink);
  display: inline-flex; align-items: center; gap: 6px; border-radius: 8px; transition: color .15s;
}
.post-card__toggle:hover { color: var(--accent-d); }
.post-card__toggle:focus-visible { box-shadow: var(--ring-flush); }
.post-card__noreplies { color: var(--muted); font-size: 13.5px; padding: 6px 4px; }

/* ── 3D card tilt — consume the --tilt-x/--tilt-y vars script.js sets ─────────
   The pointer-tilt module sets these custom props + .is-tilting on plan/provider/
   rec/rating cards, but nothing read them, so the tilt was inert. Apply a real
   perspective rotation that COMPOSES with the existing hover lift (translate is
   owned by hover/magnetic; rotate lives here). Desktop hover only, off under
   reduced-motion. */
.plan.is-tilting, .provider-card.is-tilting, .advisor__rec.is-tilting, .rating-card.is-tilting {
  transform: perspective(900px) rotateX(var(--tilt-x, 0deg)) rotateY(var(--tilt-y, 0deg));
  transition: transform .12s var(--ease);
}
@media (hover: none), (prefers-reduced-motion: reduce) {
  .plan.is-tilting, .provider-card.is-tilting, .advisor__rec.is-tilting, .rating-card.is-tilting { transform: none; }
}

/* ── Press feedback — the delegated .is-pressed hook (pointer + keyboard) ─────
   script.js adds .is-pressed on pointerdown / Space / Enter so touch + keyboard
   activation get the same tactile dip the CSS :active gives a mouse press. */
.is-pressed:not([disabled]):not(.is-loading) { transform: scale(.97); }
.btn.is-pressed:not([disabled]):not(.is-loading) { transform: translateY(0) scale(.97); }
@media (prefers-reduced-motion: reduce) { .is-pressed { transform: none !important; } }

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║  PREMIUM-2026 UPGRADE  ·  bento · deeper glass · air · soft glow       ║
   ║                                                                        ║
   ║  A final, presentation-only layer that elevates the existing system    ║
   ║  to a 2026 aesthetic WITHOUT changing the brand: same green --accent / ║
   ║  amber --value / ink palette, same [data-theme] dark mode + tokens,    ║
   ║  same RTL + a11y. It layers (1) generous whitespace, (2) tighter/      ║
   ║  larger display headings (-0.02em), (3) BENTO css-grids for card /     ║
   ║  data sections, (4) deeper glassmorphism on the header + floating      ║
   ║  elements, (5) softer low-opacity borders + a subtle accent glow on    ║
   ║  hover, and (6) smooth transitions + :focus-visible parity on every    ║
   ║  interactive surface. prefers-reduced-motion is honoured throughout.   ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

:root {
  /* A touch more breathing room in the rhythm — section padding & grid gaps
     tune against these, so the whole site gains air from one place. */
  --space-2xl: 120px;
  --gap-bento: 22px;
  /* Soft, low-opacity hairlines — the 2026 "no hard black border" rule. The
     existing --line stays for legacy callers; these are the soft variants the
     upgraded surfaces reach for. */
  --line-soft: rgba(17, 24, 39, .08);
  --line-softer: rgba(17, 24, 39, .055);
  /* Signature subtle accent glow (green ACTION) — layered after a card's own
     elevation on hover/focus so the surface picks up a faint brand halo. */
  --glow-accent: 0 0 0 1px rgba(22, 163, 74, .18), 0 18px 50px -18px rgba(22, 163, 74, .35);
  --glow-value: 0 0 0 1px rgba(245, 158, 11, .22), 0 18px 50px -18px rgba(245, 158, 11, .34);
  /* A deeper, glassier ambient shadow for floating bento tiles. */
  --shadow-float: 0 2px 8px rgba(15, 27, 34, .05), 0 24px 60px -20px rgba(15, 27, 34, .22);
}
:root[data-theme="dark"] {
  --line-soft: rgba(255, 255, 255, .085);
  --line-softer: rgba(255, 255, 255, .06);
  --glow-accent: 0 0 0 1px rgba(74, 222, 128, .26), 0 18px 50px -18px rgba(74, 222, 128, .4);
  --glow-value: 0 0 0 1px rgba(251, 191, 36, .28), 0 18px 50px -18px rgba(251, 191, 36, .4);
  --shadow-float: 0 2px 8px rgba(0, 0, 0, .5), 0 24px 60px -20px rgba(0, 0, 0, .65);
}

/* ── Display headings: tighter, larger, modern tracking ─────────────────────
   The 2026 look = big display type pulled tight. -0.02em across the heading
   scale, applied without overriding the existing ink-gradient clip. */
h1 { letter-spacing: -.02em; }
.hero h1, .lead-hero h1, .article-hero h1 { letter-spacing: -.022em; }
.section__head h2, .cta h2 { letter-spacing: -.02em; }
.section__head { max-width: 680px; }
.section__head h2 { line-height: 1.04; }
/* Lead paragraphs get a hair more measure for editorial calm. */
.section__head p { max-width: 52ch; margin-inline: auto; }

/* ── More whitespace — bigger section rhythm on roomy viewports ──────────────
   Scales up only where there's room (>=1024px); the existing mobile clamps in
   the responsive block keep phones tight. */
@media (min-width: 1024px) {
  .section { padding-block: var(--space-2xl); }
  .section__head { margin-bottom: 64px; }
  .cta { padding-block: 104px; }
  .lead-hero { padding-top: 72px; }
}

/* ── Deeper header glassmorphism (with opaque fallback) ─────────────────────
   A stronger frosted-glass header: more blur + saturation, a hairline glass
   edge, and a soft lifted shadow once scrolled. */
.nav {
  background: rgba(246, 248, 249, .68);
  backdrop-filter: blur(20px) saturate(160%);
  -webkit-backdrop-filter: blur(20px) saturate(160%);
  border-bottom: 1px solid var(--line-softer);
}
.nav.scrolled {
  background: rgba(246, 248, 249, .8);
  border-bottom-color: var(--line-soft);
  box-shadow: 0 8px 30px -12px rgba(15, 27, 34, .14);
}
:root[data-theme="dark"] .nav { background: rgba(17, 22, 28, .62); }
:root[data-theme="dark"] .nav.scrolled { background: rgba(17, 22, 28, .82); }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) {
  .nav { background: var(--cream); }
  :root[data-theme="dark"] .nav { background: #11161C; }
}

/* ── Deeper glass on floating overlays (mega-menu, cookie banner) ─────────── */
.mega-menu__panel {
  background: rgba(255, 255, 255, .82);
  backdrop-filter: blur(22px) saturate(150%);
  -webkit-backdrop-filter: blur(22px) saturate(150%);
  border-color: var(--line-soft);
  box-shadow: var(--glint), var(--shadow-float);
}
:root[data-theme="dark"] .mega-menu__panel { background: rgba(22, 28, 36, .82); }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) {
  .mega-menu__panel { background: var(--white); }
}
.cbanner {
  background: rgba(255, 255, 255, .8);
  backdrop-filter: blur(20px) saturate(150%);
  -webkit-backdrop-filter: blur(20px) saturate(150%);
  border-color: var(--line-soft);
}
:root[data-theme="dark"] .cbanner { background: rgba(22, 28, 36, .85); }
@supports not ((backdrop-filter: blur(14px)) or (-webkit-backdrop-filter: blur(14px))) {
  .cbanner { background: var(--white); }
}

/* ── Decorative hero network motif (was unstyled markup) ────────────────────
   build.js layers a single-colour <svg class="hero-decor__svg"> behind the
   lead-hero / versus / collection heroes via .hero-decor. Place it as a faint,
   pointer-inert ambient backdrop tinted with the brand green. */
.hero-decor {
  position: absolute; inset: 0; z-index: -1; overflow: hidden; pointer-events: none;
  -webkit-mask-image: radial-gradient(120% 90% at 75% 0%, #000 35%, transparent 78%);
  mask-image: radial-gradient(120% 90% at 75% 0%, #000 35%, transparent 78%);
}
.hero-decor__svg {
  position: absolute; inset-block-start: -8%; inset-inline-end: -6%;
  width: min(760px, 78%); height: auto; color: var(--accent); opacity: .14;
  transform: translate3d(0, calc(var(--parallax, 0px) * .25), 0); will-change: transform;
}
:root[data-theme="dark"] .hero-decor__svg { opacity: .2; }
@media (max-width: 760px) { .hero-decor__svg { width: 120%; inset-inline-end: -30%; opacity: .1; } }
@media (prefers-reduced-motion: reduce) { .hero-decor__svg { transform: none; } }

/* ── Split lead-hero (was unstyled) — text + app-shot, two-column ────────────
   The category hero ships .lead-hero--split with a .lead-hero__grid wrapping
   .lead-hero__text and .lead-hero__media (a phone screenshot). Lay it out as a
   roomy asymmetric two-column hero that collapses to one column on tablet. */
.lead-hero--split { text-align: start; }
.lead-hero__grid {
  display: grid; grid-template-columns: 1.08fr .92fr; gap: clamp(28px, 5vw, 64px);
  align-items: center;
}
.lead-hero--split .pill { margin-top: 4px; }
.lead-hero--split h1 { margin-top: 6px; }
.lead-hero--split .hero__cta { justify-content: flex-start; }
.lead-hero__media { display: grid; place-items: center; }
.app-shot--hero {
  margin: 0; position: relative; max-width: 340px; width: 100%;
}
.app-shot--hero img {
  width: 100%; height: auto; display: block; border-radius: 34px;
  border: 1px solid var(--line-soft);
  box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255, 255, 255, .5);
  background: var(--cream);
}
/* A soft brand-tinted glow puddle behind the floating device. */
.app-shot--hero::before {
  content: ""; position: absolute; inset: 8% 6% -6%; z-index: -1; border-radius: 40px;
  background: radial-gradient(closest-side, rgba(22, 163, 74, .22), transparent 72%);
  filter: blur(18px);
}
@media (max-width: 900px) {
  .lead-hero__grid { grid-template-columns: 1fr; gap: 32px; }
  .lead-hero__media { order: -1; }
  .lead-hero--split { text-align: center; }
  .lead-hero--split .hero__cta { justify-content: center; }
  .app-shot--hero { max-width: 280px; }
}

/* ── BENTO grids — asymmetric, generous-gap card/data layouts ────────────────
   The 2026 signature. We re-cast the existing equal-grid sections into bento
   compositions: a slightly larger "anchor" tile leads, the rest flow in. All
   gracefully collapse to one column on small screens (handled below + by the
   existing responsive block). Markup unchanged — pure CSS over current classes. */

/* Features ("how to choose" / category bullets): roomier auto-fit bento. */
.features {
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--gap-bento);
}
/* The 4-bullet category feature grid reads best as a balanced 2x2 bento with a
   leading emphasis tile. */
@media (min-width: 760px) {
  .section--alt .features:has(> .feature:nth-child(4):last-child) {
    grid-template-columns: repeat(2, 1fr);
  }
  .section--alt .features:has(> .feature:nth-child(4):last-child) > .feature:first-child {
    grid-column: span 2;
    background: linear-gradient(150deg, rgba(22, 163, 74, .07), rgba(255, 255, 255, .66) 55%);
  }
  :root[data-theme="dark"] .section--alt .features:has(> .feature:nth-child(4):last-child) > .feature:first-child {
    background: linear-gradient(150deg, rgba(74, 222, 128, .12), rgba(28, 36, 46, .6) 55%);
  }
}

/* Homepage category tiles -> bento: 5-up becomes a 2+2+2 / 3+3 asymmetric set,
   the first tile spanning wider as the hero category. */
@media (min-width: 760px) {
  .cats:has(> .cat:nth-child(5)) { grid-template-columns: repeat(6, 1fr); gap: var(--gap-bento); }
  .cats:has(> .cat:nth-child(5)) > .cat { grid-column: span 2; }
  .cats:has(> .cat:nth-child(5)) > .cat:nth-child(4) { grid-column: span 3; }
  .cats:has(> .cat:nth-child(5)) > .cat:nth-child(5) { grid-column: span 3; }
}

/* Collections grid -> relaxed bento with a wider lead tile. */
.collections-grid { gap: var(--gap-bento); }
@media (min-width: 900px) {
  .collections-grid:has(> .collection-chip:nth-child(5)) > .collection-chip:first-child {
    grid-column: span 2;
  }
}

/* Guide / quote / ratings grids — keep their counts but gain the bento gap. */
.guide-cards, .quotes, .ratings, .ratings__grid { gap: var(--gap-bento); }

/* ── Softer borders site-wide — replace harsh hairlines with low-opacity ─────
   Only the structural card/panel rims; semantic rims (errors, best-value,
   active states) keep their stronger colour. */
.feature, .step, .cat, .guide-card, .plan, .provider-card, .quote, .rating-card,
.collection-chip, .review-card, .post-card, .ai-chat, .booking, .advisor,
.cmp-wrap, .faq__list details, .tldr, .callout, .cbanner {
  border-color: var(--line-soft);
}

/* ── Subtle accent glow on hover / focus — the brand halo ────────────────────
   Layered on top of each surface's own hover elevation, so cards pick up a
   faint green ACTION glow when pointed at or tabbed to. Value-tier surfaces use
   the amber glow. Composes with the existing transform lift. */
.feature, .guide-card, .plan, .provider-card, .cat, .collection-chip, .step,
.rating-card {
  transition: transform .24s var(--ease), box-shadow .28s var(--ease), border-color .2s;
}
.feature:hover, .guide-card:hover, .provider-card:hover, .cat:hover,
.collection-chip:hover, .rating-card:hover {
  border-color: rgba(22, 163, 74, .3);
  box-shadow: var(--glint), var(--shadow), var(--glow-accent);
}
.guide-card:focus-visible, .provider-card:focus-visible, .cat:focus-visible,
.collection-chip:focus-visible, .provider-card:focus-within {
  box-shadow: var(--ring), var(--shadow), var(--glow-accent);
}
/* Plan cards lean to the value glow only on the best-value anchor; regular
   plan cards keep the neutral lift so the catalogue stays calm. */
.plan:hover { box-shadow: var(--glint), var(--shadow), var(--glow-accent); border-color: rgba(22, 163, 74, .28); }
.plan.plan--best:hover {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .7), 0 0 0 2px var(--value), var(--shadow-lg), var(--glow-value);
}

/* ── Buttons: a touch more presence + universal smooth transition ───────────
   The primary CTA already glows green; deepen its rest + hover halo a notch. */
.btn--primary {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 12px 28px -8px rgba(22, 163, 74, .5), 0 2px 6px rgba(21, 128, 61, .24);
}
.btn--primary:hover {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .24), 0 20px 42px -10px rgba(22, 163, 74, .62), 0 3px 8px rgba(21, 128, 61, .28);
}
.btn--lg { border-radius: 20px; }

/* ── Chips / pills: softer rims + smooth lift parity ────────────────────────── */
.chip { border-color: var(--line-soft); }
a.chip:hover { border-color: rgba(22, 163, 74, .35); box-shadow: 0 10px 24px -10px rgba(22, 163, 74, .4); color: var(--accent-ink); }

/* ── Comparison tables: lift into a soft glass panel ───────────────────────── */
.cmp-wrap { box-shadow: var(--glint), var(--shadow-float); border-color: var(--line-soft); }
.cmp thead th { border-bottom-color: var(--line-soft); }
.cmp td { border-bottom-color: var(--line-softer); }

/* ── Plan spec chips: softer rim ──────────────────────────────────────────── */
.pchip { border-color: var(--line-soft); }

/* ── FAQ: roomier, softer, smoother ───────────────────────────────────────── */
.faq__list details { border-radius: var(--radius-sm); }
.faq__list details[open] { box-shadow: var(--shadow), var(--glow-accent); border-color: rgba(22, 163, 74, .2); }

/* ── Footer: a hair more air on roomy viewports ───────────────────────────── */
@media (min-width: 1024px) { .footer { padding-top: 72px; } }

/* ── Section alt band: soften the block rule to the new hairline ───────────── */
.section--alt { border-block-color: var(--line-soft); }

/* ── Reduced-motion: neutralise the new motion, keep state cues ─────────────── */
@media (prefers-reduced-motion: reduce) {
  .hero-decor__svg, .app-shot--hero { transform: none; }
  .feature, .guide-card, .plan, .provider-card, .cat, .collection-chip, .step,
  .rating-card { transition: box-shadow .01s, border-color .01s; }
}
