/* ==========================================================================
   SECURASHADE TECHLABS — Design tokens
   Theme-independent tokens live here. Color tokens are defined per-theme
   below so the whole site can switch between light and dark via
   [data-theme] on <html> — see the theme toggle in script.js.
   ========================================================================== */
:root {
  /* -- Brand accent: constant across both themes for a consistent identity -- */
  --color-accent: #e2872f;
  --color-accent-strong: #c96a1c;
  --color-accent-rgb: 226, 135, 47;
  --color-on-accent: #ffffff;

  /* -- Type -- */
  --font-display: Georgia, 'Times New Roman', serif;
  --font-body: Georgia, 'Times New Roman', serif;

  /* -- Spacing scale -- */
  --space-1: 0.4rem;
  --space-2: 0.8rem;
  --space-3: 1.6rem;
  --space-4: 1.0rem;
  --space-5: 0.5rem;
  --space-6: 4rem;

  /* -- Shape / motion -- */
  --radius-sm: 6px;
  --radius-md: 12px;
  --radius-lg: 18px;
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --dur-fast: 180ms;
  --dur-mid: 380ms;

  --header-height: 110px;
  /* Small breathing room left between the panel's bottom edge and the
     bottom of the viewport (taskbar, browser chrome, etc). */
  --stack-bottom-gap: 20px;
  /* Use dvh where supported so panel height stays correct across browsers
     with dynamic toolbars (mobile Safari, Chrome Android, etc). */
  --viewport-height: 100vh;
  --viewport-height: 100dvh;
  /* Panel height is derived from the viewport minus the sticky top
     offset and the bottom gap, so top + height + bottom-gap always
     equals 100vh — the panel can never be tall enough to get clipped. */
  --stack-panel-height: clamp(
    320px,
    calc(var(--viewport-height) - var(--header-height) - var(--space-2) - var(--stack-bottom-gap)),
    980px
  );

  /* Uniform reveal margin between one settled sub-section and the next
     one stacking over it. 38px = ~1cm on a standard 96dpi screen, so
     every "step" in the stack always leaves at least a full centimetre
     of the previous sub-section visible around the new one. */
  --stack-gap: 16px;
  --stack-card-radius: 44px;
  --stack-card-pad: 40px;

  /* Total scroll distance for the sequence: one full viewport to arrive
     at sub-section 1, plus one more per hand-off to the next card
     (2 hand-offs for 3 cards), so each stacking motion gets a full,
     unhurried scroll pass instead of feeling rushed. */
  --stack-track-height: 310vh;
}

@media (max-width: 900px) {
  :root {
    --header-height: 92px;
    --stack-panel-height: clamp(
      280px,
      calc(var(--viewport-height) - var(--header-height) - var(--space-2) - var(--stack-bottom-gap)),
      900px
    );
    --stack-card-radius: 30px;
    --stack-card-pad: 22px;
    --stack-track-height: 280vh;
  }
}
@media (max-width: 560px) {
  :root { --header-height: 76px; --stack-gap: 8px; --stack-card-pad: 14px; --stack-track-height: 250vh; }
}

/* ---- Short viewports (landscape phones, short desktop browser windows):
   the calc() term is always the exact correct height to make
   top + height + bottom-gap equal 100vh, but clamp()'s floor wins
   whenever that calc'd value dips below it — which is exactly what
   pushes the sticky panel past the bottom of a short screen. Keyed on
   height alone (no width condition) so it catches short landscape
   phones and squashed desktop windows alike. Placed last so it wins
   over the width-based rules above regardless of viewport width. */
@media (max-height: 760px) {
  :root {
    --stack-panel-height: clamp(
      240px,
      calc(var(--viewport-height) - var(--header-height) - var(--space-2) - var(--stack-bottom-gap)),
      980px
    );
  }
}

/* ==========================================================================
   Theme: light (default)
   ========================================================================== */
:root,
:root[data-theme="light"] {
  --color-bg: #f7f6f2;
  --color-bg-rgb: 247, 246, 242;
  --color-panel: #ffffff;
  --color-navy: #1c2b46;        /* structural borders / focus rings / ink accents */
  --color-ink: #171b22;
  --color-ink-muted: #5b6472;
  --color-header-bar: #12151c;

  --glass-bg: rgba(255, 255, 255, 0.62);
  --glass-border: rgba(28, 43, 70, 0.28);
  --glass-blur: 14px;
  --field-bg: rgba(255, 255, 255, 0.85);
  --field-placeholder: rgba(23, 27, 34, 0.35);

  /* Sub-section gradients — a restrained corporate progression (deep
     navy → teal → indigo → bronze) that stays in the same family as
     the brand navy/accent instead of the previous candy-bright hues. */
  --card1-grad-a: #e6e8eb;
  --card1-grad-b: #35507c;
  --card2-grad-a: #f1f9f8;
  --card2-grad-b: #14958a;
  /* Sub-section 3 intentionally matches the dark-theme values below
     (not the light progression) per request, so it reads identically
     in both themes. */
  --card3-grad-a: #c6c5cd;
  --card3-grad-b: #1c1740;
  --card4-grad-a: #f0ebe8;
  --card4-grad-b: #b06a26;
  --card-ink: #000000;

  color-scheme: light;
}

/* ==========================================================================
   Theme: dark
   ========================================================================== */
:root[data-theme="dark"] {
  --color-bg: #181818;
  --color-bg-rgb: 24, 24, 24;
  --color-panel: #232323;
  --color-navy: #aab6c9;        /* structural borders lighten so they read on dark surfaces */
  --color-ink: #eef2f7;
  --color-ink-muted: #93a0b4;
  --color-header-bar: #101010;

  --glass-bg: rgba(35, 35, 35, 0.6);
  --glass-border: rgba(238, 242, 247, 0.16);
  --glass-blur: 16px;
  --field-bg: rgba(255, 255, 255, 0.06);
  --field-placeholder: rgba(238, 242, 247, 0.35);

  --card1-grad-a: #b1b5bb;
  --card1-grad-b: #0a1220;
  --card2-grad-a: #b2c9c6;
  --card2-grad-b: #06231f;
  --card3-grad-a: #c6c5cd;
  --card3-grad-b: #1c1740;
  --card4-grad-a: #dacfc3;
  --card4-grad-b: #2b1706;
  --card-ink: #F3F4F6;

  color-scheme: dark;
}

/* ==========================================================================
   Reset & base
   ========================================================================== */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--color-bg);
  color: var(--color-ink);
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
  transition: background-color var(--dur-mid) var(--ease-out), color var(--dur-mid) var(--ease-out);
}

h1, h2, h3 { font-family: var(--font-display); margin: 0; letter-spacing: -0.01em; }
p { margin: 0; }
ul { list-style: none; margin: 0; padding: 0; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; cursor: pointer; }
input { font-family: inherit; }

.eyebrow {
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-accent);
  margin-bottom: var(--space-2);
}

/* Smooth cross-theme transitions on the main surfaces (gradients on the
   sub-section cards are intentionally excluded — browsers can't tween
   gradient stops smoothly, so those swap instantly, which reads fine). */
.stack-frame,
.feature-box,
.site-footer,
.field__input,
.stack-card__label {
  transition: background-color var(--dur-mid) var(--ease-out),
              border-color var(--dur-mid) var(--ease-out),
              color var(--dur-mid) var(--ease-out),
              box-shadow var(--dur-mid) var(--ease-out);
}

/* ==========================================================================
   Header — thin top accent bar + logo pinned top-left
   ========================================================================== */
.site-header {
  position: fixed;
  inset: 0 0 auto 0;
  height: var(--header-height);
  z-index: 1000;
  isolation: isolate;
  transition: background var(--dur-mid) var(--ease-out), box-shadow var(--dur-mid) var(--ease-out);
}
.site-header__bar {
  height: 0px;
  width: 100%;
  background: var(--color-header-bar);
}
.site-header.is-scrolled {
  background: rgba(var(--color-bg-rgb), 0.94);
  backdrop-filter: blur(var(--glass-blur));
  -webkit-backdrop-filter: blur(var(--glass-blur));
  box-shadow: 0 8px 24px -16px rgba(28, 43, 70, 0.35);
}

.navbar{
    max-width:1480px;
    margin:0 auto;
    height:100%;
    padding :0 var(--space-5);
    display:flex;
    align-items:center;
    justify-content:space-between;
}

/* Logo container — stays on the left (as originally), just nudged a
   little further right from its original flush-left position. */
.navbar__logo { display: inline-flex; margin-left: 96px; }
.navbar__logo-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: transform var(--dur-fast) var(--ease-out);
}
.navbar__logo:hover .navbar__logo-badge { transform: translateY(-2px); }


.navbar__logo-word {
  font-family: var(--font-display);
  font-weight: 600;
  color: #ffffff;
  font-size: 0.92rem;
  letter-spacing: 0.01em;
  white-space: nowrap;
}

.navbar__logo-img {
  height: 100px;
  width: auto;
  display: block;
  transform: translate(-70px, 0px);
}

.navbar__nav {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  margin-top: 0.9rem;
}
.navbar__links { display: flex; gap: 2.1rem; font-size: 1.08rem; color: var(--color-ink); opacity: 0.88; }
.navbar__links a { transition: color var(--dur-fast) var(--ease-out); }
.navbar__links a:hover { color: var(--color-navy); opacity: 1; }

/* Hamburger menu toggle — hidden on desktop, shown only once the inline
   nav links no longer fit comfortably (see Responsive section below). */
.navbar__toggle {
  display: none;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 5px;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  border: 1.5px solid var(--glass-border);
  background: var(--glass-bg);
  flex: 0 0 auto;
  position: relative;
  z-index: 120;
  transition: border-color var(--dur-fast) var(--ease-out);
}
.navbar__toggle:hover { border-color: var(--color-accent); }
.navbar__toggle-bar {
  width: 18px;
  height: 2px;
  border-radius: 2px;
  background: var(--color-ink);
  transition: transform var(--dur-fast) var(--ease-in-out), opacity var(--dur-fast) var(--ease-in-out);
}
.navbar__toggle.is-active .navbar__toggle-bar:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.navbar__toggle.is-active .navbar__toggle-bar:nth-child(2) { opacity: 0; }
.navbar__toggle.is-active .navbar__toggle-bar:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* Theme toggle — small circular switch, sun/moon crossfade. Given an
   accent-colored ring, a soft ambient glow, and a slow breathing pulse
   so it reads as a distinct, inviting control rather than blending
   into the plain nav icons around it. */
.theme-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  border: 1.5px solid var(--color-accent);
  background: var(--glass-bg);
  color: var(--color-ink);
  position: relative;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 18%, transparent),
              0 0 14px 1px color-mix(in srgb, var(--color-accent) 45%, transparent);
  transition: border-color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out);
  animation: themeTogglePulse 2.6s ease-in-out infinite;
}
.theme-toggle:hover {
  border-color: var(--color-accent);
  transform: translateY(-2px) scale(1.06);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--color-accent) 28%, transparent),
              0 0 20px 3px color-mix(in srgb, var(--color-accent) 65%, transparent);
  animation-play-state: paused;
}
@keyframes themeTogglePulse {
  0%, 100% {
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 18%, transparent),
                0 0 14px 1px color-mix(in srgb, var(--color-accent) 45%, transparent);
  }
  50% {
    box-shadow: 0 0 0 5px color-mix(in srgb, var(--color-accent) 30%, transparent),
                0 0 22px 4px color-mix(in srgb, var(--color-accent) 70%, transparent);
  }
}
@media (prefers-reduced-motion: reduce) {
  .theme-toggle { animation: none; }
}
.theme-toggle__icon {
  width: 19px;
  height: 19px;
  position: absolute;
  transition: opacity var(--dur-mid) var(--ease-in-out), transform var(--dur-mid) var(--ease-in-out);
}
.theme-toggle__icon--sun { opacity: 1; transform: rotate(0deg) scale(1); color: #f4a11f; }
.theme-toggle__icon--moon { opacity: 0; transform: rotate(-60deg) scale(0.6); }
[data-theme="dark"] .theme-toggle__icon--sun { opacity: 0; transform: rotate(60deg) scale(0.6); }
[data-theme="dark"] .theme-toggle__icon--moon { opacity: 1; transform: rotate(0deg) scale(1); }

/* =====================================================
   MEGA MENU
===================================================== */

.dropdown{
    position:relative;
}

/* Show dropdown on hover */

.dropdown:hover .mega-menu{
    opacity:1;
    visibility:visible;
    transform:
    translateX(-50%)
    translateY(0);
}

/* Dropdown Box */

.mega-menu{

    position:absolute;

    top:100%;
    margin-top:-2px;
    left:50%;

    transform:
    translateX(-50%)
    translateY(0);

    width: min(650px, calc(100vw - 2 * var(--space-4)));

    background:white;

    padding:30px;

    border-radius:20px;

    box-shadow:
    0 20px 50px rgba(0,0,0,.12);

    opacity:0;
    visibility:hidden;

    transition:.3s ease;

    z-index:1000;
}

/* Links Layout */

.menu-links{

    display:grid;

    grid-template-columns:
    repeat(3,1fr);

    gap: 10px;

    align-items:center;

    white-space:nowrap;
}

.menu-links a{

    color:var(--text-light);

    font-weight:500;

    transition:.3s ease;
}

.menu-links a:hover{

    color:var(--secondary);

    transform:translateY(-2px);
}

/* ==========================================================================
   Buttons
   ========================================================================== */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  padding: 0.85rem 1.6rem;
  font-size: 0.92rem;
  font-weight: 600;
  transition: transform var(--dur-fast) var(--ease-out),
              box-shadow var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.btn:active { transform: translateY(1px) scale(0.98); }

.btn--primary {
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-strong));
  color: var(--color-on-accent);
}
.btn--primary:hover { box-shadow: 0 10px 24px -8px rgba(var(--color-accent-rgb), 0.55); transform: translateY(-2px); }

.btn--ghost {
  background: transparent;
  border-color: var(--glass-border);
  color: var(--color-ink);
}
.btn--ghost:hover { border-color: var(--color-accent); color: var(--color-accent); }

.btn--pill { border-radius: 999px; padding: 0.7rem 1.4rem; font-size: 0.85rem; }
.btn--small { padding: 0.65rem 1.2rem; font-size: 0.85rem; }
.btn--large { padding: 1.1rem 2.2rem; font-size: 1rem; }

/* Activate reads as the brand-accent control, with a soft idle pulse
   to invite the click — same treatment in both themes. */
.btn--activate {
  position: relative;
  isolation: isolate;
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-strong));
  color: var(--color-on-accent);
  min-width: 168px;
}
.btn--activate::after {
  content: '';
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  box-shadow: 0 0 0 0 rgba(var(--color-accent-rgb), 0.45);
  animation: pulse-ring 2.6s var(--ease-in-out) infinite;
  z-index: -1;
}
@keyframes pulse-ring {
  0%   { box-shadow: 0 0 0 0 rgba(var(--color-accent-rgb), 0.4); }
  70%  { box-shadow: 0 0 0 14px rgba(var(--color-accent-rgb), 0); }
  100% { box-shadow: 0 0 0 0 rgba(var(--color-accent-rgb), 0); }
}

/* ==========================================================================
   Hero
   ========================================================================== */
.hero {
  padding: calc(var(--header-height) + var(--space-5)) var(--space-5) var(--space-4);
  max-width: 900px;
  margin: 0 auto;
}
.hero__title {
  font-size: clamp(2rem, 4.4vw, 3.2rem);
  font-weight: 600;
  line-height: 1.1;
}
.hero__subtitle {
  margin-top: var(--space-2);
  max-width: 560px;
  font-size: 1.05rem;
  color: var(--color-ink-muted);
}

/* ==========================================================================
   STACKED SEQUENCE (true overlapping cards)
   .stack-track is a tall spacer; .stack-panel pins via position: sticky
   for the duration of that scroll — this is what prevents the page from
   advancing until the sequence finishes.

   Inside the fixed-size panel, every .stack-card is absolutely positioned
   and fully fills sub-section 1's footprint. Sub-section 1 stays put as
   the base layer. Each following sub-section starts translated fully out
   of view below the frame; as the user scrolls through its phase it
   slides up and settles inset by (--stack-gap * its position in the
   stack) from the frame edge — which, because every earlier card is
   itself inset by one fewer step, always reads as a uniform ≥1cm margin
   around the sub-section sitting directly beneath it. script.js drives
   the reveal (0→1) and the covered-card dim/blur purely via custom
   properties, so layout math never fights the animation.
   ========================================================================== */
.stack-track {
  position: relative;
  height: var(--stack-track-height, 480vh);
}

.stack-panel {
  position: sticky;
  top: calc(var(--header-height) + var(--space-2));
  height: var(--stack-panel-height);
  display: flex;
  align-items: center;
  padding: 0 8px;
}

.stack-frame {
  position: relative;
  width: 100%;
  max-width: 1760px;
  margin: 0 auto;
  height: 98%;
  border-radius: var(--stack-card-radius);
  overflow: hidden;
  box-shadow: 0 30px 60px -30px rgba(28, 43, 70, 0.45);
  background: var(--color-panel);
  /* Tells the browser nothing inside this frame can visually affect
     anything outside it, so the stacked cards' per-frame blur/transform
     updates don't force the rest of the page to be reconsidered for
     repaint on every scroll tick. Pure perf hint — nothing here
     overflows the frame (overflow: hidden already clips it), so it
     doesn't change anything visually. */
  contain: paint;
}

/* Every card fills the frame at rest; each successive card is inset one
   more --stack-gap step than the one before it, so it settles leaving a
   uniform margin around whichever card is directly beneath it. */
.stack-card {
  position: absolute;
  border-radius: var(--stack-card-radius);
  overflow: hidden;
  will-change: transform;
  /* Forces each card onto its own GPU compositor layer (translate3d is
     the classic hardware-acceleration trigger, and works in browsers
     that don't fully honor will-change). Without this, the browser
     has to re-rasterize every already-settled card's backdrop-filter
     blur (see .stack-card::before) on every scroll frame just because
     a sibling above it is animating — that cost compounds with each
     additional settled card, which is exactly why the stretch
     approaching sub-section 4 (three frozen, blurred cards sitting
     underneath) felt laggier than the earlier hand-offs. Promoting
     each card to its own layer lets the compositor reuse the cached
     bitmap for any card whose own inputs haven't changed. */
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  box-shadow: 0 24px 48px -20px rgba(8, 12, 20, 0.55);
  /* Translate by the full panel height (not the card's own, inset-reduced
     height) so a not-yet-revealed card travels far enough to clear the
     frame's bottom edge completely — otherwise an inset card only moves
     by its own shorter height and ends up still poking into view. */
  transform: translate3d(0, calc((1 - var(--reveal, 1)) * (var(--stack-panel-height) + 100px)), 0);
  transition: box-shadow var(--dur-fast) linear;
}

.stack-card[data-stack-card="1"] { top: 0;                              right: 0;                              bottom: 0; left: 0;                             z-index: 1; }
.stack-card[data-stack-card="2"] { top: var(--stack-gap);               right: var(--stack-gap);               bottom: 0; left: var(--stack-gap);              z-index: 2; }
.stack-card[data-stack-card="3"] { top: calc(var(--stack-gap) * 2);     right: calc(var(--stack-gap) * 2);     bottom: 0; left: calc(var(--stack-gap) * 2);    z-index: 3; }
.stack-card[data-stack-card="4"] { top: calc(var(--stack-gap) * 3);     right: calc(var(--stack-gap) * 3);     bottom: 0; left: calc(var(--stack-gap) * 3);    z-index: 4; }

.stack-card[data-stack-card="1"] { background: linear-gradient(135deg, var(--card1-grad-a), var(--card1-grad-b)); color: var(--card-ink); }
.stack-card[data-stack-card="2"] { background: linear-gradient(135deg, var(--card2-grad-a), var(--card2-grad-b)); color: var(--card-ink); }
.stack-card[data-stack-card="3"] { background: linear-gradient(135deg, var(--card3-grad-a), var(--card3-grad-b)); color: var(--card-ink); }
.stack-card[data-stack-card="4"] { background: linear-gradient(135deg, var(--card4-grad-a), var(--card4-grad-b)); color: var(--card-ink); }

/* A card not yet revealed sits fully below the frame — keep it out of
   the tab/click order until it actually slides into view. */
.stack-card.is-hidden { pointer-events: none; }
.stack-card.is-hidden .stack-card__body { visibility: hidden; }

/* A fully-covered card is sitting under the maxed-out dim/blur overlay
   below — any motion on it (arrow glow/flow/pulse, activation-button
   ping) is already invisible, so freeze those infinite animations in
   place rather than let the browser keep repainting them for nothing.
   Purely a perf hint: nothing here is visible while covered anyway. */
.stack-card.is-settled .try-arrow-svg,
.stack-card.is-settled .try-arrow__path,
.stack-card.is-settled .try-arrow__head,
.stack-card.is-settled .ss-shot__btn,
.stack-card.is-settled .ss-shot__btn::before,
.stack-card.is-settled .ss-shot__btn::after,
.stack-card.is-settled .btn--activate::after {
  animation-play-state: paused;
}

/* Dim + blur overlay for a sub-section once the next one has settled on
   top of it. Sits above the body but below the label, so the
   "Sub-Section N" chip always stays crisp while the body behind it
   visibly recedes — driven by --collapse-dim / --collapse-blur from JS. */
.stack-card::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: rgba(10, 14, 22, var(--collapse-dim, 0));
  /* The blur itself now lives on .stack-card__body as a plain
     filter (see below) — this overlay only handles the dim. A plain
     background-color overlay is essentially free to composite, unlike
     backdrop-filter which has to live-sample everything beneath it on
     every frame. */
  contain: paint;
}

/* Label — small bordered chip pinned to each card's own top-left corner */
.stack-card__label {
  position: absolute;
  top: var(--space-3);
  left: var(--space-3);
  margin: 0;
  padding: 0.55rem 1.1rem;
  font-size: 0.82rem;
  font-weight: 600;
  background: #ffffff;
  color: #171b22;                 /* constant — this chip is a fixed white "sticker" in both themes */
  border: 1.5px solid #1c2b46;
  border-radius: var(--radius-sm);
  z-index: 2;
}

/* Body: left = heading/copy, right = the enlarged feature box. The box
   is stretched to the row's full height and roughly half the row's
   width, with a uniform --stack-card-pad gap on every side, so it reads
   as covering at least half of the sub-section with even breathing room
   all around it. */
.stack-card__body {
  position: relative;
  height: 100%;
  min-height: 0;
  display: flex;
  align-items: stretch;
  gap: var(--stack-card-pad);
  padding: calc(var(--stack-card-pad) + 28px) var(--stack-card-pad) var(--stack-card-pad) var(--stack-card-pad);
  /* Same visual result as the old backdrop-filter overlay (a covered
     card's content recedes behind blur as --collapse-blur ramps up),
     but a plain filter only ever has to blur this element's own
     rasterized content rather than live-sample the whole composited
     scene behind it — much cheaper to keep cached once a card is
     fully covered and its value stops changing. */
  filter: blur(var(--collapse-blur, 0px));
  transform: translateZ(0);
  will-change: filter;
}

.stack-card__left {
  flex: 1 1 40%;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.stack-card__title { font-size: clamp(2.6rem, 4.8vw, 3.9rem); font-weight: 600; line-height: 1.05; color: var(--card-ink); }
.stack-card__title1 { font-size: clamp(2.8rem, 5.6vw, 4.7rem); font-weight: 600; line-height: 1.05; color: var(--card-ink); }
.stack-card__logo {
  position: static;
  display: block;
  align-self: flex-start;
  flex: 0 0 auto;
  height: clamp(200px, 25.5vw, 250px);
  width: auto;
  max-width: 78%;
  object-fit: contain;
  margin-top: var(--space-3);
}

.stack-card__title2 { font-size: clamp(2.6rem, 4.8vw, 3.9rem); font-weight: 600; line-height: 1.05; color: var(--card-ink); }
.stack-card__title3 { font-size: clamp(2.8rem, 5.9vw, 4.9rem); font-weight: 600; line-height: 1.05; color: var(--card-ink); }

.stack-card__title4 { font-size: clamp(2.9rem, 5.4vw, 4.4rem); font-weight: 600; line-height: 1.05; color: var(--card-ink); }
.stack-card__title5 { font-size: clamp(3.1rem, 6.7vw, 5.6rem); font-weight: 600; line-height: 1.05; color: var(--card-ink); }

.stack-card__title6 { font-size: clamp(2.6rem, 4.8vw, 3.9rem); font-weight: 600; line-height: 1.05; color: var(--card-ink); }
.stack-card__text4 { margin-top: var(--space-3); max-width: 46ch; color: currentColor; opacity: 0.82; font-size: clamp(1.1rem, 2vw, 1.6rem); white-space: normal; font-family: 'Dancing Script', 'Brush Script MT', cursive; }
.stack-card__text4 .bracket { font-size: 3.4em; font-family: inherit; vertical-align: middle; position: relative; top: -0.15em; }

/* Large desktops only: the negative translateY offsets and oversized
   type were tuned for a wide two-column card where the text column is
   wide enough that copy sits on few lines. Below 1440px — or on short
   viewports even at full width — the responsive defaults above keep
   every title/text/logo safely inside its card. */
@media (min-width: 1440px) and (min-height: 820px) {
  .stack-card__title,
  .stack-card__title2 {
    font-size: clamp(2.8rem, 4.2vw, 4.2rem);
    transform: translateY(-100px);
  }
  .stack-card__title4 {
    font-size: clamp(6rem, 4.8vw, 4.8rem);
    transform: translateY(-90px);
  }
  .stack-card__title5 {
    font-size: clamp(5.2rem, 6.6vw, 10.4rem);
    transform: translateY(-100px);
  }
  .stack-card__title6 {
    font-size: clamp(6.2rem, 6vw, 5.2rem);
    transform: translateY(-100px);
  }
  .stack-card__title1 {
    font-size: clamp(5.6rem, 4.2vw, 4.2rem);
    transform: translateY(-100px);
  }
  .stack-card__title3 {
    font-size: clamp(5.8rem, 8.4vw, 9.6rem);
    transform: translateY(-110px);
  }
  .stack-card__text4 {
    font-size: 2.1rem;
    white-space: nowrap;
    transform: translateY(-160px);
  }
  .stack-card__logo {
    position: absolute;
    left: var(--stack-card-pad);
    bottom: var(--stack-card-pad);
    width: auto;
    margin-top: 0;
  }
  .stack-card[data-stack-card="1"] .stack-card__logo { height: 400px; }
  .stack-card[data-stack-card="2"] .stack-card__logo { height: 320px; }
  .stack-card[data-stack-card="3"] .stack-card__logo { height: 310px; }
}
/* ==========================================================================
    Try Arrow — animated arrow pointing to the "Activate" button
   ========================================================================== */

.try-text {
  position: absolute;
  left: 25%;
  top: 56%;
  font-family: var(--font-body);
  font-size: 1.5rem;
  font-weight: 600;
  color: #020100;
  filter: drop-shadow(0 0 6px rgba(244, 161, 31, 0.7));
  pointer-events: none;
  z-index: 5;
}

.try-arrow-svg {
  position: absolute;
  left: 36%;
  top: 55%;
  width: 180px;
  height: auto;
  overflow: visible;
  transform: rotate(-14deg);
  filter: drop-shadow(0 0 6px rgba(244, 161, 31, 0.6));
  animation: try-arrow-glow 2s ease-in-out infinite;
  pointer-events: none;
  z-index: 5;
}
/* Try-arrow size — Sub-Section 1 keeps its original 24px/180px values
   above; 2, 3 and 4 get their own smaller, explicit sizes to match
   their smaller card footprint. */
.stack-card[data-stack-card="2"] .try-text { font-size: 1.375rem; }
.stack-card[data-stack-card="3"] .try-text { font-size: 1.25rem; }
.stack-card[data-stack-card="4"] .try-text { font-size: 1.25rem; top: 52%; }
.stack-card[data-stack-card="2"] .try-arrow-svg { width: 165px; }
.stack-card[data-stack-card="3"] .try-arrow-svg { width: 150px; }
.stack-card[data-stack-card="4"] .try-arrow-svg { width: 140px; top: 53%; }
.try-arrow__path {
  stroke-dasharray: 10 8;
  animation: try-arrow-flow 1.2s linear infinite;
}
.try-arrow__head {
  animation: try-arrow-pulse 1.2s ease-in-out infinite;
}

@keyframes try-arrow-flow {
  to { stroke-dashoffset: -36; }
}
@keyframes try-arrow-glow {
  0%, 100% { filter: drop-shadow(0 0 4px rgba(244, 161, 31, 0.5)); }
  50% { filter: drop-shadow(0 0 12px rgba(244, 161, 31, 0.9)); }
}
@keyframes try-arrow-pulse {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.15); }
}
/* ==========================================================================
   Feature Box — glassmorphic card pinned to the right, per the mockup
   ========================================================================== */
.feature-box {
  position: relative;
  flex: 1 1 60%;
  min-width: 0;
  height: 100%;
  min-height: 380px;
  border-radius: var(--radius-lg);
  padding: var(--space-4);
  background: var(--glass-bg);
  border: 1.5px solid var(--glass-border);
  backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  box-shadow: 0 20px 40px -18px rgba(28, 43, 70, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.5);
  display: grid;
  place-items: center;
  transform: translateY(0px);
}

.feature-box__panel {
  grid-area: 1 / 1;
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  opacity: 0;
  transform: translateY(8px) scale(0.98);
  pointer-events: none;
  transition: opacity var(--dur-mid) var(--ease-in-out), transform var(--dur-mid) var(--ease-in-out);
}
.feature-box__panel.is-active { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }

/* ==========================================================================
   Sample form (kept for reuse elsewhere; no longer used inside the
   feature-box activation flow, which now plays a video instead)
   ========================================================================== */
.sample-form { width: 100%; display: flex; flex-direction: column; gap: var(--space-3); }
.field { display: flex; flex-direction: column; gap: 0.35rem; }
.field__label { font-size: 0.78rem; color: var(--color-ink-muted); font-weight: 500; }
.field__input {
  background: var(--field-bg);
  border: 1.5px solid var(--glass-border);
  border-radius: var(--radius-sm);
  padding: 0.75rem 0.9rem;
  color: var(--color-ink);
  font-size: 0.92rem;
  transition: border-color var(--dur-fast) var(--ease-out), background-color var(--dur-mid) var(--ease-out);
}
.field__input::placeholder { color: var(--field-placeholder); }
.field__input:focus { outline: none; border-color: var(--color-accent); }
.sample-form__actions { display: flex; gap: var(--space-2); }

/* <select> fields: force the closed box AND the dropdown popup to use
   theme colors instead of the browser's default (usually white) popup. */
select.field__input {
  color-scheme: inherit;
  cursor: pointer;
}
select.field__input option {
  background-color: var(--color-panel);
  color: var(--color-ink);
}

/* Fields that are locked (pre-selected via a product-specific "Buy Now"
   link) stay legible but visually read as non-interactive. */
.field__input:disabled,
.field__input[readonly] {
  color: var(--color-ink);
  opacity: 0.75;
  cursor: not-allowed;
}
.field__input[readonly] { cursor: default; }

/* Two-up field layout (Buy Now page: Email/Mobile, Pincode/Qty, City/State) */
.field-row { display: flex; gap: 16px; }
.field-row .field { flex: 1; min-width: 0; }
.field__hint {
  font-size: 0.72rem;
  font-weight: 600;
  min-height: 1.1em;
  color: var(--color-ink-muted);
}
.field__hint.is-ok { color: #2e9e52; }
.field__hint.is-error { color: #e0473f; }
@media (max-width: 640px) {
  .field-row { flex-direction: column; }
}

/* ==========================================================================
   Feature video — plays inside the feature-box once "Activate" is clicked
   ========================================================================== */
.feature-video {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
}
.feature-video__el {
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-md);
  background: #05070b;
  box-shadow: 0 14px 30px -16px rgba(28, 43, 70, 0.5);
  outline: none;
}
.feature-video__back { align-self: center; }

/* ==========================================================================
   Card 4 (Butter Bee) — no Activate step: the video panel fills the
   feature-box completely, edge-to-edge, with no padding/margin gap on
   any side (same fill approach as .feature-box--activation above).
   ========================================================================== */
.feature-box--card4 {
  padding: 0;
  grid-template-rows: 100%;
  overflow: hidden;
}
/* Sub-section 4 only: give the feature-box a uniform, tighter inset
   from the panel's top/right/bottom edges (left is untouched — that's
   where the text column lives, not a real edge of the box) instead of
   the shared default (see .stack-card__body). This shifts the box
   upward (smaller top gap), grows it further downward (smaller bottom
   gap), and keeps top/right/bottom perfectly even with each other. */
.stack-card[data-stack-card="4"] .stack-card__body {
  padding-top: calc(var(--stack-card-pad) * 0.2);
  padding-right: calc(var(--stack-card-pad) * 0.2);
  padding-bottom: calc(var(--stack-card-pad) * 0.2);
}
.feature-box--card4 .feature-box__panel {
  align-self: stretch;
  height: 100%;
  justify-content: flex-start;
}
.feature-video--card4 {
  width: 100%;
  height: 100%;
  gap: 0;
}
.feature-video--card4 .feature-video__el {
  width: 100%;
  height: 100%;
  aspect-ratio: unset;
  border-radius: 0;
  object-fit: cover;
  box-shadow: none;
}

/* ---------- Card 4 "BUY NOW" popup — confined to the feature-box itself,
   not the whole screen. .feature-box--card4 is position:relative +
   overflow:hidden, so this absolute overlay is clipped to exactly the
   box's bounds regardless of where it sits in the page. ---------- */
.card4-buynow {
  position: absolute;
  inset: 0;
  z-index: 5;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-3);
}
.card4-buynow[hidden] { display: none; }
.card4-buynow__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(6, 10, 20, 0.55);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
}
.card4-buynow__box {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-4) clamp(1.4rem, 5vw, 2.6rem);
  background: var(--glass-bg);
  border: 1.5px solid var(--glass-border);
  border-radius: var(--radius-lg);
  box-shadow: 0 24px 60px -20px rgba(0, 0, 0, 0.55);
  animation: card4BuyNowPop 0.28s var(--ease-out, ease-out);
  max-width: 90%;
}
@keyframes card4BuyNowPop {
  from { opacity: 0; transform: translateY(12px) scale(0.96); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
.card4-buynow__close {
  position: absolute;
  top: 0.3rem;
  right: 0.5rem;
  background: none;
  border: none;
  font-size: 1.4rem;
  line-height: 1;
  color: var(--color-ink-muted, #666);
  cursor: pointer;
}
.card4-buynow__btn {
  padding: 0.6em 2em;
  font: 800 clamp(0.95rem, 2.2vw, 1.3rem) var(--font-body);
  letter-spacing: 0.05em;
  text-decoration: none;
  color: #06210f;
  background: #39ff8f;
  border-radius: var(--radius-md);
  box-shadow: 0 0 0 3px rgba(57, 255, 143, 0.35), 0 10px 30px -8px rgba(0, 0, 0, 0.6);
  animation: ssBuyNowBlink 1s steps(1, end) infinite;
}
@media (prefers-reduced-motion: reduce) {
  .card4-buynow__btn, .card4-buynow__box { animation: none; }
}

/* ==========================================================================
   SecuraShade activation flow — dashboard screenshot with a working
   overlay button, and the replicated activation window it opens.
   Scoped to .feature-box--activation so it only affects sub-section 1.
   ========================================================================== */
.feature-box--activation {
  /* No padding at all — the screenshot/window now goes edge-to-edge
     with the feature-box, so there's no empty frame left around it.
     The box's own rounded corners + overflow: hidden below clip the
     content into shape instead. */
  padding: 0;
  /* Force the single implicit grid row to be exactly the box's own
     height rather than sizing itself to whichever panel's content is
     tallest — without this, `align-self: stretch` below has nothing
     real to stretch into, and oversized content just overflows past
     the box's rounded edges instead of filling/scrolling within it. */
  grid-template-rows: 100%;
  overflow: hidden;
}
.feature-box--activation .feature-box__panel {
  /* The default feature-box panels are auto-sized and centered by the
     box's `place-items: center`. This flow needs the active panel to
     occupy the full box so the screenshot/window can fill it and, for
     the form, scroll internally instead of stretching the whole card. */
  align-self: stretch;
  height: 100%;
  justify-content: flex-start;
}

/* ---------- Screenshot + overlay button ---------- */
.ss-shot {
  position: relative;
  width: 100%;
  height: 100%;
  /* Fill the feature-box completely — no aspect-ratio letterboxing and
     no auto margins, which used to leave empty strips top/bottom. The
     parent's overflow: hidden + rounded corners handle the shaping,
     so this doesn't need its own radius/shadow either. */
  overflow: hidden;
}
/* TS Premium's carousel uses pre-made 3:2 marketing banners instead of
   app screenshots. Getting "no crop AND no blank border" requires the
   frame itself to be exactly the same shape as the banner — several
   pure-CSS attempts at this (aspect-ratio combined with max-width/
   max-height, or with auto sizing) each broke in some container
   shapes but not others, because of how CSS resolves which axis is
   "definite" first. This is measured and set precisely in JS instead
   (see fitBannerFrames() in script.js) — sizing it directly in pixels
   sidesteps all of that ambiguity entirely. Centered via margin:auto
   within whatever space .feature-box__panel gives it.
   overflow:hidden here (not on .ss-shot) so up the rounded corners
   apply to the frame's own actual computed size, not the full panel. */
.ss-shot--banner-frame {
  display: block;
  margin: auto;
  overflow: hidden;
  border-radius: var(--radius-md);
}
/* The pre-made 3:2 marketing banner is fit edge-to-edge with no crop
   (see fitBannerFrames() in script.js), so it rarely fills the entire
   .feature-box — the glass card's own background/border used to stay
   at the box's full flex width regardless, showing as a blank strip
   down the side(s) the banner didn't reach. Moving that chrome onto
   the banner frame itself (sized to hug the poster exactly) removes
   the strip without touching the poster's own size or aspect ratio. */
.feature-box--posterframe {
  background: none;
  border: none;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  padding: 0;
}
.feature-box--posterframe .ss-shot--banner-frame {
  background: var(--glass-bg);
  border: 1.5px solid var(--glass-border);
  box-shadow: 0 20px 40px -18px rgba(28, 43, 70, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.5);
}
.ss-shot__img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: fill;
  filter: blur(7px);
  transform: scale(1.03); /* hides the blurred edge fringe */
  transition: filter var(--dur-mid) var(--ease-out);
}
.feature-box--activation.is-activated .ss-shot__img {
  filter: blur(0);
}

/* The old "click here" pointer aimed at a tiny baked-in pill is no
   longer used now that a big centered ACTIVATE button sits over the
   whole (blurred) screenshot instead. */
.ss-activate-pointer { display: none; }

/* ---------- Big, centered ACTIVATE button ----------
   Sits centered over the blurred dashboard screenshot. Clicking it
   reveals the (now sharp) screenshot for a moment before the box
   auto-advances into the activation-form walkthrough — see
   initActivationForm() in script.js. */
.ss-activate-btn {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: clamp(150px, 22%, 220px);
  padding: clamp(0.85rem, 1.6vw, 1.15rem) clamp(1.8rem, 3.4vw, 2.6rem);
  font: 800 clamp(0.95rem, 1.7vw, 1.2rem) var(--font-body);
  letter-spacing: 0.04em;
  color: #06210f;
  background: #39ff8f;
  border: none;
  border-radius: 999px;
  cursor: pointer;
  box-shadow: 0 0 0 1px rgba(57, 255, 143, 0.35), 0 0 8px 2px rgba(57, 255, 143, 0.65);
  animation: ssActivatePulse 1.6s ease-in-out infinite;
  z-index: 4;
}
.feature-box--activation.is-activated .ss-activate-btn {
  display: none;
}
.ss-activate-btn:hover,
.ss-activate-btn:focus-visible {
  background: #63ffab;
  outline: 2px solid #fff;
  outline-offset: 1px;
}
/* Scale/opacity blink AND a glow swell, both looping forever — this is
   the permanent idle state, so the button keeps glowing/blinking even
   after the one-time intro jump (below) has finished. */
@keyframes ssActivatePulse {
  0%, 100% {
    transform: translate(-50%, -50%) scale(1);
    opacity: 1;
    box-shadow: 0 0 0 1px rgba(57, 255, 143, 0.35), 0 0 8px 2px rgba(57, 255, 143, 0.65);
  }
  50% {
    transform: translate(-50%, -50%) scale(1.07);
    opacity: 0.82;
    box-shadow: 0 0 0 3px rgba(57, 255, 143, 0.3), 0 0 26px 10px rgba(57, 255, 143, 0.85);
  }
}

/* ---------- One-time "jump out & settle" intro pop ----------
   Played exactly once, when sub-section 1 is genuinely arrived at
   (see initActivateIntro() in script.js) — never on a plain page
   reload, never when scrolling back up into it. The anchor point
   (translate(-50%,-50%)) is identical to the idle-pulse keyframes
   above, so the button lands back in its exact original spot once
   the class is removed and the idle pulse resumes. Temporarily lifts
   the surrounding clipping (see .feature-box--intro-overflow) so the
   button can visibly pop past the screenshot's frame instead of being
   cut off mid-jump. */
.ss-activate-btn--intro {
  animation: ssActivateIntro 0.85s cubic-bezier(0.34, 1.56, 0.64, 1) 1;
  z-index: 5;
}
@keyframes ssActivateIntro {
  0%   { transform: translate(-50%, -50%) scale(1); }
  45%  { transform: translate(-50%, -50%) scale(2.05); }
  72%  { transform: translate(-50%, -50%) scale(0.94); }
  100% { transform: translate(-50%, -50%) scale(1); }
}
.feature-box--intro-overflow,
.feature-box--intro-overflow .ss-shot {
  overflow: visible;
}

/* Thank-you page: same jump-out-and-settle pop, but played slower and
   paired with a bright highlight glow so the very first thing the
   person notices after checkout is where to click next. */
.thankyou-showcase .ss-activate-btn--intro {
  animation:
    ssActivateIntro 2.2s cubic-bezier(0.34, 1.56, 0.64, 1) 1,
    ssActivateIntroGlow 2.2s ease-out 1;
}
@keyframes ssActivateIntroGlow {
  0%   { box-shadow: 0 0 0 1px rgba(57, 255, 143, 0.35), 0 0 8px 2px rgba(57, 255, 143, 0.65); }
  40%  { box-shadow: 0 0 0 6px rgba(57, 255, 143, 0.28), 0 0 55px 22px rgba(57, 255, 143, 0.95); }
  75%  { box-shadow: 0 0 0 2px rgba(57, 255, 143, 0.3), 0 0 22px 8px rgba(57, 255, 143, 0.75); }
  100% { box-shadow: 0 0 0 1px rgba(57, 255, 143, 0.35), 0 0 8px 2px rgba(57, 255, 143, 0.65); }
}
@media (prefers-reduced-motion: reduce) {
  .ss-activate-btn--intro { animation: none; }
}

/* ---------- Screenshot slideshow (replaces the old single static
   screenshot + flashing "Click Here" pointer). Cycles through every
   image in assets/TS_P (card 1 / Premium) or assets/TS_B (card 2 /
   Basic), in filename sequence, with a prev/next arrow on each side
   for manual control — see initFeatureBoxSlideshows() in script.js. */
.ss-slideshow {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.ss-slideshow__track {
  display: flex;
  width: 100%;
  height: 100%;
  will-change: transform;
  transition: transform 0.45s cubic-bezier(0.4, 0, 0.2, 1);
}
.ss-slideshow__img {
  flex: 0 0 100%;
  width: 100%;
  height: 100%;
  object-fit: fill;
  display: block;
  user-select: none;
  -webkit-user-drag: none;
}
/* These are pre-made marketing banners (fixed 3:2 layout with real text
   baked in). `cover` fills the whole frame edge-to-edge with no
   letterbox bars — some off-center content may crop slightly on very
   mismatched container shapes, but that reads far better than a
   visible border around the poster. */
.ss-slideshow--banner .ss-slideshow__img {
  object-fit: contain;
  background: var(--glass-bg);
}
.ss-slideshow__dots {
  position: absolute;
  left: 50%;
  bottom: 0.55rem;
  transform: translateX(-50%);
  z-index: 4;
  display: flex;
  gap: 0.32rem;
}
.ss-slideshow__dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.4);
  transition: background 0.2s ease, transform 0.2s ease;
}
.ss-slideshow__dot.is-active {
  background: #fff;
  transform: scale(1.25);
}
@media (prefers-reduced-motion: reduce) {
  .ss-slideshow__track { transition: none; }
}

/* ---------- Replicated activation window ---------- */
.ss-window {
  flex: 1 1 auto;
  min-height: 0;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  background: linear-gradient(135deg, #0b3f8f 0%, #0d56b3 35%, #1170d6 70%, #2f8ff3 100%);
  overflow: hidden;
  color: #ffffff;
}

/* ---------- Card 2 (Total Security BASIC) demo-window theme ----------
   Colors sampled directly from the dashboard background in
   assets/images/TotalSec-Basic.png (a vivid indigo-blue, #1110b4 →
   #322fe0), not the light window-chrome border around it. */
.ss-window--totalsec-basic {
  background: linear-gradient(135deg, #0d0c8f 0%, #1c19b8 35%, #2e2ade 70%, #4b46f2 100%);
}
.ss-window--totalsec-basic .ss-window__titlebar {
  background: linear-gradient(180deg, #211ec9 0%, #130fa0 100%);
}
.ss-window--totalsec-basic .ss-window__sidebar {
  background: linear-gradient(180deg, #1a17ab 0%, #0e0c85 100%);
}
.ss-window--totalsec-basic .ss-window__main {
  background:
    radial-gradient(circle at top right, rgba(255,255,255,.12), transparent 45%),
    linear-gradient(135deg, #211ec4 0%, #322fe0 55%, #4d48f4 100%);
}

/* ---------- Card 3 (AV Pro BASIC) demo-window theme ----------
   Colors sampled directly from the dashboard background in
   assets/images/AVPro-Basic.jpeg (deep purple/magenta, #2d104a →
   #77219e), not the light window-chrome border around it. */
.ss-window--avpro-basic {
  background: linear-gradient(135deg, #200836 0%, #3a104f 35%, #5c1a7a 70%, #7c239f 100%);
}
.ss-window--avpro-basic .ss-window__titlebar {
  background: linear-gradient(180deg, #4a1568 0%, #2b0a45 100%);
}
.ss-window--avpro-basic .ss-window__sidebar {
  background: linear-gradient(180deg, #3d1055 0%, #230733 100%);
}
.ss-window--avpro-basic .ss-window__main {
  background:
    radial-gradient(circle at top right, rgba(255,255,255,.12), transparent 45%),
    linear-gradient(135deg, #451260 0%, #66208a 55%, #8b2caf 100%);
}

.ss-window__titlebar {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  background: linear-gradient(180deg, #1b5fc6 0%, #0f4fae 100%);
  color: #ffffff;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.7rem;
  padding: 0.35rem 0.6rem;
}

.ss-window__titlebar-left {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-width: 0;
}

.ss-window__back {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  background: rgba(255,255,255,.15);
  border: 1px solid rgba(255,255,255,.35);
  border-radius: 3px;
  color: #ffffff;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.62rem;
  font-weight: 600;
  line-height: 1;
  padding: 0.22rem 0.45rem;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}

.ss-window__back:hover {
  background: rgba(255,255,255,.25);
}

.ss-window__title {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ss-window__controls {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 0.3rem;
}

.ss-window__controls .ss-ctrl {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 15px;
  height: 13px;
  font-size: 0.6rem;
  line-height: 1;
  color: #ffffff;
}

.ss-window__controls .ss-ctrl--close {
  background: #d94141;
  color: #fff;
  border-radius: 1px;
}

.ss-window__body {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  overflow-y: auto;
}

.ss-window__sidebar {
  flex: 0 0 auto;
  width: 128px;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  background: linear-gradient(180deg, #0c4da7 0%, #083d8a 100%);
  color: #ffffff;
  font-family: Arial, Helvetica, sans-serif;
  padding: 0.6rem 0.5rem;
  border-right: 1px solid rgba(255,255,255,.15);
}

.ss-window__logo {
  color: #ffffff;
  font-weight: 700;
  font-size: 0.66rem;
  letter-spacing: 0.04em;
  line-height: 1.4;
  margin-bottom: 0.15rem;
}

.ss-window__logo span {
  display: block;
  font-size: 0.56rem;
  font-weight: 400;
  letter-spacing: 0.2em;
  opacity: 0.85;
}

.ss-window__nav {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  font-size: 0.6rem;
}

.ss-window__nav-item {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.28rem 0.35rem;
  border-radius: 3px;
  border: 1px solid transparent;
  opacity: 0.9;
  color: #ffffff;
}

.ss-window__nav-item svg {
  flex: 0 0 auto;
  width: 10px;
  height: 10px;
}

.ss-window__nav-item.is-active {
  background: rgba(255,255,255,.16);
  border-color: rgba(255,255,255,.35);
  color: #ffffff;
  opacity: 1;
  font-weight: 600;
}

.ss-window__social {
  margin-top: auto;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0.3rem;
}

.ss-window__social span {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.ss-window__social span svg {
  width: 100%;
  height: 100%;
}

.ss-window__main {
  flex: 1 1 auto;
  min-width: 0;
  padding: 0.7rem 0.9rem 0.9rem;
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
  background:
    radial-gradient(circle at top right, rgba(255,255,255,.12), transparent 45%),
    linear-gradient(135deg, #0b56ba 0%, #1576db 55%, #2694f4 100%);
}

.ss-window__welcome {
  text-align: center;
  color: #ffffff;
}

.ss-window__welcome strong {
  display: block;
  font-family: Georgia, 'Times New Roman', serif;
  font-size: 0.9rem;
}

.ss-window__welcome span {
  display: block;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.64rem;
  opacity: 0.9;
  margin-top: 0.1rem;
}

.ss-activation-form {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
}

.ss-fieldset {
  border: 1.5px solid rgba(255,255,255,.35);
  border-radius: 4px;
  padding: 0.55rem 0.65rem 0.65rem;
  margin: 0;
  background: rgba(0,0,0,.05);
}

.ss-fieldset legend {
  padding: 0 0.35rem;
  color: #ffffff;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.68rem;
  font-weight: 600;
}

.ss-row {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  flex-wrap: wrap;
  margin-bottom: 0.45rem;
}

.ss-row:last-child {
  margin-bottom: 0;
}

.ss-row label {
  color: #ffffff;
  font-family: Georgia, 'Times New Roman', serif;
  font-size: 0.66rem;
  white-space: nowrap;
}

.ss-key-group {
  display: flex;
  gap: 0.28rem;
  flex: 0 0 auto;
  width: 12.6rem;
}

.ss-key-group input {
  width: 0;
  flex: 1 1 auto;
  text-align: center;
  text-transform: uppercase;
}

.ss-field {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  flex: 0 0 auto;
  min-width: 0;
}

.ss-field--narrow {
  flex: 0 0 auto;
}

.ss-field input {
  flex: none;
  width: 8.6rem;
}

.ss-field--narrow input {
  width: 5.4rem;
}

#ssMobile {
  width: 6.2rem;
}

#ssPin,
#ssOtp {
  width: 4.4rem;
}

#ssEmail,
#ssActivationCode {
  width: 11.6rem;
}

.ss-row--split {
  gap: 0.7rem;
}

.ss-row--radio {
  gap: 0.9rem;
  justify-content: center;
}

.ss-row--radio label {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  white-space: nowrap;
}

.ss-row--pin {
  justify-content: space-between;
}

.ss-row__actions {
  display: flex;
  gap: 0.4rem;
  margin-left: auto;
}

.ss-row--offline {
  align-items: center;
}

.ss-fieldset--offline {
  margin-top: 0.15rem;
}

.ss-fieldset--offline .ss-note {
  margin-top: 0.4rem;
}

.ss-btn--reactivate {
  background: linear-gradient(180deg, #7b98c4, #4c6896);
  cursor: default;
}

.ss-btn--reactivate:hover {
  filter: none;
}

.ss-btn--activate {
  background: linear-gradient(180deg, #49d67d, #19984d);
  border-color: #12703a;
  animation: ssBuyNowBlink 1s steps(1, end) infinite;
}

.ss-activation-form input[type='text'],
.ss-activation-form input[type='email'],
.ss-activation-form input[type='tel'] {
  background: #f5f5f5;
  border: 1px solid rgba(0,0,0,.35);
  border-radius: 2px;
  padding: 0.24rem 0.4rem;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.66rem;
  color: #111111;
}

.ss-activation-form input:focus {
  outline: 2px solid #ffd76b;
  outline-offset: 1px;
}

.ss-activation-form input:invalid {
  border-color: #e05a5a;
}

.ss-activation-form.is-typing input:invalid {
  border-color: rgba(0,0,0,.35);
}

.ss-activation-form input[readonly] {
  background: #d9d9d9;
  color: #555;
}

.ss-btn {
  -webkit-appearance: none;
  appearance: none;
  box-sizing: border-box;
  margin: 0;
  background: linear-gradient(180deg, #6ea7ff, #2b64b8);
  color: #fff;
  border: 1px solid #1f3f73;
  border-radius: 4px;
  padding: 0.3rem 0.75rem;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.64rem;
  font-weight: 600;
  line-height: normal;
  letter-spacing: 0.02em;
  cursor: pointer;
  white-space: nowrap;
  vertical-align: middle;
}

.ss-btn:hover {
  filter: brightness(1.08);
}

.ss-btn:active {
  filter: brightness(0.96);
}

.ss-btn:focus {
  outline: 2px solid #ffd76b;
  outline-offset: 1px;
}

.ss-note {
  margin: 0.4rem 0 0;
  color: rgba(255,255,255,.9);
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.58rem;
}
/* ---- Validator-tip popup ----
   One reusable bubble, repositioned + relabelled (from data-ss-tip) by
   script.js as each field auto-types — e.g. "must be a 10 digit number"
   while the Mobile No. field fills in. */
.ss-tip-popup {
  position: absolute;
  z-index: 5;
  max-width: 220px;
  padding: 0.35rem 0.6rem;
  background: #fff7dd;
  color: #4a3b00;
  border: 1px solid #e8c65a;
  border-radius: 6px;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.66rem;
  line-height: 1.35;
  box-shadow: 0 6px 16px -6px rgba(0, 0, 0, 0.45);
  animation: ssTipPopIn 220ms var(--ease-out);
}
.ss-tip-popup::before {
  content: '';
  position: absolute;
  top: -5px;
  left: 14px;
  width: 9px;
  height: 9px;
  background: #fff7dd;
  border-left: 1px solid #e8c65a;
  border-top: 1px solid #e8c65a;
  transform: rotate(45deg);
}
@keyframes ssTipPopIn {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ---- Final "Click Here" pointer, aimed at the ACTIVATE button ----
   Sparkling white so it reads as an unmissable prompt against the
   simulated window's blue chrome. */
/* ---- Final "Click Here" pointer, aimed at the ACTIVATE button ----
   Sparkling white so it reads as an unmissable prompt against the
   simulated window's blue chrome. Absolutely positioned against
   .ss-activate-wrap so it tracks that specific button instead of the
   right edge of the whole actions row (which used to line it up
   under Re-Activate instead). */
.ss-activate-wrap { position: relative; display: inline-flex; }
.ss-click-pointer {
  position: absolute;
  top: 100%;
  left: 38%;
  transform: translateX(-50%);
  margin-top: 0.3rem;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.35rem;
  white-space: nowrap;
  color: #e0473f;
  font-family: Arial, Helvetica, sans-serif;
  font-weight: 700;
  font-size: 0.72rem;
  text-shadow: 0 0 6px rgba(224, 71, 63, 0.35);
  animation: ssPointerFlash 1.1s ease-in-out infinite;
  pointer-events: none;
}
/* An explicit `display` above an author stylesheet always wins over the
   browser's own built-in "[hidden]{display:none}" rule, even though
   they're the same specificity — which was silently making this pointer
   show up before the ACTIVATE button it points at was ever revealed.
   Restoring that here so [hidden] actually hides it again. */
.ss-click-pointer[hidden] { display: none; }
.ss-click-pointer__sparkle {
  display: inline-block;
  color: #e0473f;
  text-shadow: 0 0 6px rgba(224, 71, 63, 0.6);
  animation: ssSparkleTwinkle 1.1s ease-in-out infinite;
}
.ss-click-pointer__sparkle:last-child { animation-delay: 0.35s; }
@keyframes ssSparkleTwinkle {
  0%, 100% { opacity: 0.35; transform: scale(0.7) rotate(0deg); }
  50%      { opacity: 1; transform: scale(1.15) rotate(25deg); }
}

.ss-form-msg {
  margin: 0;
  text-align: center;
  color: #163c1f;
  background: #bdf2c8;
  border: 1px solid #6fbf82;
  border-radius: 4px;
  padding: 0.4rem 0.6rem;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.66rem;
}

/* ---- Activation-video panel: walkthrough video + BUY NOW reveal ---- */
.ss-activation-video {
  position: relative;
  width: 100%;
  height: 100%;
  background: #000;
}
.ss-activation-video__el {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Row that holds BUY NOW + (on sub-sections 1-3) the Download Free Trial
   button side by side, bottom-centered over the activation video —
   replaces the old single-button absolute positioning on .ss-buy-now
   itself so the two CTAs can sit next to each other. */
.ss-cta-row {
  position: absolute;
  left: 50%;
  bottom: 8%;
  transform: translateX(-50%);
  display: flex;
  align-items: center;
  gap: clamp(0.6rem, 1.6vw, 1.2rem);
  flex-wrap: wrap;
  justify-content: center;
  max-width: 92%;
}
.ss-buy-now,
.ss-download-trial {
  padding: 0.7em 2.2em;
  font: 800 clamp(1rem, 2.4vw, 1.5rem) var(--font-body);
  letter-spacing: 0.05em;
  text-decoration: none;
  border-radius: var(--radius-md);
  animation: ssBuyNowBlink 1s steps(1, end) infinite;
  white-space: nowrap;
}
.ss-buy-now {
  color: #06210f;
  background: #39ff8f;
  box-shadow: 0 0 0 3px rgba(57, 255, 143, 0.35), 0 10px 30px -8px rgba(0, 0, 0, 0.6);
}
.ss-download-trial {
  color: #06182a;
  background: #39c5ff;
  box-shadow: 0 0 0 3px rgba(57, 197, 255, 0.35), 0 10px 30px -8px rgba(0, 0, 0, 0.6);
}
@keyframes ssBuyNowBlink {
  0%, 49%  { opacity: 1; }
  50%, 100% { opacity: 0.35; }
}
@media (prefers-reduced-motion: reduce) {
  .ss-buy-now, .ss-download-trial, .ss-click-pointer { animation: none; }
}

@media (max-width: 640px) {
  .ss-cta-row { gap: 0.5rem; bottom: 5%; }
  .ss-buy-now, .ss-download-trial { padding: 0.55em 1.1em; font-size: 0.85rem; }
  .ss-window__body { flex-direction: column; }
  .ss-window__sidebar { width: 100%; flex-direction: row; flex-wrap: wrap; align-items: center; }
  .ss-window__nav { flex-direction: row; flex-wrap: wrap; }
  .ss-window__social { display: none; }
  .ss-row--split { flex-direction: column; align-items: stretch; }
  .ss-row--pin { flex-direction: column; align-items: stretch; }
  .ss-row__actions { margin-left: 0; }
}

/* ==========================================================================
   Quiz CTA — "Confused? Let's help you choose" trigger + curly arrow,
   pointing at an interactive dialogue box (50vw x 50vh on desktop,
   pinned bottom-right with uniform margins from the screen edges).
   ========================================================================== */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.quiz-cta {
  position: relative;
  display: flex;
  align-items: stretch;
  justify-content: space-between;
  gap: var(--space-5);
  min-height: 100vh;
  padding: var(--space-6) var(--space-5) var(--space-5);
  background: var(--color-bg);
  overflow: hidden;
}

/* ---- Trigger text + arrow ---- */
.quiz-trigger {
  position: relative;
  flex: 1 1 42%;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  padding-right: var(--space-5);
}

.quiz-trigger__text {
  margin: 0;
  font-family: 'Poppins', var(--font-body);
  font-weight: 800;
  font-size: clamp(2rem, 3.6vw, 3.2rem);
  line-height: 1.18;
  letter-spacing: -0.01em;
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-strong));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  filter: drop-shadow(0 4px 16px rgba(var(--color-accent-rgb), 0.3));
  animation: quiz-pulse 2.6s ease-in-out infinite;
}
.quiz-trigger__marks { margin-left: 0.1em; }
/* Only "Confused" itself gets the size bump — the rest of the line
   ("Let's help you choose") stays at the base size. */
.quiz-trigger__word { font-size: 1.35em; }

@keyframes quiz-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: 0.7; transform: scale(1.015); }
}

.quiz-trigger__arrow {
  align-self: flex-end;
  width: clamp(120px, 11vw, 190px);
  height: auto;
  margin-top: var(--space-3);
  overflow: visible;
  filter: drop-shadow(0 0 6px rgba(244, 161, 31, 0.6));
  animation: try-arrow-glow 2s ease-in-out infinite;
  /* Nudged a little further along its own pointing direction so the
     head sits closer to the interactive box it's aimed at. */
  transform: translateX(18px);
}
.quiz-arrow__path { stroke-dasharray: 10 8; animation: try-arrow-flow 1.2s linear infinite; }
.quiz-arrow__head { animation: try-arrow-pulse 1.2s ease-in-out infinite; }

/* ---- Interactive icon "compass" — replaces the old glass dialogue
   box entirely. Sits directly on the section background (no card
   chrome) so the 4 big option icons feel like part of the same open
   layout as the trigger text/arrow, not a separate boxed widget.
   See initQuizForm() in script.js for the panel-swap / suggestion
   state machine — only the visuals below changed, the selection
   logic (which category needs a sub-step, when the suggestion
   reveals) is the same as before. ---- */
.quiz-interactive {
  flex: 0 0 auto;
  align-self: flex-start;
  margin-top: 0.5em; /* nudged down so the icons start level with "Confused" */
  width: 58vw;
  min-width: 380px;
  max-width: calc(100% - 1px);
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  margin-bottom: clamp(28px, 5vw, 64px);
}

/* Transparent to layout — its child (.quiz-stage) becomes a direct
   flex item of .quiz-interactive, sitting above .quiz-suggestion. */
.quiz-form { display: contents; }

/* The "stage": a fixed-footprint area that hosts whichever icon panel
   is currently active (the 4 primary categories, or a matched
   sub-group). Panels are stacked on top of each other via absolute
   positioning so swapping between them is a pure crossfade with no
   layout jump, and the heading can sit pinned dead-center of all of
   them at once — literally in the centre of the 4 icons, however
   many are showing. */
.quiz-stage {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
}

.quiz-stage__heading {
  position: relative;
  margin: 0;
  padding: 0.7rem 1.1rem;
  border-radius: var(--radius-lg);
  background: var(--glass-bg);
  border: 1.5px solid var(--glass-border);
  backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  box-shadow: 0 16px 32px -18px rgba(28, 43, 70, 0.4);
  font-family: var(--font-display);
  font-size: clamp(0.9rem, 1.1vw, 1.05rem);
  font-weight: 600;
  line-height: 1.35;
  text-align: center;
  color: var(--color-ink);
  opacity: 1;
  visibility: visible;
  transition: opacity var(--dur-mid) var(--ease-in-out), visibility var(--dur-mid) var(--ease-in-out);
}

/* Once the product-suggestion panel has taken over the stage, the
   "Help us know you better :" badge sits right where the suggestion
   copy starts, so it's hidden rather than left overlapping it. */
.quiz-stage:has(.quiz-suggestion[data-quiz-active]) .quiz-stage__heading {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

/* Fixed-footprint stage that hosts whichever panel is currently
   active — the 4 primary categories, a matched sub-group, or (once a
   selection is complete) the product-suggestion panel. Panels stack
   via absolute positioning inside this wrapper so swapping between
   them is a pure crossfade in the exact same spot, with no layout
   jump and nothing overlapping the heading above. */
.quiz-panels {
  position: relative;
  width: 100%;
  min-height: clamp(360px, 32vw, 460px);
}

/* Now lives inside .quiz-suggestion itself (see markup), pinned to
   its bottom-right corner, so it only ever appears alongside the
   product suggestion rather than floating above every panel. */
.quiz-stage__reset {
  position: absolute;
  bottom: var(--space-2);
  right: var(--space-3);
  z-index: 3;
  padding: 0.3rem 0.1rem;
  border: none;
  background: none;
  font: 700 0.82rem var(--font-body);
  color: var(--color-accent-strong);
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.quiz-stage__reset:hover { color: var(--color-accent); }

/* Every panel (the primary fieldset + each sub-group) occupies the
   exact same footprint and crossfades in/out via [data-quiz-active] —
   toggled in script.js — instead of the old expand/collapse-in-place
   sub-panel. */
.quiz-grid {
  position: absolute;
  inset: 0;
  margin: 0;
  padding: 0;
  border: 0;
  opacity: 0;
  transform: scale(0.94);
  pointer-events: none;
  transition: opacity var(--dur-mid) var(--ease-in-out),
              transform var(--dur-mid) var(--ease-in-out);
}
.quiz-grid[data-quiz-active] {
  opacity: 1;
  transform: scale(1);
  pointer-events: auto;
}

/* 4-icon layout (primary categories; Student's 4 sub-stages) — a
   single row of evenly-spaced icons, sitting under the heading. */
.quiz-grid--quad {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-2);
}
/* 2-icon layout (Employee's 2 sub-fields) — same single-row treatment,
   just with two icons instead of four. */
.quiz-grid--pair {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: var(--space-5);
}
/* 3-icon layout (Homemaker's 3 sub-fields) — evenly spread, a little
   more breathing room than the pair layout since there's a middle
   icon to balance against. */
.quiz-grid--trio {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: var(--space-5);
}

.quiz-option {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.55rem;
  padding: var(--space-2);
  border-radius: var(--radius-lg);
  border: 1.5px solid transparent;
  background: transparent;
  cursor: pointer;
  text-align: center;
  transition: transform var(--dur-fast) var(--ease-out),
              background-color var(--dur-mid) var(--ease-out),
              border-color var(--dur-mid) var(--ease-out);
}
.quiz-option:hover { transform: translateY(-4px); }
.quiz-option:has(input:checked) {
  background: var(--glass-bg);
  border-color: var(--color-accent);
  box-shadow: 0 14px 30px -16px rgba(28, 43, 70, 0.45);
}
.quiz-option:has(input:disabled) { opacity: 0.5; cursor: not-allowed; }
.quiz-option:has(input:focus-visible) { outline: 2px solid var(--color-accent); outline-offset: 3px; }

/* Radios stay in the DOM (native change events + keyboard/a11y) but
   carry no visual weight — the big icon + glow/border communicate the
   selection instead of a small checkbox dot. */
.quiz-option input {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Big, vivid, eye-catching — the whole point of the redesign. Each
   icon is a fixed-color flat "clipart" illustration (see the sprite
   defs in index.html), not a currentColor-tinted line icon, so it
   stays equally punchy in both themes. */
.quiz-option__icon {
  width: clamp(112px, 10.5vw, 152px);
  height: clamp(112px, 10.5vw, 152px);
  display: flex;
  align-items: center;
  justify-content: center;
  filter: drop-shadow(0 10px 18px rgba(15, 23, 42, 0.28));
  transition: transform var(--dur-fast) var(--ease-out);
  animation: quizAvatarFloat 2.6s ease-in-out infinite;
}
.quiz-option:hover .quiz-option__icon { transform: scale(1.08); }
.quiz-option:has(input:checked) .quiz-option__icon { transform: scale(1.1); }
.quiz-option__avatar { width: 100%; height: 100%; display: block; }
.quiz-option--sub .quiz-option__icon { width: clamp(96px, 8.8vw, 128px); height: clamp(96px, 8.8vw, 128px); }

.quiz-option__label {
  display: block;
  font-size: 0.92rem;
  font-weight: 700;
  color: var(--color-ink);
  max-width: 11ch;
}
.quiz-option--sub .quiz-option__label { font-size: 0.84rem; }

@keyframes quizAvatarFloat {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-4px); }
}
@media (prefers-reduced-motion: reduce) {
  .quiz-option__icon { animation: none; }
}

/* ---- Product suggestion — unchanged behavior: hidden until a
   *complete* selection is made (a sub-option for Student/Employee, or
   straight away for Business/Homemaker, which have none). See
   initQuizForm() in script.js for the visibility logic and
   PRODUCT_RECOMMENDATIONS for the copy.

   Layout: the label stays pinned full-width at the top; the image is
   pinned to the bottom-left corner with only a thin gap from the
   box's own left/bottom edges, and the recommendation text reserves
   just enough left-padding to clear it. ---- */
/* The suggestion is just another panel in the .quiz-panels crossfade
   stack — it fills the exact spot the sub-options vanish from, rather
   than appearing as a separate box further down the page. See
   updateVisibility()/activatePanel() in script.js. */
.quiz-suggestion {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius-md);
  background: none;
  border: none;
  opacity: 0;
  transform: scale(0.94);
  pointer-events: none;
  transition: opacity var(--dur-mid) var(--ease-in-out),
              transform var(--dur-mid) var(--ease-in-out);
}
.quiz-suggestion[data-quiz-active] {
  opacity: 1;
  transform: scale(1);
  pointer-events: auto;
}
.quiz-suggestion__label {
  margin: 0 0 0.5rem;
  font-size: 1.35rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--color-accent);
}
.quiz-suggestion__content {
  position: relative;
  flex: 1;
  display: flex;
  align-items: center;
  min-height: 300px;
  padding-left: calc(300px + var(--space-3) + var(--space-4));
  padding-bottom: 2.4rem; /* keeps text/button clear of the bottom-right reset link */
}
/* Reserved slot for the product image — drop an <img> in here later
   (e.g. via data-quiz-suggestion-media.innerHTML / an <img> src swap
   in script.js); the dashed placeholder disappears once it has a
   background-image or a real <img> child. */
.quiz-suggestion__media {
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 300px;
  height: 300px;
  border-radius: var(--radius-md);
  border: none;
  background: none;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.quiz-suggestion__media img { width: 100%; height: 100%; object-fit: contain; display: block; }

.quiz-suggestion__info {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-4);
  min-width: 0;
}

/* Recommendation copy is the payoff of the whole quiz, so it reads
   large and bold, always in white, rather than as muted helper text. */
.quiz-suggestion__text {
  margin: 0;
  font-size: 1.55rem;
  font-weight: 700;
  line-height: 1.45;
  color: var(--color-ink);
  min-width: 0;
}
.quiz-suggestion__text[data-filled] { color: var(--color-ink); }
.quiz-suggestion__product {
  display: inline-block;
  margin-top: 0.4rem;
  font-size: 2.1rem;
  font-weight: 900;
  letter-spacing: -0.01em;
  line-height: 1.15;
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-strong));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  filter: drop-shadow(0 4px 14px rgba(var(--color-accent-rgb), 0.35));
}

/* Bold, unmissable call-to-action — blinks gently to draw the eye
   once a recommendation lands. */
.quiz-suggestion__buy {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.85rem 2.1rem;
  border-radius: var(--radius-full, 999px);
  background: var(--color-accent-strong, #f4a11f);
  color: #ffffff;
  font: 700 1.2rem var(--font-body);
  text-decoration: none;
  letter-spacing: 0.02em;
  box-shadow: 0 12px 26px -14px rgba(244, 161, 31, 0.7);
  animation: quizBuyBlink 1.4s ease-in-out infinite;
}
.quiz-suggestion__buy:hover { animation-play-state: paused; opacity: 0.9; }
@keyframes quizBuyBlink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.45; }
}
@media (prefers-reduced-motion: reduce) {
  .quiz-suggestion__buy { animation: none; }
}

/* ==========================================================================
   Performance Appraisals — star-rated review carousel + "Give us your
   views" submission dialog. See createReviewCarousel() and
   initReviewSubmissionModal() in script.js.
   ========================================================================== */
.appraisals {
  position: relative;
  min-height: auto;
  padding: var(--space-6) var(--space-5) var(--space-5);
  background: var(--color-bg);
  overflow: hidden;
}
.appraisals__inner {
  max-width: 900px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
}
.appraisals__eyebrow { text-align: center; }
.appraisals__title {
  text-align: center;
  font-size: clamp(1.9rem, 3.4vw, 2.8rem);
  margin-bottom: var(--space-5);
}

/* ---- Review carousel + "Give us your views" button, single centered
   column now that the concentric-ring animation has been retired. ---- */
.appraisals__reviews--solo {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.review-carousel {
  width: 100%;
  max-width: 640px;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.review-carousel__viewport { overflow: hidden; }
.review-carousel__track {
  display: flex;
  margin: 0;
  padding: 0;
  list-style: none;
  transition: transform var(--dur-mid) var(--ease-in-out);
}
/* Reviews render as plain, unboxed text — no card border/background.
   Vertical stack: star rating → quote (large, legible body text) →
   name (bold) → role. */
.review-card {
  flex: 0 0 100%;
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  justify-content: center;
  gap: 0.4rem;
  min-height: 240px;
  padding: var(--space-4) var(--space-3);
  background: none;
  border: 0;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  box-shadow: none;
}
.review-card__stars {
  color: #f5a623;
  font-size: 1.15rem;
  letter-spacing: 0.15em;
  line-height: 1;
  margin-bottom: 0.2rem;
}
.review-card__quote {
  font-family: var(--font-display);
  font-size: clamp(0.95rem, 1.4vw, 1.2rem);
  line-height: 1.6;
  color: var(--color-ink);
  margin: 0;
  max-width: 56ch;
}
.review-card__author {
  font-weight: 800;
  font-size: clamp(0.95rem, 1.4vw, 1.2rem);
  color: var(--color-ink);
  margin: var(--space-2) 0 0;
}
.review-card__role {
  font-size: 0.78rem;
  color: var(--color-ink-muted);
  margin: 0;
}
/* Brief highlight on a freshly-submitted review as it lands at the
   front of the carousel. */
.review-card.is-new .review-card__quote,
.review-card.is-new .review-card__author {
  animation: review-card-flash 1.4s var(--ease-out);
}
@keyframes review-card-flash {
  0% { color: var(--color-accent); }
  100% { color: var(--color-ink); }
}

.review-carousel__controls {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
}
.review-carousel__arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  flex: 0 0 auto;
  border-radius: 50%;
  border: 1.5px solid var(--glass-border);
  background: var(--field-bg);
  color: var(--color-ink);
  transition: border-color var(--dur-fast) var(--ease-out),
              color var(--dur-fast) var(--ease-out),
              transform var(--dur-fast) var(--ease-out);
}
.review-carousel__arrow:hover { border-color: var(--color-accent); color: var(--color-accent); transform: translateY(-1px); }
.review-carousel__arrow:active { transform: translateY(0) scale(0.96); }

.review-carousel__dots { display: flex; align-items: center; gap: 0.5rem; }
.review-carousel__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  border: none;
  padding: 0;
  background: var(--glass-border);
  transition: background var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out);
}
.review-carousel__dot.is-active { background: var(--color-accent); transform: scale(1.25); }

/* ---- "Give us your views" button — tight spacing right under the
   carousel, with a subtle animated shine + pulse to draw the eye. ---- */
.give-review-btn {
  position: relative;
  overflow: hidden;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin-top: var(--space-3);
  padding: 0.8rem 1.6rem;
  border-radius: 999px;
  border: 1.5px solid var(--color-accent);
  background: transparent;
  color: var(--color-accent);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.95rem;
  cursor: pointer;
  animation: give-review-pulse 2.6s ease-in-out infinite;
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out);
}
.give-review-btn:hover {
  background: var(--color-accent);
  color: var(--color-bg);
  transform: translateY(-2px);
}
.give-review-btn svg { flex: 0 0 auto; }
.give-review-btn__shine {
  position: absolute;
  top: 0;
  left: -60%;
  width: 40%;
  height: 100%;
  background: linear-gradient(115deg, transparent, rgba(255, 255, 255, 0.35), transparent);
  animation: give-review-shine 3.4s ease-in-out infinite;
  pointer-events: none;
}
@keyframes give-review-pulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(var(--color-accent-rgb), 0.35); }
  50% { box-shadow: 0 0 0 8px rgba(var(--color-accent-rgb), 0); }
}
@keyframes give-review-shine {
  0% { left: -60%; }
  55%, 100% { left: 130%; }
}
@media (prefers-reduced-motion: reduce) {
  .give-review-btn { animation: none; }
  .give-review-btn__shine { display: none; }
}

/* ---- Review submission dialog ---- */
.review-modal {
  position: fixed;
  inset: 0;
  z-index: 1200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-4);
}
.review-modal[hidden] { display: none; }
/* Belt-and-suspenders: guarantee [hidden] actually hides these even if
   some other rule ever ends up with equal-or-higher specificity. */
.review-modal__dialog form[hidden],
.review-modal__success[hidden] { display: none !important; }
.review-modal__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(8, 10, 16, 0.62);
  backdrop-filter: blur(3px);
  opacity: 0;
  transition: opacity 220ms var(--ease-out);
}
.review-modal.is-open .review-modal__backdrop { opacity: 1; }
.review-modal__dialog {
  position: relative;
  width: 100%;
  max-width: 460px;
  max-height: 90vh;
  overflow-y: auto;
  background: var(--color-panel);
  border: 1.5px solid var(--glass-border);
  border-radius: var(--radius-lg);
  box-shadow: 0 24px 60px -20px rgba(0, 0, 0, 0.55);
  padding: var(--space-5);
  transform: translateY(16px) scale(0.97);
  opacity: 0;
  transition: transform 240ms var(--ease-out), opacity 240ms var(--ease-out);
}
.review-modal.is-open .review-modal__dialog { transform: translateY(0) scale(1); opacity: 1; }
.review-modal__dialog h3 { margin: 0 0 0.3rem; font-size: 1.35rem; }
.review-modal__subtitle { color: var(--color-ink-muted); font-size: 0.88rem; margin: 0 0 var(--space-4); }
.review-modal__dialog .field { margin-bottom: var(--space-3); }

.star-picker { display: flex; gap: 4px; }
.star-picker__star {
  padding: 2px;
  border: none;
  background: none;
  color: var(--glass-border);
  cursor: pointer;
  line-height: 0;
  transition: transform 120ms var(--ease-out), color 120ms var(--ease-out);
}
.star-picker__star svg { fill: currentColor; display: block; }
.star-picker__star:hover { transform: scale(1.12); }
.star-picker__star.is-filled { color: #f5a623; }
.review-modal__close {
  position: absolute;
  top: 14px;
  right: 14px;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: 1.5px solid var(--glass-border);
  background: var(--field-bg);
  color: var(--color-ink);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.review-modal__close:hover { border-color: var(--color-accent); color: var(--color-accent); }
.review-modal__error {
  color: #e0473f;
  font-size: 0.85rem;
  margin-bottom: var(--space-3);
}
.review-modal__success {
  text-align: center;
  padding: var(--space-3) 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
}
.review-modal__success-icon {
  color: var(--color-accent);
  display: inline-flex;
}
.review-modal__success p { margin: 0; font-size: 1rem; }

/* ==========================================================================
   Footer
   ========================================================================== */
.site-footer {
  border-top: 2px solid var(--color-navy);
  background: var(--color-panel);
  padding: var(--space-5) var(--space-5) var(--space-4);
}
.site-footer__top {
  max-width: 1440px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(280px, 400px) 1fr auto;
  align-items: start;
  gap: var(--space-5);
  padding-bottom: var(--space-4);
  border-bottom: 1px solid var(--glass-border);
}
.site-footer__brand { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-2); max-width: 320px; }
/* The shared .navbar__logo-img rule shifts the mark 70px left to
   compensate for whitespace baked into the source image — a
   correction tuned for the header's own logo, not the footer's copy
   of the same image. That left it sitting well to the left of the
   tagline text underneath it. Scoped down to just the -3px this
   particular image actually needs, so its left edge lines up with
   the tagline. */
.site-footer__brand .navbar__logo-img { transform: translate(-3px, 0); }
.site-footer__tagline { color: var(--color-ink-muted); font-size: 0.88rem; }

/* Email / Facebook / Instagram icon links — used in the footer brand
   column and, via .contact-info__socials below, on the Contact page's
   "Reach the team directly" card. Same circular-icon language as
   .contact-info__icon so both places read as one consistent pattern. */
.social-links { display: flex; align-items: center; gap: var(--space-2); margin-top: 0.2rem; }
.social-links__icon {
  flex-shrink: 0;
  width: 38px;
  height: 38px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--color-panel);
  border: 1.5px solid var(--glass-border);
  color: var(--color-accent);
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}
.social-links__icon svg { width: 18px; height: 18px; }
.social-links__icon:hover,
.social-links__icon:focus-visible {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: #fff;
  transform: translateY(-2px);
}
.site-footer__col h3 {
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--color-ink-muted);
  margin-bottom: var(--space-3);
  margin-top: var(--space-4);
}
.site-footer__col ul { display: flex; flex-direction: column; gap: var(--space-2); }
.site-footer__col ul.site-footer__quicklinks {
  display: grid;
  grid-template-columns: repeat(3, auto);
  grid-auto-flow: row;
  column-gap: var(--space-5);
  row-gap: var(--space-2);
}
.site-footer__col a { color: var(--color-ink); font-size: 0.9rem; transition: color var(--dur-fast) var(--ease-out); }
.site-footer__col a:hover { color: var(--color-accent); }
.site-footer__partner-logos { display: flex; align-items: center; gap: var(--space-3); justify-self: end; margin-top: 1.75rem; }
.site-footer__partner-logos img { height: 132px; width: auto; object-fit: contain; }
.site-footer__partner-logos img[src*="Antivirus.png"] { height: 176px; }
.site-footer__partner-logos img[src*="ButterBee.png"] { height: 108px; }
.site-footer__bottom {
  max-width: 1440px;
  margin: 0 auto;
  padding-top: var(--space-3);
  font-size: 0.8rem;
  color: var(--color-ink-muted);
}

/* ==========================================================================
   Generic content pages (About / Comparison / Solution / Schemes /
   Gallery / Contact Us) — share the same header, footer, tokens and
   glass-panel language as the home page.
   ========================================================================== */
/* -- Downloads page: full-bleed antivirus artwork behind the page,
   dimmed with a theme-matched wash so the cards/text stay readable. -- */
body.downloads-page {
  background-image:
    linear-gradient(rgba(var(--color-bg-rgb), 0.65), rgba(var(--color-bg-rgb), 0.65)),
    url("../assets/images/Antivirus.png");
  background-repeat: no-repeat, no-repeat;
  background-position: center top, center 30px;
  background-size: cover, min(560px, 70vw);
  background-attachment: fixed, fixed;
}
@media (max-width: 700px) {
  body.downloads-page {
    background-position: center top, center 10px;
    background-size: cover, min(320px, 80vw);
    background-attachment: fixed, scroll;
  }
}

/* -- About page: full-bleed background artwork — Antivirus.png pinned to
   the left edge, ButterBee.png pinned to the right, both dimmed with a
   theme-matched wash so the badges/text stay readable (mirrors the
   downloads page's background treatment). -- */
body.about-page {
  position: relative;
  background-image:
    linear-gradient(rgba(var(--color-bg-rgb), 0.72), rgba(var(--color-bg-rgb), 0.72)),
    url("../assets/images/Antivirus.png"),
    url("../assets/images/ButterBee.png");
  background-repeat: no-repeat, no-repeat, no-repeat;
  /* Antivirus.png is tall/portrait and ButterBee.png is short/wide, so
     anchoring both to the same bottom offset (like before) actually made
     them look uneven — ButterBee sat visually lower/smaller. Raising
     ButterBee's bottom offset here brings its vertical CENTER roughly in
     line with Antivirus's, so the two read as sitting "on the same
     level" instead of one trailing the other. */
  background-position: center top, left 40px bottom 15px, right 60px bottom 175px;
  background-size: cover, min(480px, 40vw), min(480px, 40vw);
  background-attachment: fixed, fixed, fixed;
}
@media (max-width: 900px) {
  body.about-page {
    background-image: linear-gradient(rgba(var(--color-bg-rgb), 0.72), rgba(var(--color-bg-rgb), 0.72));
  }
}

/* Keep the logo/nav legible over the background artwork on this page. */
body.about-page .site-header {
  background: var(--glass-bg);
  backdrop-filter: blur(var(--glass-blur));
  -webkit-backdrop-filter: blur(var(--glass-blur));
  box-shadow: 0 8px 24px -16px rgba(28, 43, 70, 0.35);
}

/* -- Comparison page: decorative antivirus artwork pinned to the right
   edge of the viewport, alongside the plan badges. Hidden on narrower
   viewports where it would overlap the centered content column. -- */
.comparison-decor {
  position: fixed;
  top: calc(var(--header-height) - 8px);
  right: 3.5vw;
  width: clamp(160px, 12.5vw, 235px);
  pointer-events: none;
  z-index: 1;
  filter: drop-shadow(0 20px 40px rgba(0, 0, 0, 0.35));
}
.comparison-decor img {
  display: block;
  width: 100%;
  height: auto;
}
@media (max-width: 1400px) {
  .comparison-decor { display: none; }
}

.page-hero {
  padding: calc(var(--header-height) + var(--space-5)) var(--space-5) var(--space-4);
  max-width: 1100px;
  margin: 0 auto;
}
.page-hero__title {
  font-size: clamp(2.4rem, 5.2vw, 3.9rem);
  font-weight: 600;
  line-height: 1.08;
}
/* Comparison page only: nudge the eyebrow + title down together
   slightly, to balance against the decor image being moved up. */
.comparison-page .page-hero {
  padding-top: calc(var(--header-height) + var(--space-5) + 68px);
}
.page-hero__subtitle {
  margin-top: var(--space-3);
  max-width: 640px;
  font-size: 1.15rem;
  color: var(--color-ink-muted);
}
.page-hero__subtitle--wide {
  max-width: none;
  white-space: nowrap;
}

/* About page intro — each paragraph sits in its own glass "badge", now
   stretched to the full page width rather than a narrow column. */
.about-intro {
  margin-top: var(--space-4);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  max-width: none;
}

.about-feedback-cta {
  max-width: 900px;
  margin: var(--space-6) auto 0;
  padding: 0 clamp(16px, 4vw, 32px) var(--space-6);
  text-align: center;
}
.about-feedback-cta__text {
  font-family: var(--font-display);
  font-size: clamp(1.4rem, 3vw, 2rem);
  font-weight: 700;
  margin: 0 0 var(--space-3);
}

/* "Know About Us." as a pill badge overlapping the top of the intro
   text box — same 50%-outside/50%-inside treatment as the Vision/
   Mission card titles below (.info-card--badge h3). */
.text-badge-wrap {
  position: relative;
  margin-top: clamp(1.75rem, 4vw, 3rem);
  padding-top: calc(var(--space-4) + 1.1rem);
}
.text-badge-wrap__title {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 2;
  margin: 0;
  padding: 0.5rem 1.6rem;
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  font-weight: 700;
  white-space: nowrap;
  border-radius: 999px;
  background: var(--color-accent);
  color: var(--color-on-accent);
  box-shadow: 0 12px 28px -12px rgba(28, 43, 70, 0.5);
}

/* About page only: pull the hero title + intro badges toward the
   left edge instead of sitting centered inside the 1100px column, but
   keep equal breathing room on both sides (the default --space-5 is
   far too tight once max-width is removed). */
.about-page .page-hero {
  margin: 0;
  max-width: none;
  padding-left: clamp(1.5rem, 6vw, 4rem);
  padding-right: clamp(1.5rem, 6vw, 4rem);
}
.text-badge {
  margin: 0;
  padding: var(--space-4);
  border-radius: var(--radius-lg);
  background: var(--glass-bg);
  border: 1.5px solid var(--glass-border);
  backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  box-shadow: 0 20px 40px -22px rgba(28, 43, 70, 0.4);
  font-size: 1.12rem;
  line-height: 1.6;
  color: var(--color-ink);
  width: 100%;
}

.page-section {
  max-width: 1100px;
  margin: 0 auto;
  padding: var(--space-4) var(--space-5) var(--space-6);
}
.about-page .page-section {
  max-width: none;
}
/* Vision (left card) / Mission (right card) row specifically: more side
   padding than the intro text-badge above it — extra space to the left
   of "Our Vision" and to the right of "Our Mission". */
.about-page .page-section#vision {
  padding-left: clamp(2.5rem, 9vw, 7rem);
  padding-right: clamp(2.5rem, 9vw, 7rem);
}
.page-section__title {
  font-size: clamp(1.7rem, 2.9vw, 2.3rem);
  font-weight: 600;
  margin-bottom: var(--space-4);
}

.info-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--space-4);
}
/* Vision/Mission badges on the About page: wider gap between the two
   cards, and extra top margin/padding to leave room for the floating
   title (see .info-card--badge h3 below). */
.info-grid--badges {
  gap: var(--space-6);
  margin-top: calc(var(--space-4) + 1.1rem);
}
@media (min-width: 700px) {
  .info-grid--badges { gap: var(--space-8, 4rem); }
}
.info-card {
  padding: var(--space-4);
  border-radius: var(--radius-lg);
  background: var(--glass-bg);
  border: 1.5px solid var(--glass-border);
  backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  box-shadow: 0 20px 40px -22px rgba(28, 43, 70, 0.4);
}
.info-card h3 {
  font-size: 1.28rem;
  font-weight: 600;
  margin-bottom: var(--space-2);
}
.info-card p {
  color: var(--color-ink);
  font-size: 1.05rem;
  line-height: 1.6;
}

/* "Our Vision" / "Our Mission" badge titles: larger type, straddling the
   card's top border — half the pill sits above the card, half below. */
.info-card--badge {
  position: relative;
  padding-top: calc(var(--space-4) + 1.1rem);
}
.info-card--badge h3 {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translate(-50%, -50%);
  margin: 0;
  padding: 0.5rem 1.6rem;
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  font-weight: 700;
  white-space: nowrap;
  border-radius: 999px;
  background: var(--color-accent);
  color: var(--color-on-accent);
  box-shadow: 0 12px 28px -12px rgba(28, 43, 70, 0.5);
}

/* Comparison table */
.table-scroll-hint {
  display: none;
  color: var(--color-ink-muted);
  font-size: 0.82rem;
  margin: -0.5rem 0 var(--space-2);
}
.table-responsive {
  width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  border-radius: var(--radius-lg);
  position: relative;
}
@media (max-width: 560px) {
  .table-scroll-hint { display: block; }
  /* Signal that the table scrolls sideways: a soft fade on the right
     edge plus a one-line hint above it. Removed automatically once the
     table fits (min-width 480px vs. viewport), no JS needed for the
     fade since it's purely decorative. */
  .table-responsive {
    -webkit-mask-image: linear-gradient(to right, #000 92%, transparent 100%);
    mask-image: linear-gradient(to right, #000 92%, transparent 100%);
  }
  .table-responsive::after { content: none; }
}
.compare-table {
  width: 100%;
  min-width: 480px;
  border-collapse: collapse;
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: var(--glass-bg);
  border: 1.5px solid var(--glass-border);
  backdrop-filter: blur(var(--glass-blur));
  -webkit-backdrop-filter: blur(var(--glass-blur));
}
.compare-table th, .compare-table td {
  text-align: left;
  padding: var(--space-3) var(--space-3);
  border-bottom: 1px solid var(--glass-border);
  font-size: 0.92rem;
}
.compare-table th { color: var(--color-ink-muted); font-weight: 600; text-transform: uppercase; font-size: 0.72rem; letter-spacing: 0.08em; }
.compare-table tr:last-child td { border-bottom: none; }
.compare-table td:first-child, .compare-table th:first-child { color: var(--color-ink); font-weight: 600; }

/* Gallery */
.gallery-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: var(--space-3);
}
.gallery-grid__item {
  aspect-ratio: 4 / 3;
  border-radius: var(--radius-md);
  border: 1.5px solid var(--glass-border);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-weight: 600;
  color: var(--card-ink);
  font-size: 1rem;
}

/* Gallery page placeholder — shown while the real grid above is
   commented out and waiting on admin-uploaded photos. */
.gallery-placeholder {
  min-height: 260px;
  border-radius: var(--radius-lg);
  border: 1.5px dashed var(--glass-border);
  background: var(--glass-bg);
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}
.gallery-placeholder__text {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(1.3rem, 3vw, 1.9rem);
  color: var(--color-ink-muted);
}

/* Contact */
.contact-grid {
  display: grid;
  grid-template-columns: 1.1fr 0.9fr;
  gap: var(--space-5);
  align-items: start;
}
@media (max-width: 760px) { .contact-grid { grid-template-columns: 1fr; } }
.contact-form { display: flex; flex-direction: column; gap: var(--space-3); }
.contact-details { display: flex; flex-direction: column; gap: var(--space-3); }
.contact-details__item h3 { font-size: 0.95rem; margin-bottom: 0.3rem; }
.contact-details__item p { color: var(--color-ink-muted); font-size: 0.92rem; }

/* ==========================================================================
   Accessibility
   ========================================================================== */
a:focus-visible, button:focus-visible, input:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 3px;
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .btn--activate::after { animation: none; }
  .feature-box__panel { transition-duration: 1ms; }
}

/* ==========================================================================
   Responsive
   Breakpoints: ≥1440 large desktop (default styles above already scale
   fluidly via clamp/vw), 901–1439 small desktop/laptop, 601–900 tablet,
   ≤600 phone. Every rule below only tightens spacing/sizing or reflows —
   it never hides content people need, aside from swapping the inline
   nav for the hamburger menu once it stops fitting.
   ========================================================================== */

/* ---- Small desktops / laptops: trim the outer rail a little ---- */
@media (max-width: 1200px) {
  .navbar { padding: 0 var(--space-4); }
  .navbar__links { gap: 1.2rem; }
  .stack-panel { padding: 0 var(--space-2); }
}

/* ---- Tablet and below: nav collapses into the hamburger menu ---- */
@media (max-width: 900px) {
  /* Prevent background scrolling/visual mixing with page content
     while the dropdown panel is open. */
  body.nav-open { overflow: hidden; }

  .navbar { padding: var(--space-2) var(--space-3) 0; align-items: flex-start; }
  .navbar__logo-img { height: 64px; transform: translate(-24px, 0); }

  .navbar__toggle { display: inline-flex; }

  /* The inline nav becomes a full-width dropdown panel anchored under
     the header, toggled by .is-open (added by script.js). */
  .navbar__nav {
    position: fixed;
    inset: var(--header-height) 0 auto 0;
    z-index: 110;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    margin-top: 0;
    max-height: calc(100vh - var(--header-height));
    overflow-y: auto;
    background: var(--color-bg);
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
    border-bottom: 1.5px solid var(--glass-border);
    box-shadow: 0 20px 40px -24px rgba(28, 43, 70, 0.45);
    padding: var(--space-2) var(--space-4) var(--space-4);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-10px);
    pointer-events: none;
    transition: opacity var(--dur-mid) var(--ease-in-out),
                transform var(--dur-mid) var(--ease-in-out),
                visibility 0s linear var(--dur-mid);
  }
  .navbar__nav.is-open {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    pointer-events: auto;
    transition: opacity var(--dur-mid) var(--ease-in-out),
                transform var(--dur-mid) var(--ease-in-out);
  }

  .navbar__links { flex-direction: column; gap: 0; font-size: 1.15rem; width: 100%; }
  .navbar__links li { border-bottom: 1px solid var(--glass-border); }
  .navbar__links li:last-child { border-bottom: none; }
  .navbar__links a { display: block; padding: var(--space-3) var(--space-1); }

  /* The hover-only mega-menu doesn't translate well to touch; the top
     level "About" link already routes to the About page, which contains
     the same Vision & Mission content further down. */
  .mega-menu { display: none; }

  .theme-toggle { align-self: flex-start; margin: var(--space-3) 0 0; }
  .navbar__cta { width: 100%; margin-top: var(--space-3); }

  .stack-card__body { flex-direction: column; overflow-y: auto; -webkit-overflow-scrolling: touch; }
  .stack-card__left { flex: 0 0 auto; justify-content: flex-start; text-align: center; align-items: center; }
  .stack-card__text1, .stack-card__text2, .stack-card__text3, .stack-card__text4 { margin-left: auto; margin-right: auto; }
  .feature-box { flex: 1 1 auto; width: 100%; height: auto; min-height: 260px; padding: var(--space-4); }
  .feature-box--activation { padding: 0; }

  /* The desktop title/text positions rely on large negative translateY
     offsets to sit correctly inside a tall (900px) two-column card —
     on the shorter, single-column mobile card those same offsets shove
     the text above the visible frame entirely (clipped by overflow:
     hidden), leaving only an empty gradient background. Switch to
     viewport-scaled font sizes so every title/text/logo actually
     renders inside the card on every phone/tablet. */
  .stack-card__title,
  .stack-card__title1,
  .stack-card__title2,
  .stack-card__title3,
  .stack-card__title4,
  .stack-card__title5,
  .stack-card__title6 {
    font-size: clamp(1.7rem, 6.5vw, 2.6rem);
  }
  .stack-card__text1,
  .stack-card__text2,
  .stack-card__text3,
  .stack-card__text4 {
    font-size: clamp(1.15rem, 4.6vw, 1.6rem);
    white-space: normal;
    max-width: 40ch;
  }
  /* Logo moves out of its absolute bottom-left desktop position and
     into the normal stacked flow, centered under the text. */
  .stack-card__logo,
  .stack-card[data-stack-card="1"] .stack-card__logo,
  .stack-card[data-stack-card="2"] .stack-card__logo,
  .stack-card[data-stack-card="3"] .stack-card__logo,
  .stack-card[data-stack-card="4"] .stack-card__logo {
    position: static;
    display: block;
    align-self: center;
    height: 150px;
    width: auto;
    max-width: 75%;
    margin: var(--space-3) auto 0;
  }
  /* The "Try It Yourself" arrow is absolutely positioned to point from
     the desktop text column toward the feature box beside it — with
     everything stacked in one column on mobile that reference point no
     longer exists, so it just floats over unrelated content. The
     feature box already has its own "Click Here" pointer on the
     Activate button, so this decorative arrow is safe to hide here. */
  .try-arrow { display: none; }

  .page-hero, .page-section { padding-left: var(--space-3); padding-right: var(--space-3); }
  .contact-grid { grid-template-columns: 1fr; }
  .site-footer__top { grid-template-columns: 1fr 1fr; }
  .site-footer__partner-logos { justify-self: start; }

  /* Quiz CTA — stack vertically, box scales up to 90vw instead of
     fighting for 50vw beside the trigger text. */
  .quiz-cta { flex-direction: column; align-items: center; justify-content: flex-start; min-height: auto; gap: var(--space-4); text-align: center; padding: var(--space-5) var(--space-3); }
  .quiz-trigger { flex: none; width: 100%; align-items: center; padding-right: 0; }
  .quiz-trigger__arrow { align-self: center; transform: rotate(82deg) translateX(14px); }
  .quiz-interactive { align-self: center; width: 90vw; }
  .quiz-panels { min-height: 380px; }
  .quiz-suggestion__content { min-height: 175px; padding-left: calc(150px + var(--space-2) + var(--space-3)); }
  .quiz-suggestion__media { width: 150px; height: 150px; }
  .quiz-suggestion__text { font-size: 1.05rem; }

  /* Performance Appraisals — no longer forced to 100vh since it's just
     a single centered carousel column now. */
  .appraisals { min-height: auto; padding: var(--space-5) var(--space-3); }
  .review-card { min-height: 220px; padding: var(--space-3); }
}

/* ---- Phones ---- */
@media (max-width: 560px) {
  .site-footer { padding: var(--space-4) var(--space-3); }
  .page-hero__subtitle--wide { white-space: normal; }
  .site-footer__top { grid-template-columns: 1fr; gap: var(--space-4); }
  .site-footer__brand { max-width: none; }
  .site-footer__col ul.site-footer__quicklinks { grid-template-columns: 1fr; }

  .stack-panel { padding: 0 6px; }
  .stack-card__body { padding-left: var(--space-2); padding-right: var(--space-2); gap: var(--space-3); }
  .feature-box { padding: var(--space-3); min-height: 220px; }
  .feature-box--activation { padding: 0; }

  .navbar { padding: var(--space-2) var(--space-2) 0; }
  .navbar__logo-img { height: 48px; transform: translate(-14px, 0); }
  .navbar__nav { padding: var(--space-2) var(--space-3) var(--space-3); }

  .page-hero { padding-top: calc(var(--header-height) + var(--space-3)); padding-left: var(--space-2); padding-right: var(--space-2); }
  .page-section { padding-left: var(--space-2); padding-right: var(--space-2); }
  .info-grid, .gallery-grid { grid-template-columns: 1fr; }

  .quiz-cta { padding: var(--space-4) var(--space-2); }
  .quiz-trigger__text { font-size: clamp(1.6rem, 8vw, 2.2rem); }
  .quiz-interactive { width: 96vw; min-width: 0; }
  .quiz-panels { min-height: 360px; }
  .quiz-stage__heading { font-size: 0.85rem; padding: 0.7rem 0.85rem; }
  .quiz-grid--quad, .quiz-grid--pair { flex-wrap: wrap; row-gap: var(--space-3); }
  .quiz-option__icon { width: clamp(84px, 26vw, 108px); height: clamp(84px, 26vw, 108px); }
  .quiz-option--sub .quiz-option__icon { width: clamp(74px, 22vw, 94px); height: clamp(74px, 22vw, 94px); }
  .quiz-option__label { font-size: 0.82rem; }
  .quiz-suggestion__content { flex-direction: column; align-items: stretch; gap: var(--space-3); padding-left: 0; min-height: auto; }
  .quiz-suggestion__media { position: static; width: 100%; height: 150px; left: auto; top: auto; transform: none; }
  .quiz-suggestion__text { font-size: 1.05rem; }

  .appraisals__title { font-size: clamp(1.5rem, 7vw, 2rem); margin-bottom: var(--space-4); }
  .review-card { min-height: 200px; padding: var(--space-3); }
  .review-card__quote { font-size: 0.85rem; margin-bottom: var(--space-3); }
  .review-carousel__arrow { width: 38px; height: 38px; }
}

/* ---- Very small phones ---- */
@media (max-width: 360px) {
  .navbar__logo-img { height: 40px; transform: translate(-10px, 0); }
  .btn--activate { min-width: 0; width: 100%; }
  .feature-video__el { border-radius: var(--radius-sm); }
}

/* ---- Landscape phones / short viewports: sticky stack sequence needs
   enough vertical room to breathe, so relax it into normal flow rather
   than risk clipped, overlapping cards on very short screens. ---- */
@media (max-height: 480px) and (max-width: 900px) {
  .stack-panel { position: relative; top: 0; height: auto; padding: var(--space-4) var(--space-3); }
  .stack-track { height: auto; }
  .stack-card { position: relative; margin-bottom: var(--stack-gap); transform: none !important; }
  .stack-card[data-stack-card] { top: auto; right: auto; bottom: auto; left: auto; }
  .stack-card.is-hidden .stack-card__body { visibility: visible; }
  .stack-card.is-hidden { pointer-events: auto; }

  .appraisals { min-height: auto; }
}
/* ==========================================================================
   WHY CHOOSE US — speedometer/dial infographic
   Sits directly after the "Confused?" quiz CTA. Two pieces:
     1. .wc-heading  — two-stage scroll-reveal title (see initWhyChooseDial)
     2. .wc-dial     — semi-circular 8-point gauge. Every point's position
                        is driven by --icon-x/--icon-y/--label-x/--label-y/
                        --rot custom properties set inline in the HTML
                        (precomputed from the arc geometry), so the rules
                        below are generic and don't repeat per-point.
   Below 900px the exact same markup switches to a plain vertical list
   (see the mobile block at the bottom) — no duplicated content, just a
   different arrangement of the same DOM.
   ========================================================================== */
.why-choose {
  position: relative;
  padding: var(--space-6) var(--space-5) var(--space-6);
  background: var(--color-bg);
  overflow: hidden;
}
.why-choose__inner {
  max-width: 1480px;
  margin: 0 auto;
}

/* ---------- Heading: two-stage scroll reveal ---------- */
.wc-heading {
  text-align: center;
  margin-bottom: var(--space-6);
}
.wc-heading__eyebrow {
  text-align: center;
  font-size: clamp(1rem, 1.7vw, 1.3rem);
  letter-spacing: 0.16em;
}

.wc-heading__line {
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.05;
  color: var(--color-ink);
  /* Hidden state: clipped and dropped slightly, ready to reveal upward. */
  clip-path: inset(0 0 100% 0);
  opacity: 0;
  transform: translateY(28px);
  transition:
    clip-path 1100ms var(--ease-out),
    opacity 900ms var(--ease-out),
    transform 1100ms var(--ease-out);
  will-change: clip-path, opacity, transform;
}
.wc-heading__line--1 {
  font-size: clamp(3.4rem, 8.6vw, 6.8rem);
  color: var(--color-navy);
}
.wc-heading__line--2 {
  font-size: clamp(1.8rem, 4.4vw, 3.1rem);
  font-weight: 600;
  color: var(--color-accent);
  margin-top: var(--space-2);
  transition-delay: 80ms; /* settles in just after line 1, once it's visible */
}
.wc-heading__line.is-visible {
  clip-path: inset(0 0 0% 0);
  opacity: 1;
  transform: translateY(0);
}

/* ---------- Dial wrap: extra breathing room for labels that sit
   outside the 0–100% arc box — pushed further out (see --label-x/-y
   in the markup) specifically so adjacent badges no longer touch. ---------- */
.wc-dial-wrap {
  position: relative;
  padding: clamp(300px, 12.5vw, 355px) clamp(250px, 32.06%, 733px) clamp(16px, 2vw, 28px);
}
.wc-dial {
  position: relative;
  width: 100%;
  max-width: 820px;
  margin: 0 auto;
  aspect-ratio: 600 / 316;
  container-type: inline-size;
  container-name: wcdial;
}

/* ---------- Arc band ---------- */
.wc-dial__arc {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
}
.wc-wedge {
  fill: url(#wcWedgeGradient);
  fill-opacity: 0.22; /* dim "unfilled gauge" state until its point activates */
  filter: none;
  transition: fill-opacity 900ms var(--ease-out), filter 900ms var(--ease-out);
}
.wc-wedge.is-active {
  fill-opacity: 1;
  filter: drop-shadow(0 0 14px rgba(var(--color-accent-rgb), 0.55));
  animation: wcWedgeShine 1300ms var(--ease-out);
}
@keyframes wcWedgeShine {
  0%   { filter: brightness(1) drop-shadow(0 0 0 rgba(var(--color-accent-rgb), 0)); }
  45%  { filter: brightness(1.5) drop-shadow(0 0 22px rgba(var(--color-accent-rgb), 0.85)); }
  100% { filter: brightness(1) drop-shadow(0 0 14px rgba(var(--color-accent-rgb), 0.55)); }
}

/* ---------- Centre of the arc: logo on top of a slowly revolving
   dashed ring. The ring spins continuously; the logo itself stays
   upright and still so it's always readable. ---------- */
/* ---------- Centre of the arc: logo on top of a semicircular dome,
   itself ringed by a dashed semicircle. Both shapes share the same
   flat-bottom / round-top geometry as the wedge arc above them, so the
   whole dial reads as one continuous instrument with the logo sitting
   in its own half-moon housing at the base. ---------- */
.wc-dial__center {
  position: absolute;
  left: 50%;
  bottom: 5%;
  transform: translate(-50%, 0);
  width: clamp(160px, 26%, 250px);
  display: flex;
  align-items: flex-end;
  justify-content: center;
  text-align: center;
  z-index: 2;
}
/* Solid whitish semicircular backing, sitting between the dashed
   semicircle ring and the logo, so the logo always reads clearly
   regardless of what's behind it. A touch larger than the logo with a
   soft shadow to lift it off the page. Flat edge down, dome up. */
.wc-dial__center::before {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  width: calc(100% + 30px);
  aspect-ratio: 2 / 1;
  transform: translate(-50%, 0);
  border-radius: 50% 50% 0 0 / 100% 100% 0 0;
  background: radial-gradient(circle at 50% 68%, #ffffff 0%, #fbfbfc 62%, #f2f3f5 100%);
  box-shadow:
    0 -6px 26px -10px rgba(28, 43, 70, 0.35),
    0 0 0 1px rgba(28, 43, 70, 0.06);
  z-index: 0;
}
.wc-dial__ring {
  position: absolute;
  left: 50%;
  bottom: 0;
  width: calc(100% + 52px);
  aspect-ratio: 2 / 1;
  transform: translate(-50%, 0);
  transform-origin: center bottom;
  border-radius: 50% 50% 0 0 / 100% 100% 0 0;
  border: 2px dashed rgba(var(--color-accent-rgb), 0.65);
  border-bottom: none;
  pointer-events: none;
  z-index: 1;
}
.wc-dial__logo {
  position: relative;
  z-index: 2; /* stays above the whitish backing dome and the dashed ring */
  width: 78%;
  height: auto;
  display: block;
  margin: 0 auto clamp(10px, 2vw, 16px);
  filter: drop-shadow(0 8px 18px rgba(28, 43, 70, 0.25));
}

/* ---------- Radiating points ---------- */
.wc-point {
  position: absolute;
  inset: 0;
  pointer-events: none;
}
.wc-point__arrow,
.wc-point__icon,
.wc-point__label {
  position: absolute;
  opacity: 0;
}

/* Icon badge — sits mid-ring, ON the wedge (inside the ring), at the
   position authored per point (--icon-x/--icon-y). This is deliberately
   NOT pushed outward: the badge belongs inside the coloured arc; it's
   the arrow (below) that lives entirely outside the ring. The icon
   artwork itself is already a vivid full-colour circular badge, so the
   wrapper just frames it with a crisp white ring + lifted shadow rather
   than adding its own background. */
.wc-point__icon {
  left: var(--icon-x);
  top: var(--icon-y);
  width: clamp(46px, 6vw, 64px);
  height: clamp(46px, 6vw, 64px);
  transform: translate(-50%, calc(-50% + 10px)) scale(0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: #ffffff;
  border: 3px solid rgba(255, 255, 255, 0.95);
  box-shadow:
    0 6px 18px -2px rgba(28, 43, 70, 0.5),
    0 0 0 7px rgba(var(--color-accent-rgb), 0.16); /* soft translucent halo, kept static */
  overflow: hidden;
  transition: opacity 900ms var(--ease-out), transform 900ms var(--ease-out),
    box-shadow 900ms var(--ease-out);
  z-index: 2;
}
.wc-point__icon img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  filter: saturate(1.25) contrast(1.06);
}
.wc-point.is-active .wc-point__icon {
  box-shadow:
    0 6px 20px -2px rgba(28, 43, 70, 0.55),
    0 0 0 8px rgba(var(--color-accent-rgb), 0.26); /* halo brightens once lit — no animation */
}

/* Bold flag-style arrow — anchored at --tail-x/--tail-y, a point JS
   computes to sit exactly on the RING'S OUTER EDGE. The arrow is anchored
   at its own MIDPOINT (transform-origin/translate both 50%), so exactly
   half its shaft runs inward over the ring and half runs outward past
   it — instead of sitting entirely outside. Colour flips per side: blue
   over the orange half of the arc, orange over the blue half (set just
   below via data-wc-point). Falls back to --icon-x/-icon-y if JS hasn't
   run yet. */
.wc-point__arrow {
  left: var(--tail-x, var(--icon-x));
  top: var(--tail-y, var(--icon-y));
  width: clamp(46px, 6vw, 62px);
  height: var(--arrow-len, 180px);
  transform-origin: 50% 50%;
  transform: translate(-50%, -50%) rotate(var(--rot)) scaleY(0.5);
  filter: drop-shadow(0 2px 5px rgba(28, 43, 70, 0.35));
  transition: opacity 700ms var(--ease-out), transform 900ms var(--ease-out);
  z-index: 1;
}
.wc-point__arrow svg { width: 100%; height: 100%; fill: currentColor; }

/* Left half of the dial (points 1–4) sits on the orange wedge -> arrows
   are blue/navy. Right half (points 5–8) sits on the blue wedge ->
   arrows are orange. */
[data-wc-point="1"] .wc-point__arrow,
[data-wc-point="2"] .wc-point__arrow,
[data-wc-point="3"] .wc-point__arrow,
[data-wc-point="4"] .wc-point__arrow {
  color: var(--color-navy);
}
[data-wc-point="5"] .wc-point__arrow,
[data-wc-point="6"] .wc-point__arrow,
[data-wc-point="7"] .wc-point__arrow,
[data-wc-point="8"] .wc-point__arrow {
  color: var(--color-accent);
}

/* Copy card at the arrow tip — solid-ish whitish badge (independent of
   the light/dark theme tokens) so the dark ink text stays crisp and
   vivid against the gradient arc no matter which theme is active.
   Sized up and widened so three-word headings like "Block Unauthorized
   Access" settle onto two lines instead of three. */
.wc-point__label {
  left: calc(50% + var(--label-dx));
  top: calc(100% + var(--label-dy) + 56px);
  width: clamp(178px, 27.56cqw, 226px);
  height: clamp(150px, 20.98cqw, 172px); /* fixed so every badge is identically sized, regardless of 1- vs 2-line copy */
  margin-left: calc(-1 * clamp(89px, 13.78cqw, 113px));  /* = -width/2, as a static calc instead of a %-transform */
  margin-top: calc(-1 * clamp(75px, 10.49cqw, 86px));     /* = -height/2, same reasoning */
  padding: 12px 14px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-md);
  background: rgba(255, 255, 255, 0.94);
  border: 1px solid rgba(28, 43, 70, 0.12);
  box-shadow: 0 14px 30px -14px rgba(28, 43, 70, 0.55);
  transform: translateY(10px);
  text-align: center;
  transition: opacity 900ms var(--ease-out), transform 900ms var(--ease-out);
  z-index: 2;
}
.wc-point__label h4 {
  font-family: var(--font-display);
  font-size: 1.02rem;
  font-weight: 700;
  color: #171b22;
  margin-bottom: 4px;
  line-height: 1.2;
}
.wc-point__label p {
  font-size: 0.78rem;
  line-height: 1.32;
  color: #4a5261;
}

/* Points 1, 4 and 8 carry longer three-word headings ("Best Interactive
   GUI", "Block Unauthorized Access", "Offline / Customized Updates")
   that wrap onto 3 lines at the standard badge width. Widen just these
   three so the heading settles onto 2 lines like the rest — the
   anchor point (arrow tip) stays the same since the extra width is
   added symmetrically via the margin-left calc. Point 4 sits much
   closer to its neighbours (3 and 5, the two points nearest the top
   of the arc) than 1 and 8 do, so it gets a smaller bump — just
   enough to drop "Block Unauthorized" onto one line — to avoid the
   wider badge overlapping them. */
[data-wc-point="1"] .wc-point__label,
[data-wc-point="8"] .wc-point__label {
  width: clamp(212px, 32.8cqw, 262px);
  margin-left: calc(-1 * clamp(106px, 16.4cqw, 131px));
}
[data-wc-point="4"] .wc-point__label {
  width: clamp(190px, 29.4cqw, 235px);
  margin-left: calc(-1 * clamp(95px, 14.7cqw, 117.5px));
}

/* Activated state: pop everything into place */
.wc-point.is-active .wc-point__icon {
  opacity: 1;
  transform: translate(-50%, calc(-50% + 10px)) scale(1);
}
.wc-point.is-active .wc-point__arrow {
  opacity: 1;
  transform: translate(-50%, -50%) rotate(var(--rot)) scaleY(1);
}
.wc-point.is-active .wc-point__label {
  opacity: 1;
  transform: translateY(0);
}

/* ---------- Full-screen laptop / large desktop: bigger dial ----------
   Below this width the dial's rendered size is capped well under its
   own 820px max-width by the wrap's large side padding (that padding
   is what reserves room for the outward-radiating labels). On a big
   screen there's plenty of spare width, so this shrinks that padding
   to let the dial (and, since --icon-x/-y are percentages of the same
   box, the icons riding on it) grow toward its real max-width — while
   the badges themselves are pinned to fixed pixel coordinates instead
   of the normal container-relative calc, so they stay exactly where
   they were at the smaller size and don't drift outward as the dial
   grows underneath them. Values below are the labels' current
   resolved on-screen positions (captured at 1920px, where the dial's
   rendered size is already stable) written out as fixed left/top so
   they hold steady regardless of how much bigger the dial gets. */
@media (min-width: 1440px) {
  .wc-dial-wrap {
    padding-left: 300px;
    padding-right: 300px;
    /* At this width the base padding-top (300px) leaves ~40px of
       unused headroom above the topmost label — trim it down closer
       to what's actually needed to shrink the gap under the heading
       without touching the smaller-viewport tiers below, where that
       same 300px is already close to the minimum safe clearance. */
    padding-top: 265px;
  }
  .wc-point__icon {
    width: clamp(70px, 7vw, 96px);
    height: clamp(70px, 7vw, 96px);
  }
}

/* ==========================================================================
   Mobile / narrow layout — same DOM, re-arranged into a simple vertical
   list of cards so nothing overlaps or clips on small screens.
   ========================================================================== */
@media (max-width: 900px) {
  .wc-dial-wrap { padding: 0; }
  .wc-dial {
    max-width: 480px;
    aspect-ratio: auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--space-3);
  }
  .wc-dial__arc { display: none; }
  .wc-dial__center {
    position: static;
    transform: none;
    width: 120px;
    margin-bottom: var(--space-2);
  }
  .wc-point {
    position: static;
    inset: auto;
    display: flex;
    align-items: flex-start;
    gap: 14px;
    width: 100%;
    padding: 14px 16px;
    border-radius: var(--radius-md);
    background: var(--color-panel);
    border: 1px solid var(--glass-border);
    box-shadow: 0 10px 24px -16px rgba(28, 43, 70, 0.35);
    opacity: 0;
    transform: translateX(-16px);
    transition: opacity 420ms var(--ease-out), transform 420ms var(--ease-out);
  }
  .wc-point.is-active { opacity: 1; transform: translateX(0); }
  .wc-point__arrow { display: none; }
  .wc-point__icon {
    position: static;
    transform: none !important;
    opacity: 1 !important;
    flex: none;
    width: 48px;
    height: 48px;
  }
  .wc-point__label {
    position: static;
    transform: none !important;
    opacity: 1 !important;
    width: auto;
    text-align: left;
  }
}
@media (max-width: 560px) {
  .why-choose { padding: var(--space-5) var(--space-3); }
  .wc-heading { margin-bottom: var(--space-4); }
}

/* Respect reduced-motion: show everything immediately, no stagger, no
   continuous ring rotation. */
@media (prefers-reduced-motion: reduce) {
  .wc-heading__line,
  .wc-wedge,
  .wc-point__icon,
  .wc-point__arrow,
  .wc-point__label,
  .wc-point,
  .wc-dial__ring { transition: none !important; animation: none !important; }
}

/* ==========================================================================
   Ready to Buy CTA — small punchy strip right after "Why Choose Us".
   Mirrors the "Confused?" quiz-trigger further down the page: the same
   gradient, pulsing trigger text and the same curly, glowing arrow
   (reuses .quiz-arrow__path / .quiz-arrow__head + the shared try-arrow-*
   keyframes) — just aimed at a big, blinking Buy Now button instead of
   the quiz box.
   ========================================================================== */
.ready-buy-cta {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: clamp(var(--space-4), 6vw, var(--space-6));
  padding: clamp(var(--space-5), 8vw, var(--space-6)) var(--space-5);
  background: var(--color-bg);
  overflow: hidden;
}

.ready-buy-trigger {
  display: flex;
  align-items: center;
  gap: clamp(var(--space-3), 4vw, var(--space-5));
}

.ready-buy-trigger__text {
  margin: 0;
  font-family: 'Poppins', var(--font-body);
  font-weight: 800;
  font-size: clamp(2rem, 4vw, 3.4rem);
  line-height: 1.1;
  letter-spacing: -0.01em;
  white-space: nowrap;
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-strong));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  filter: drop-shadow(0 4px 16px rgba(var(--color-accent-rgb), 0.3));
  animation: quiz-pulse 2.6s ease-in-out infinite;
}
.ready-buy-trigger__marks { margin-left: 0.05em; }

.ready-buy-trigger__arrow {
  width: clamp(120px, 12vw, 190px);
  height: auto;
  overflow: visible;
  filter: drop-shadow(0 0 6px rgba(244, 161, 31, 0.6));
  animation: try-arrow-glow 2s ease-in-out infinite;
}

.ready-buy-cta__action {
  display: flex;
  align-items: center;
}

/* Big, hard-to-miss Buy Now button — same idle pulse ring as
   .btn--activate elsewhere on the site, sized up and given its own
   opacity blink so it reads unmistakably as the payoff of the arrow. */
.ready-buy-cta__button {
  position: relative;
  isolation: isolate;
  font-size: clamp(1.05rem, 1.6vw, 1.25rem);
  padding: 1.15rem 3.2rem;
  animation: ready-buy-blink 1.6s ease-in-out infinite;
}
.ready-buy-cta__button::after {
  content: '';
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  box-shadow: 0 0 0 0 rgba(var(--color-accent-rgb), 0.45);
  animation: pulse-ring 2.2s var(--ease-in-out) infinite;
  z-index: -1;
}
@keyframes ready-buy-blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.6; }
}

@media (max-width: 640px) {
  .ready-buy-cta { flex-direction: column; text-align: center; padding: var(--space-5) var(--space-4); }
  .ready-buy-trigger { flex-direction: column; gap: var(--space-3); }
  .ready-buy-trigger__text { white-space: normal; }
  .ready-buy-trigger__arrow { transform: rotate(90deg); }
}

@media (prefers-reduced-motion: reduce) {
  .ready-buy-trigger__text,
  .ready-buy-trigger__arrow,
  .ready-buy-cta__button,
  .ready-buy-cta__button::after { animation: none !important; }
}

/* ==========================================================================
   Feature-tree comparison diagram
   --------------------------------------------------------------------------
   A vertical spine of feature nodes, each branching left/right to circular
   product badges for every tier that includes it. Built entirely from
   tokens already defined in styles.css so it inherits the site's light/
   dark theme automatically.
   ========================================================================== */

.page-section__intro {
  color: var(--color-ink-muted);
  font-size: 1rem;
  max-width: 640px;
  margin: -0.5rem 0 var(--space-4);
}

.ft-wrap {
  max-width: 980px;
  margin: 0 auto;
}

/* ---- Spine ------------------------------------------------------------ */
.ft-spine {
  position: relative;
  margin-top: 60px; /* nudges the spine's starting point down (~1.5cm) */
  padding: var(--space-3) 0;
  --spine-x: 50%;
}

/* Track: the full-length, faint guide the growing line travels along.
   Height is capped by JS to the exact same stopping point as the bright
   animated line (just above the Buy Now button) — it used to run the
   full height of the section (bottom: 0), which left a faint translucent
   line visibly poking out past the button. */
.ft-spine__track {
  position: absolute;
  top: 0;
  height: 100%; /* JS overrides this with an exact px value once measured */
  left: var(--spine-x);
  width: 6px;
  transform: translateX(-50%);
  border-radius: 999px;
  background: var(--glass-border);
  opacity: 0.35;
  z-index: 0;
}

/* Line: the animated, growing spine. Height is driven by JS as the user
   scrolls, so it always represents "how far" the reader has progressed. */
.ft-spine__line {
  position: absolute;
  top: 0;
  left: var(--spine-x);
  width: 6px;
  height: 0;
  transform: translateX(-50%);
  border-radius: 999px;
  background: linear-gradient(
    to bottom,
    var(--color-accent-strong),
    var(--color-accent)
  );
  box-shadow: 0 0 14px 1px rgba(var(--color-accent-rgb), 0.5);
  transition: height 120ms linear;
  will-change: height;
  z-index: 0;
}

/* Arrowhead: rides at the growing tip of the line, always pointing down
   to telegraph the direction of travel. Blinks gently to draw the eye. */
.ft-spine__arrow {
  position: absolute;
  left: var(--spine-x);
  top: 0;
  width: 0;
  height: 0;
  border-left: 9px solid transparent;
  border-right: 9px solid transparent;
  border-top: 14px solid var(--color-accent-strong);
  transform: translate(-50%, -2px);
  filter: drop-shadow(0 0 8px rgba(var(--color-accent-rgb), 0.75));
  transition: top 120ms linear;
  will-change: top;
  z-index: 2;
  animation: ft-arrow-blink 1.4s ease-in-out infinite;
}

@keyframes ft-arrow-blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.25; }
}

/* ---- End-of-spine Buy Now CTA ------------------------------------------
   Sits centered on the spine axis after the last feature row. Fades/rises
   into place the same way a feature row does, using the shared is-visible
   hook, once the growing line reaches it — so the arrow ends up pointing
   straight at the button. */
.ft-spine__end {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 34px; /* clears the arrowhead's own visual height so the button sits right after its tip, not under it */
  padding: 0 0 var(--space-4);
  opacity: 0;
  transform: translateY(18px);
  transition: opacity var(--dur-mid) var(--ease-out),
              transform var(--dur-mid) var(--ease-out);
}
.ft-spine__end.is-visible {
  opacity: 1;
  transform: translateY(0);
}
.ft-spine__end-stub {
  width: 6px;
  height: 8px; /* ~0.2cm gap between the arrowhead's resting point and the button */
  margin-bottom: 0;
  border-radius: 999px;
  background: linear-gradient(to bottom, var(--color-accent), var(--color-accent-strong));
}
.ft-spine__buy {
  position: relative;
  isolation: isolate;
  animation: ft-buy-blink 1.6s ease-in-out infinite;
}
.ft-spine__buy::after {
  content: '';
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  box-shadow: 0 0 0 0 rgba(var(--color-accent-rgb), 0.45);
  animation: pulse-ring 2.2s var(--ease-in-out) infinite;
  z-index: -1;
}
@keyframes ft-buy-blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.55; }
}

.ft-node {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: start;
  column-gap: var(--space-3);
  padding: 18px 0;
  opacity: 0;
  transform: translateY(18px);
  transition: opacity var(--dur-mid) var(--ease-out),
              transform var(--dur-mid) var(--ease-out);
}
.ft-node.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Trunk: the dot + feature name, always centered on the spine */
.ft-node__trunk {
  grid-column: 2;
  grid-row: 1;
  display: flex;
  align-items: center;
  gap: 0.6rem;
  justify-content: center;
  z-index: 2;
}
.ft-node__label {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.92rem;
  line-height: 1.25;
  color: var(--color-ink);
  white-space: nowrap;
  padding: 0.55rem 1rem;
  border-radius: var(--radius-md);
  background: var(--color-panel);
  border: 1px solid var(--glass-border);
  box-shadow: 0 10px 22px -16px rgba(0, 0, 0, 0.4);
}

/* Branch: connector arrow + row of product badges.
   Everything sits on ONE line — badges never wrap onto a second row —
   so the connector arrow always lines up with the vertical center of
   the badge circles, never the caption text underneath them. */
.ft-node__branch-wrap {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-width: 0;
}
.ft-node--right .ft-node__branch-wrap { grid-column: 3; grid-row: 1; justify-content: flex-start; }
.ft-node--left  .ft-node__branch-wrap { grid-column: 1; grid-row: 1; justify-content: flex-end; flex-direction: row-reverse; }

.ft-node__connector {
  position: relative;
  flex: 0 0 auto;
  align-self: flex-start;
  margin-top: 23px; /* centers on the 46px badge circle, ignoring the caption below it */
  width: clamp(14px, 2.4vw, 30px);
  height: 2px;
  background: var(--color-accent-strong);
  opacity: 0.7;
}
.ft-node--right .ft-node__connector::after,
.ft-node--left .ft-node__connector::after {
  content: '';
  position: absolute;
  top: 50%;
  width: 0;
  height: 0;
  border-top: 4px solid transparent;
  border-bottom: 4px solid transparent;
  transform: translateY(-50%);
}
.ft-node--right .ft-node__connector::after {
  right: -1px;
  border-left: 6px solid var(--color-accent-strong);
}
.ft-node--left .ft-node__connector::after {
  left: -1px;
  border-right: 6px solid var(--color-accent-strong);
}

.ft-node__branch {
  display: flex;
  align-items: flex-start;
  gap: 0.45rem;
  flex-wrap: nowrap;
  min-width: 0;
  flex: 1 1 auto;
  overflow-x: visible;
}
.ft-node--right .ft-node__branch { justify-content: flex-start; }
.ft-node--left .ft-node__branch { justify-content: flex-end; }

/* ---- Product badges ---------------------------------------------------- */
.ft-badge {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.5rem;
  width: 100px;
  flex-shrink: 0;
}
.ft-badge__img {
  width: 88px;
  height: 88px;
  border-radius: 50%;
  object-fit: cover;
  background: #ffffff;
  border: 2px solid rgba(var(--color-accent-rgb), 0.75);
  box-shadow: 0 0 0 4px rgba(var(--color-accent-rgb), 0.2),
              0 0 26px 5px rgba(var(--color-accent-rgb), 0.6),
              0 8px 18px -10px rgba(0, 0, 0, 0.6);
  filter: saturate(1.35) brightness(1.06) contrast(1.05);
  transition: transform var(--dur-fast) var(--ease-out),
              box-shadow var(--dur-fast) var(--ease-out);
}
.ft-badge--placeholder .ft-badge__mark {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 88px;
  height: 88px;
  border-radius: 50%;
  font-size: 0.68rem;
  font-weight: 700;
  text-align: center;
  line-height: 1.05;
  color: var(--color-accent-strong);
  border: 1.5px dashed var(--color-accent);
  background: rgba(var(--color-accent-rgb), 0.1);
  box-shadow: 0 0 12px 1px rgba(var(--color-accent-rgb), 0.3);
}
.ft-badge:hover .ft-badge__img {
  transform: translateY(-2px) scale(1.08);
  box-shadow: 0 0 0 4px rgba(var(--color-accent-rgb), 0.3),
              0 0 34px 7px rgba(var(--color-accent-rgb), 0.8),
              0 10px 20px -10px rgba(0, 0, 0, 0.6);
}

/* Caption sits on its own light chip so it stays legible against the
   dark theme instead of relying on low-contrast muted text. */
.ft-badge__caption {
  display: inline-block;
  width: 100%;
  font-size: 0.68rem;
  font-weight: 800;
  letter-spacing: 0.01em;
  text-align: center;
  line-height: 1.25;
  color: #1c2b46;
  background: #f8f3e9;
  border: 1.5px solid rgba(var(--color-accent-rgb), 0.45);
  border-radius: 8px;
  padding: 0.26rem 0.34rem;
  white-space: normal;
  word-break: normal;
  box-shadow: 0 3px 10px -4px rgba(0, 0, 0, 0.55);
}

/* ==========================================================================
   Responsive: below a comfortable branching width, collapse into a single
   stacked column — label, then its badges wrap beneath it — while keeping
   the same spine line down the left edge.
   ========================================================================== */
@media (max-width: 760px) {
  .ft-spine { --spine-x: 20px; }

  .ft-node {
    grid-template-columns: 1fr;
    row-gap: 0.7rem;
    padding: 14px 0 14px 0;
  }
  .ft-node__trunk,
  .ft-node--right .ft-node__branch-wrap,
  .ft-node--left .ft-node__branch-wrap {
    grid-column: 1;
    justify-content: flex-start;
  }
  .ft-node__trunk { padding-left: 40px; justify-content: flex-start; position: relative; }
  .ft-node__label { white-space: normal; }

  .ft-node--left .ft-node__branch-wrap,
  .ft-node--right .ft-node__branch-wrap {
    flex-direction: row;
    padding-left: 40px;
  }
  .ft-node--left .ft-node__branch,
  .ft-node--right .ft-node__branch {
    justify-content: flex-start;
  }
  .ft-node__connector {
    width: 20px;
    margin-top: 0;
    align-self: center;
    transform: rotate(90deg) translateX(0);
    transform-origin: left center;
    margin-right: 8px;
  }
  .ft-node--left .ft-node__connector::after { left: auto; right: -1px; border-right: none; border-left: 6px solid var(--color-accent-strong); }

  .ft-node__branch { flex-wrap: wrap; }

  .ft-spine__end {
    align-items: flex-start;
    padding-left: 40px;
  }
  .ft-spine__end-stub { margin-bottom: 0; }
}

@media (max-width: 420px) {
  .ft-badge { width: 90px; }
  .ft-badge__img, .ft-badge--placeholder .ft-badge__mark { width: 76px; height: 76px; }
}

@media (prefers-reduced-motion: reduce) {
  .ft-node { transition: none; }
  .ft-spine__line { transition: none; }
  .ft-spine__arrow { transition: none; animation: none; }
  .ft-spine__end { transition: none; }
  .ft-spine__buy { animation: none; }
  .ft-spine__buy::after { animation: none; }
}

/* ==========================================================================
   Contact page — two-column layout (company info | customer form)
   plus an animated "thanks for contacting us" confirmation.
   Uses the same CSS custom properties as the rest of the site
   (--color-*, --glass-*, --radius-*, --space-*).
   ========================================================================== */

.contact-grid-v2 {
  display: grid;
  grid-template-columns: minmax(260px, 0.85fr) minmax(320px, 1.15fr);
  gap: clamp(20px, 3vw, 40px);
  max-width: 1180px;
  margin: 0 auto;
  padding: 0 clamp(16px, 4vw, 32px);
  align-items: stretch;
}
/* Grievance page only: mirror the usual contact-page layout — form on
   the left, company details on the right. Also swap the width ratios so
   the form (now on the left) keeps the wider column it originally had. */
.grievance-page .contact-grid-v2 {
  grid-template-columns: minmax(320px, 1.15fr) minmax(260px, 0.85fr);
}
.grievance-page .contact-grid-v2 > .contact-info { order: 2; }
.grievance-page .contact-grid-v2 > .contact-form-wrap { order: 1; }

/* ---------- Left: company info ---------- */
.contact-info {
  display: flex;
  flex-direction: column;
  gap: 22px;
  padding: clamp(24px, 3vw, 34px);
  border-radius: var(--radius-lg);
  border: 1.5px solid var(--glass-border);
  background: var(--glass-bg);
  backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
}

.contact-info__heading {
  font-family: "Space Grotesk", sans-serif;
  font-size: 1.2rem;
  font-weight: 600;
  color: var(--color-ink);
  margin: 0 0 4px;
}

.contact-info__item {
  display: flex;
  align-items: flex-start;
  gap: 14px;
}

.contact-info__icon {
  flex-shrink: 0;
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--color-panel);
  border: 1.5px solid var(--glass-border);
  color: var(--color-accent);
}

.contact-info__icon svg {
  width: 20px;
  height: 20px;
}

.contact-info__item h3 {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--color-ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin: 0 0 4px;
}

.contact-info__item p {
  font-size: 0.95rem;
  color: var(--color-ink);
  margin: 0;
  line-height: 1.5;
}

.contact-info__note {
  margin-top: auto;
  padding-top: 16px;
  border-top: 1px solid var(--glass-border);
  font-size: 0.84rem;
  color: var(--color-ink-muted);
}

/* ---------- Right: customer form ---------- */
.contact-form-wrap {
  position: relative; /* anchor for the thanks overlay */
  padding: clamp(24px, 3vw, 34px);
  border-radius: var(--radius-lg);
  border: 1.5px solid var(--glass-border);
  background: var(--color-panel);
  overflow: hidden;
}

.contact-form-wrap .contact-form {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.field__input--textarea {
  resize: vertical;
  min-height: 96px;
  font-family: inherit;
}

/* ---------- Buy Now page: order-summary product logo ----------
   Deliberately NOT reusing .dl-card__logo's absolute positioning —
   here the badge must sit fully inside the order-summary card,
   centered at the top, instead of peeking outside the card edge. */
.buy-summary__logo {
  align-self: center;
  width: 190px;
  height: 190px;
  margin: 0 0 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: #ffffff;
  border: 1.5px solid var(--glass-border);
  box-shadow: 0 8px 20px -8px rgba(0, 0, 0, 0.45);
  overflow: hidden;
  flex-shrink: 0;
}

.buy-summary__logo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* ---------- Buy Now page: feature icons (Premium only) ---------- */
.buy-summary__features {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-3);
  width: 100%;
  margin-bottom: var(--space-4);
}
.buy-summary__feature {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  text-align: center;
}
.buy-summary__feature img { width: 44px; height: 44px; object-fit: contain; }
.buy-summary__feature span { font-size: 0.78rem; font-weight: 700; color: var(--color-ink); line-height: 1.25; }

/* ---------- Buy Now page: Qty + Price row ---------- */
.buy-price-field { display: flex; align-items: center; }
.buy-price-field .field__input {
  font-weight: 600;
  color: var(--color-accent);
  background: var(--field-bg);
}

/* ---------- Buy Now page: locked-product hint ---------- */
.field__hint.is-locked { color: var(--color-accent); }

/* ---------- Buy Now page: Order Confirmation modal ---------- */
.dl-modal.buy-confirm-modal {
  max-width: 900px;
}

.buy-confirm__body {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px 20px;
  margin-bottom: 22px;
}

.buy-confirm__row {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-start;
  gap: 4px;
  padding: 11px 12px;
  border: 1px solid var(--glass-border);
  border-bottom: 1px solid var(--glass-border);
  border-radius: 10px;
}

.buy-confirm__row:last-child { border-bottom: 1px solid var(--glass-border); }

.buy-confirm__row span {
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--color-ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  flex-shrink: 0;
}

.buy-confirm__row strong {
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--color-ink);
  text-align: left;
  word-break: break-word;
}

.buy-confirm__row--total strong {
  color: var(--color-accent);
  font-size: 1.05rem;
}

.buy-confirm__cta { width: 100%; }

@media (max-width: 720px) {
  .buy-confirm__body { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 480px) {
  .buy-confirm__body { grid-template-columns: 1fr; }
}

/* ---------- Payment page ---------- */
.pay-total {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  padding: 16px 18px;
  margin-bottom: 20px;
  border-radius: var(--radius-md);
  border: 1.5px solid var(--glass-border);
  background: rgba(var(--color-accent-rgb), 0.1);
}

.pay-total__label {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--color-ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.03em;
}

.pay-total__amount {
  font-family: "Space Grotesk", sans-serif;
  font-size: 1.5rem;
  font-weight: 700;
  color: var(--color-accent);
}

.pay-methods {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-bottom: 20px;
}

.pay-method {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding: 14px 16px 14px 44px;
  border-radius: var(--radius-md);
  border: 1.5px solid var(--glass-border);
  background: var(--glass-bg);
  cursor: pointer;
  transition: border-color 0.2s ease, background 0.2s ease;
}

.pay-method input[type="radio"] {
  position: absolute;
  left: 16px;
  top: 50%;
  transform: translateY(-50%);
  width: 17px;
  height: 17px;
  accent-color: var(--color-accent);
  cursor: pointer;
}

.pay-method:has(input:checked) {
  border-color: var(--color-accent);
  background: rgba(var(--color-accent-rgb), 0.08);
}

.pay-method__title {
  font-weight: 600;
  font-size: 0.95rem;
  color: var(--color-ink);
}

.pay-method__sub {
  font-size: 0.78rem;
  color: var(--color-ink-muted);
}

/* ---------- Thanks confirmation overlay ---------- */
.contact-thanks {
  position: absolute;
  inset: 0;
  z-index: 5;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: 10px;
  padding: 24px;
  background: var(--color-panel);
}

.contact-thanks[hidden] { display: none; }

/* Pop-in + settle animation for the whole confirmation panel */
.contact-thanks.is-visible {
  animation: contactThanksIn 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

.contact-thanks.is-closing {
  animation: contactThanksOut 0.2s ease forwards;
}

@keyframes contactThanksIn {
  0%   { opacity: 0; transform: scale(0.9) translateY(10px); }
  60%  { opacity: 1; transform: scale(1.03) translateY(0); }
  100% { opacity: 1; transform: scale(1) translateY(0); }
}

@keyframes contactThanksOut {
  from { opacity: 1; transform: scale(1); }
  to   { opacity: 0; transform: scale(0.95); }
}

.contact-thanks__close {
  position: absolute;
  top: 12px;
  right: 14px;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1.5px solid var(--glass-border);
  background: transparent;
  color: var(--color-ink-muted);
  font-size: 1.2rem;
  line-height: 1;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
}

.contact-thanks__close:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
  transform: rotate(90deg);
}

.contact-thanks__icon {
  width: 62px;
  height: 62px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  color: var(--color-on-accent);
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-strong));
  margin-bottom: 4px;
  animation: contactThanksPop 0.5s cubic-bezier(0.22, 1, 0.36, 1) 0.05s both;
}

@keyframes contactThanksPop {
  0%   { transform: scale(0); opacity: 0; }
  70%  { transform: scale(1.15); opacity: 1; }
  100% { transform: scale(1); }
}

.contact-thanks__icon svg {
  width: 30px;
  height: 30px;
}

.contact-thanks h3 {
  font-family: "Space Grotesk", sans-serif;
  font-size: 1.25rem;
  font-weight: 600;
  color: var(--color-ink);
  margin: 0;
}

.contact-thanks p {
  font-size: 0.92rem;
  color: var(--color-ink-muted);
  max-width: 320px;
  margin: 0;
  line-height: 1.5;
}

.contact-thanks .btn {
  margin-top: 10px;
}

/* ==========================================================================
   Responsive breakpoints
   ========================================================================== */

/* Tablets */
@media (max-width: 900px) {
  .contact-grid-v2 {
    grid-template-columns: 1fr;
  }

  .contact-info__note {
    margin-top: 4px;
    padding-top: 16px;
  }
}

/* Phones */
@media (max-width: 640px) {
  .contact-info,
  .contact-form-wrap {
    padding: 20px 18px 24px;
  }

  .contact-info__item {
    gap: 12px;
  }

  .contact-thanks__icon {
    width: 54px;
    height: 54px;
  }

  .contact-thanks h3 {
    font-size: 1.1rem;
  }
}

/* Very small phones */
@media (max-width: 360px) {
  .contact-info__heading {
    font-size: 1.08rem;
  }

  .contact-info__item h3 {
    font-size: 0.76rem;
  }

  .contact-info__item p {
    font-size: 0.88rem;
  }
}

/* ==========================================================================
   Downloads page — product boxes + 2-step download modal
   Relies on the CSS custom properties already defined in styles.css
   (--color-*, --glass-*, --radius-*, --space-*) so it follows the site's
   existing light/dark theme automatically.
   ========================================================================== */

/* ---------- Product grid ---------- */
.dl-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(18px, 2.4vw, 32px);
  max-width: 1180px;
  margin: 0 auto;
  padding: 0 clamp(16px, 4vw, 32px);
}

.dl-card {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding: clamp(24px, 3vw, 34px) clamp(18px, 2.4vw, 26px) 28px;
  margin-top: 12px;
  border-radius: var(--radius-lg);
  border: 1.5px solid var(--glass-border);
  background: var(--glass-bg);
  backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
  transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}

.dl-card:hover,
.dl-card:focus-within {
  transform: translateY(-6px);
  border-color: var(--color-accent);
  box-shadow: 0 18px 36px -18px rgba(var(--color-accent-rgb), 0.45);
}

.dl-card__logo {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translate(-50%, -14%);
  width: 170px;
  height: 170px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: #ffffff;
  border: 1.5px solid var(--glass-border);
  box-shadow: 0 8px 20px -8px rgba(0, 0, 0, 0.45);
  overflow: hidden;
  flex-shrink: 0;
  z-index: 2;
}

.dl-card__logo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.dl-card__name {
  font-family: "Space Grotesk", sans-serif;
  font-size: 2.15rem;
  font-weight: 900;
  color: var(--color-ink);
  margin: 142px 0 10px;
}

.dl-card__desc {
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--color-ink-muted);
  margin: 0 0 22px;
  min-height: 3.2em;
}

.dl-card__btn {
  width: 100%;
  max-width: 220px;
}

/* ---------- Modal overlay ---------- */
.dl-overlay {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background: rgba(5, 7, 11, 0.58);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}

.dl-overlay[hidden] { display: none; }

.dl-overlay.is-closing .dl-modal { animation: dlModalOut 0.18s ease forwards; }

.dl-modal {
  position: relative;
  width: 100%;
  max-width: 440px;
  max-height: 90vh;
  overflow-y: auto;
  padding: clamp(26px, 4vw, 36px);
  border-radius: var(--radius-lg);
  border: 1.5px solid var(--glass-border);
  background: var(--color-panel);
  box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.5);
  animation: dlModalIn 0.22s ease;
}

@keyframes dlModalIn {
  from { opacity: 0; transform: translateY(14px) scale(0.98); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes dlModalOut {
  from { opacity: 1; transform: translateY(0) scale(1); }
  to   { opacity: 0; transform: translateY(10px) scale(0.98); }
}

.dl-modal__close {
  position: absolute;
  top: 14px;
  right: 16px;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1.5px solid var(--glass-border);
  background: transparent;
  color: var(--color-ink-muted);
  font-size: 1.3rem;
  line-height: 1;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
}

.dl-modal__close:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
  transform: rotate(90deg);
}

.dl-modal__title {
  font-family: "Space Grotesk", sans-serif;
  font-size: 1.3rem;
  font-weight: 600;
  color: var(--color-ink);
  margin: 4px 0 20px;
}

#dlModalProduct,
#dlOptionsProduct { margin-bottom: 4px; }

/* ---------- Step 1: form ---------- */
.dl-form {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

/* ---------- Step 2: options ---------- */
.dl-modal__panel--options[hidden] { display: none; }

.dl-options {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.dl-option-btn {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 3px;
  width: 100%;
  padding: 14px 16px;
  border-radius: var(--radius-md);
  border: 1.5px solid var(--glass-border);
  background: var(--glass-bg);
  cursor: pointer;
  text-align: left;
  transition: border-color 0.2s ease, transform 0.2s ease, background 0.2s ease;
}

.dl-option-btn:hover,
.dl-option-btn:focus-visible {
  border-color: var(--color-accent);
  transform: translateX(4px);
  outline: none;
}

.dl-option-btn__title {
  font-weight: 600;
  font-size: 0.95rem;
  color: var(--color-ink);
}

.dl-option-btn__sub {
  font-size: 0.78rem;
  color: var(--color-ink-muted);
}

.dl-confirm {
  margin-top: 18px;
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--glass-border);
  background: rgba(var(--color-accent-rgb), 0.12);
  color: var(--color-ink);
  font-size: 0.88rem;
  text-align: center;
}

.dl-confirm[hidden] { display: none; }

/* ==========================================================================
   Responsive breakpoints
   ========================================================================== */

/* Tablets / small laptops */
@media (max-width: 1024px) {
  .dl-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Phones */
@media (max-width: 640px) {
  .dl-grid {
    grid-template-columns: 1fr;
    max-width: 420px;
  }

  .dl-card {
    padding: 22px 18px 24px;
  }

  .dl-modal {
    max-width: 100%;
    padding: 22px 18px 26px;
  }

  .dl-modal__title {
    font-size: 1.15rem;
  }
}

/* Very small phones */
@media (max-width: 360px) {
  .dl-card__logo {
    width: 128px;
    height: 128px;
  }

  .dl-card__name {
    font-size: 1.02rem;
  }
}

/* ==========================================================================
   Thank-you page (post-download confirmation + activation showcase)
   ========================================================================== */
.confetti-canvas {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 9999;
}

.thankyou-hero .page-hero__title {
  font-size: clamp(2.9rem, 6.4vw, 4.8rem);
  font-weight: 800;
}

.thankyou-hero .page-hero__subtitle {
  max-width: none;
  margin-top: 0.35rem;
  margin-left: auto;
  margin-right: auto;
  font-weight: 700;
  font-size: clamp(0.85rem, 1.6vw, 1.3rem);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

@media (max-width: 600px) {
  .thankyou-hero .page-hero__subtitle {
    white-space: normal;
  }
}

.thankyou-showcase-section {
  display: flex;
  flex-direction: column;
}

.thankyou-showcase {
  display: none;
  flex-direction: row;
  align-items: stretch;
  gap: var(--stack-card-pad, var(--space-5));
  width: 100%;
  max-width: 1680px;
  margin: 0 auto;
  height: clamp(480px, 68vh, 680px);
}

.thankyou-showcase.is-active {
  display: flex;
}

.thankyou-showcase__left {
  flex: 1 1 26%;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

/* .stack-card__title/__title1 are sized with vw-based clamp() tuned for
   sections where they span most of the viewport — but here they're
   confined to only ~26% of a flex row, so that same sizing regularly
   overflowed into the neighboring .feature-box at in-between desktop
   widths (below the point where things stack to a single column, but
   above where the column is roomy). Scoped, container-appropriate
   sizing + explicit wrapping guarantees it never escapes its column,
   at any screen size. */
.thankyou-showcase__left .stack-card__title,
.thankyou-showcase__left .stack-card__title1 {
  font-size: clamp(1.5rem, 2.6vw, 2.6rem);
  max-width: 100%;
  overflow-wrap: break-word;
  word-break: break-word;
}

.thankyou-showcase .feature-box {
  flex: 1 1 74%;
}

@media (max-width: 900px) {
  .thankyou-showcase {
    flex-direction: column;
    height: auto;
    min-height: 0;
  }
  .thankyou-showcase__left {
    align-items: center;
    text-align: center;
  }
  .thankyou-showcase .feature-box {
    min-height: 420px;
  }
}


/* ==========================================================================
   Entry Splash Gate (index.html) — shown before the actual home page.
   Two big clickable halves: Antivirus (enter site) / ButterBee (wait page).
   ========================================================================== */
html.splash-active,
html.splash-active body {
  overflow: hidden;
  height: 100%;
}

.splash-gate {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: flex;
  flex-direction: column;
  background: var(--color-bg, #181818);
  overflow: hidden;
}

.splash-gate__logo-row {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(12px, 2.2vh, 30px) 20px clamp(8px, 1.6vh, 18px);
}

.splash-gate__logo {
  width: clamp(140px, 16vw, 260px);
  height: auto;
  filter: drop-shadow(0 10px 26px rgba(0, 0, 0, 0.5));
}

.splash-gate__content {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  align-items: stretch;
  justify-content: center;
}

.splash-gate__half {
  flex: 1 1 50%;
  min-height: 0;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(10px, 1.8vh, 20px);
  cursor: pointer;
  overflow: hidden;
  padding: 10px 20px 20px;
  transition: background 0.3s ease;
}

.splash-gate__half--left {
  background: radial-gradient(circle at 50% 45%, rgba(var(--color-accent-rgb, 226, 135, 47), 0.16), transparent 65%);
  border-right: 1px solid var(--glass-border, rgba(255, 255, 255, 0.08));
}

.splash-gate__half--right {
  background: radial-gradient(circle at 50% 45%, rgba(255, 205, 60, 0.14), transparent 65%);
}

.splash-gate__half:hover,
.splash-gate__half:focus-visible {
  background-color: rgba(255, 255, 255, 0.04);
}

.splash-gate__half img {
  flex: 1 1 auto;
  min-height: 0;
  max-width: min(58vw, 520px);
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  filter: drop-shadow(0 18px 34px rgba(0, 0, 0, 0.5));
  transition: transform 0.3s ease;
}

/* ButterBee's artwork has extra empty space above its wordmark compared
   to the Antivirus mascot, which makes the "ButterBee" text sit higher
   than "Securashade Antivirus" text. Nudge it down so both wordmarks
   line up visually, and render it slightly smaller than Antivirus. */
.splash-gate__half--right img {
  margin-top: clamp(24px, 6vh, 64px);
  transform: scale(0.88);
}

.splash-gate__half:hover img,
.splash-gate__half:focus-visible img {
  transform: scale(1.05);
}
.splash-gate__half--right:hover img,
.splash-gate__half--right:focus-visible img {
  transform: scale(0.92);
}

.splash-gate__caption {
  flex: 0 0 auto;
  font-family: "Space Grotesk", var(--font-body);
  font-weight: 800;
  font-size: clamp(0.95rem, 1.8vw, 1.4rem);
  color: var(--color-ink, #eef2f7);
  letter-spacing: 0.02em;
  padding: clamp(8px, 1.4vh, 10px) 26px;
  border-radius: 999px;
  border: 1.5px solid var(--glass-border, rgba(255, 255, 255, 0.15));
  background: var(--glass-bg, rgba(255, 255, 255, 0.06));
}

@media (max-width: 760px) {
  .splash-gate__logo {
    width: clamp(120px, 34vw, 190px);
  }
  .splash-gate__content {
    flex-direction: column;
  }
  .splash-gate__half {
    min-height: 0;
    padding: 8px 20px 14px;
    gap: 8px;
  }
  .splash-gate__half--left {
    border-right: none;
    border-bottom: 1px solid var(--glass-border, rgba(255, 255, 255, 0.08));
  }
  .splash-gate__half img {
    max-width: 72vw;
  }
  .splash-gate__half--right img {
    margin-top: 12px;
  }
  .splash-gate__caption {
    font-size: 0.9rem;
    padding: 7px 20px;
  }
}

/* ==========================================================================
   ButterBee "getting ready" countdown page (pages/butterbee.html)
   ========================================================================== */
.butterbee-page {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: 28px;
  padding: 40px 20px;
  background: var(--color-bg);
}

.butterbee-page__img {
  width: clamp(180px, 30vw, 300px);
  height: auto;
  filter: drop-shadow(0 18px 34px rgba(0, 0, 0, 0.5));
}

.butterbee-page__message {
  font-family: var(--font-display);
  font-size: clamp(1.2rem, 2.4vw, 1.7rem);
  line-height: 1.6;
  color: var(--color-ink);
  white-space: pre-line;
  max-width: 560px;
}

.butterbee-page__signature {
  font-weight: 800;
  color: var(--color-accent);
}

.butterbee-page__counter {
  font-family: "Space Grotesk", var(--font-body);
  font-weight: 900;
  font-size: clamp(3.5rem, 10vw, 6.5rem);
  color: var(--color-accent);
  line-height: 1;
}

.butterbee-page__hint {
  font-size: 0.95rem;
  color: var(--color-ink-muted);
}

/* Buy Now CTA for AV Pro Basic now lives in its own section (see
   .ready-buy-cta--avpro below), matching the site's Ready to Buy pattern. */

/* Partner Login button relocated to footer, beside the Instagram icon (spec item 2) */
.social-links__partner-login {
  margin-left: var(--space-2);
  padding: 0.45rem 1rem;
  font-size: 0.85rem;
  white-space: nowrap;
}

/* Background artwork on Thank You / Buy Now pages — static Antivirus.png,
   dimmed with a theme-matched wash, same treatment as the downloads page
   (previously this swapped per-product logo; now it's one consistent
   background image regardless of which product is selected). */
body.buy-now-page,
body.thankyou-page {
  background-image:
    linear-gradient(rgba(var(--color-bg-rgb), 0.65), rgba(var(--color-bg-rgb), 0.65)),
    url("../assets/images/Antivirus.png");
  background-repeat: no-repeat, no-repeat;
  background-position: center top, center 30px;
  background-size: cover, min(560px, 70vw);
  background-attachment: fixed, fixed;
}
@media (max-width: 700px) {
  body.buy-now-page,
  body.thankyou-page {
    background-position: center top, center 10px;
    background-size: cover, min(320px, 80vw);
    background-attachment: fixed, scroll;
  }
}

/* Invalid-field state used by the Contact, Buy Now, and Download Free
   Trial form validators. */
.field__input.is-invalid {
  border-color: #e0473f;
  box-shadow: 0 0 0 3px rgba(224, 71, 63, 0.15);
}

/* Sits closer to the stack-card sequence above it than the standalone
   "Ready to Buy??" section further down the page does (spec: reduce the
   gap between the two sections). */
.ready-buy-cta--avpro {
  padding-top: var(--space-3);
  padding-bottom: var(--space-3);
}

/* "Your system, your rule..." — centered heading above a 4-corner
   feature showcase with a centered dashboard image, styled after a
   supplied reference layout. */
.ready-buy-cta--showcase {
  flex-direction: column;
  text-align: center;
  padding-top: var(--space-4);
  padding-bottom: var(--space-4);
}
.ready-buy-trigger__text--centered { white-space: normal; text-transform: uppercase; }
.ready-buy-trigger__word--orange,
.ready-buy-trigger__word--blue {
  background: none;
  -webkit-background-clip: initial;
  background-clip: initial;
}
.ready-buy-trigger__word--orange { color: var(--color-accent); }
.ready-buy-trigger__word--blue { color: #1f5490; }

.premium-showcase {
  --ps-gap: clamp(10px, 2vw, 28px);
  position: relative;
  width: 100%;
  max-width: 1360px;
  margin: var(--space-4) auto 0;
  display: grid;
  grid-template-columns: 1fr minmax(280px, 680px) 1fr;
  grid-template-areas: "tl center tr" "bl center br";
  align-items: center;
  gap: var(--space-3) var(--ps-gap);
}
.premium-showcase__callout {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
  padding: calc(var(--space-3) + 18px) var(--space-3) var(--space-3);
  border-radius: var(--radius-md);
  border: 1.5px solid var(--glass-border);
  background: var(--glass-bg);
  box-shadow: 0 14px 34px -18px rgba(0, 0, 0, 0.5);
  position: relative;
  max-width: 260px;
  transition: transform var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}
.premium-showcase__callout:hover {
  transform: translateY(-3px);
  border-color: var(--color-accent);
}
.premium-showcase__callout--tl { grid-area: tl; justify-self: end; }
.premium-showcase__callout--bl { grid-area: bl; justify-self: end; }
.premium-showcase__callout--tr { grid-area: tr; justify-self: start; }
.premium-showcase__callout--br { grid-area: br; justify-self: start; }

/* Dashed connector reaching all the way from the callout to the edge
   of the laptop image itself — spans the full grid gap PLUS the
   center column's own inner padding, rather than stopping short at
   the column boundary. */
.premium-showcase__callout::before {
  content: '';
  position: absolute;
  top: 50%;
  width: calc(var(--ps-gap) + 60px);
  height: 0;
  border-top: 2px dashed var(--color-accent);
  z-index: 1;
}
.premium-showcase__callout--tl::before,
.premium-showcase__callout--bl::before { right: calc((var(--ps-gap) + 60px) * -1); }
.premium-showcase__callout--tr::before,
.premium-showcase__callout--br::before { left: calc((var(--ps-gap) + 60px) * -1); }
/* Small dot at the origin end of each connector, matching the
   reference layout's callout-to-product dashed connectors. */
.premium-showcase__callout::after {
  content: '';
  position: absolute;
  top: 50%;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--color-accent);
  transform: translateY(-50%);
  z-index: 1;
}
.premium-showcase__callout--tl::after,
.premium-showcase__callout--bl::after { right: -3.5px; }
.premium-showcase__callout--tr::after,
.premium-showcase__callout--br::after { left: -3.5px; }

/* Icon sits as a badge straddling the callout's top edge — half above
   the box, half inside it — same 50/50 overlap treatment used for the
   "Know About Us" badge on the About page. */
.premium-showcase__icon {
  position: absolute;
  top: 0;
  left: var(--space-3);
  transform: translateY(-50%);
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--color-panel, var(--color-bg));
  box-shadow: 0 8px 20px -8px rgba(0, 0, 0, 0.4);
  z-index: 1;
}
.premium-showcase__icon img { width: 100%; height: 100%; object-fit: contain; border-radius: 50%; }
.premium-showcase__copy h3 {
  margin: 0 0 4px;
  font-size: 1.15rem;
  font-weight: 800;
  line-height: 1.15;
}
.premium-showcase__copy p { margin: 0; font-size: 0.82rem; color: var(--color-ink-muted); line-height: 1.35; }

.premium-showcase__center {
  grid-area: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-2);
  padding: 0;
  width: 100%;
}
/* Headline block above the laptop image. The product name (eyebrow)
   is the star here — big and bold, like a product logotype — with the
   tagline underneath it in a smaller, lighter weight. */
.premium-showcase__eyebrow {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(1.7rem, 3.4vw, 2.5rem);
  font-weight: 900;
  letter-spacing: 0.01em;
  line-height: 1.15;
  color: var(--color-ink);
}
.premium-showcase__eyebrow span { color: var(--color-accent); font-weight: 900; }
.premium-showcase__headline {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1.8vw, 1.35rem);
  font-weight: 700;
  line-height: 1.2;
  color: var(--color-ink-muted);
  text-align: center;
}
.premium-showcase__headline span { color: var(--color-accent); font-weight: 800; }
.premium-showcase__center img { width: 100%; max-width: 680px; height: auto; display: block; }
.premium-showcase__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-3); }
.premium-showcase__buy,
.premium-showcase__trial {
  padding: 0.75rem 1.8rem;
  font-size: 0.95rem;
  font-weight: 700;
}
.premium-showcase__trial:hover { color: var(--color-accent); border-color: var(--color-accent); }

@media (max-width: 980px) {
  .premium-showcase {
    grid-template-columns: 1fr;
    grid-template-areas: "center" "tl" "tr" "bl" "br";
  }
  .premium-showcase__callout { justify-self: center !important; text-align: left; max-width: 420px; width: 100%; }
  .premium-showcase__callout::before { display: none; }
}

/* ==========================================================================
   Admin-Panel-driven site-wide features — styles
   1. Promo popup banner   2. Visitor counter bar   3. Phone-style gallery
   ========================================================================== */

/* ---- 1. Promo banner popup ---- */
.ss-promo-overlay {
  position: fixed; inset: 0; z-index: 9999;
  background: rgba(0, 0, 0, 0.72);
  display: flex; align-items: center; justify-content: center;
  padding: var(--space-3);
  animation: ssFadeIn 220ms var(--ease-out);
}
.ss-promo-modal {
  position: relative; max-width: min(92vw, 560px); max-height: 88vh;
  border-radius: var(--radius-lg); overflow: hidden;
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
  background: var(--color-panel);
}
.ss-promo-modal img { display: block; width: 100%; height: auto; max-height: 88vh; object-fit: contain; }
.ss-promo-close {
  position: absolute; top: 10px; right: 10px; z-index: 2;
  width: 34px; height: 34px; border-radius: 50%; border: none;
  background: rgba(0, 0, 0, 0.6); color: #fff; font-size: 1.4rem; line-height: 1;
  cursor: pointer; display: flex; align-items: center; justify-content: center;
}
.ss-promo-close:hover { background: rgba(0, 0, 0, 0.85); }
@keyframes ssFadeIn { from { opacity: 0; } to { opacity: 1; } }

/* ---- 2. Visitor counter ---- */
/* Preferred placement: inline inside .site-footer__bottom, alongside the
   copyright line (this is what renders when that footer element exists). */
.site-footer__bottom--with-counter {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px 20px;
}
.ss-visitor-counter {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--color-ink-muted);
  white-space: nowrap;
}
.ss-visitor-counter strong { color: var(--color-accent); font-weight: 700; }
.ss-visitor-counter__divider { opacity: 0.5; }

/* Fallback: fixed bar at the bottom of the viewport, only used on pages
   that don't have the standard .site-footer__bottom element. */
.ss-visitor-counter-bar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 500;
  display: flex; align-items: center; justify-content: center;
  padding: 8px 14px; background: var(--color-header-bar); color: #fff;
}
.ss-visitor-counter-bar .ss-visitor-counter { color: #fff; }

@media (max-width: 560px) {
  .ss-visitor-counter { font-size: 0.7rem; gap: 6px; }
  .site-footer__bottom--with-counter { justify-content: center; text-align: center; }
}

/* ---- 3. Phone-style media gallery ---- */
.phone-gallery__group { margin-bottom: var(--space-4); }
.phone-gallery__month {
  font-size: 1rem; font-weight: 700; margin: 0 0 12px; color: var(--color-ink-muted);
  text-transform: uppercase; letter-spacing: 0.04em;
}
.phone-gallery__grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
  gap: 6px;
}
.phone-gallery__thumb {
  padding: 0; border: none; border-radius: var(--radius-sm); overflow: hidden;
  cursor: pointer; aspect-ratio: 1 / 1; background: var(--color-panel);
}
.phone-gallery__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform var(--dur-fast) var(--ease-out); }
.phone-gallery__thumb:hover img { transform: scale(1.06); }

.ss-lightbox {
  position: fixed; inset: 0; z-index: 9998; background: rgba(0, 0, 0, 0.92);
  display: none; align-items: center; justify-content: center; flex-direction: column;
  padding: var(--space-3);
}
.ss-lightbox.is-open { display: flex; }
.ss-lightbox__image { max-width: 90vw; max-height: 78vh; object-fit: contain; border-radius: var(--radius-sm); }
.ss-lightbox__caption { color: #fff; margin-top: 12px; font-size: 0.9rem; text-align: center; }
.ss-lightbox__close {
  position: absolute; top: 16px; right: 20px; background: none; border: none;
  color: #fff; font-size: 2rem; line-height: 1; cursor: pointer;
}
.ss-lightbox__arrow {
  position: absolute; top: 50%; transform: translateY(-50%);
  background: rgba(255, 255, 255, 0.12); border: none; color: #fff;
  width: 44px; height: 44px; border-radius: 50%; font-size: 1.6rem; cursor: pointer;
}
.ss-lightbox__arrow:hover { background: rgba(255, 255, 255, 0.24); }
.ss-lightbox__arrow--prev { left: 16px; }
.ss-lightbox__arrow--next { right: 16px; }
@media (max-width: 560px) {
  .ss-lightbox__arrow { width: 36px; height: 36px; font-size: 1.3rem; }
}
