/* ============================================================
   Dealer Payments: "Night showroom meets fintech precision"
   Design system + cinematic sections. Tokens per docs/BRAND-KIT.md.
   ============================================================ */

/* ---------- 1. TOKENS ---------- */
:root {
  /* Brand core */
  --navy:#10172A; --carmine:#B2363F; --orange:#FF8C23; --white:#FFFFFF;
  --gradient-brand:linear-gradient(90deg,#B2363F 0%,#FF8C23 100%);

  /* Dark UI surfaces (derived tints of brand navy) */
  --bg-primary:#0B0F1A; --bg-surface:#0B0F1A; --bg-elevated:#0B0F1A;

  /* Text ramp */
  --text-primary:#F0F2F5; --text-secondary:#A0AEC0; --text-muted:#718096; --text-inverse:#10172A;

  /* Borders */
  --border-color:rgba(255,255,255,0.08); --border-subtle:rgba(255,255,255,0.04);

  /* Semantic */
  --success:#10B981; --warning:#FFB020; --error:#E5484D;

  /* Type */
  --font-sans:"Poppins",system-ui,sans-serif;
  --tabular:"tnum" 1;
  --text-display:clamp(2.75rem,1rem + 7vw,6rem);
  --text-h1:clamp(2.25rem,1rem + 5vw,4rem);
  --text-h2:clamp(2rem,1.2rem + 3vw,3.25rem);
  --text-h3:clamp(1.5rem,1rem + 1.5vw,2rem);
  --text-h4:clamp(1.25rem,1rem + 0.6vw,1.5rem);
  --text-body:clamp(1rem,0.92rem + 0.4vw,1.125rem);
  --tracking-tight:-0.02em; --tracking-wide:0.04em;

  /* Spacing */
  --space-4:16px; --space-5:24px; --space-6:32px; --space-8:48px; --space-9:64px;
  --space-section:clamp(4.5rem,3rem + 6vw,9rem);
  --container-max:1200px; --gutter:24px;

  /* Radii */
  --radius-sm:6px; --radius-md:10px; --radius-lg:16px; --radius-card:14px; --radius-pill:999px;

  /* Elevation */
  --shadow-sm:0 1px 2px rgba(0,0,0,0.40);
  --shadow-md:0 8px 24px rgba(0,0,0,0.45);
  --shadow-lg:0 24px 64px rgba(0,0,0,0.55);

  /* Glass */
  --glass-bg:rgba(11,15,26,0.60); --glass-blur:16px; --glass-border:rgba(255,255,255,0.08);

  /* Motion */
  --dur-fast:150ms; --dur-normal:320ms; --dur-slow:600ms; --stagger:80ms;
  --ease-out-expo:cubic-bezier(0.16,1,0.3,1);
  --ease-in-out:cubic-bezier(0.65,0,0.35,1);
  --ease-overshoot:cubic-bezier(0.34,1.56,0.64,1);

  /* Focus */
  --focus-ring:0 0 0 2px var(--bg-primary),0 0 0 4px var(--orange);
}

/* ---------- 2. BASE ---------- */
/* Section snapping is JS-driven (pageStepper() in main.js): scroll within a section, then any flick
   past its edge drags you hard to the next. scroll-padding keeps anchor jumps clear of the navbar. */
html{background:var(--bg-primary);scroll-padding-top:72px}
body{background:transparent}
h1,h2,h3,h4,h5{line-height:1.1;letter-spacing:var(--tracking-tight);font-weight:700}
h2{font-size:var(--text-h2)} h3{font-size:var(--text-h3)} h4{font-size:var(--text-h4);font-weight:600}
p{color:var(--text-secondary)}
strong{color:var(--text-primary);font-weight:600}
::selection{background:var(--orange);color:var(--text-inverse)}
:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:var(--radius-sm)}
.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}

.container{max-width:var(--container-max);margin:0 auto;padding:0 var(--gutter)}
.container--narrow{max-width:820px}

.grad-text{background:var(--gradient-brand);-webkit-background-clip:text;background-clip:text;color:transparent}
.wordmark{font-weight:700;letter-spacing:-0.01em}
.wordmark em{font-style:italic;font-weight:600}

/* Film grain: subtle film over dark fields to kill banding (pointer-events:none) */
.grain{
  position:fixed;inset:0;z-index:60;pointer-events:none;opacity:0.045;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:140px 140px;
}

/* Glass surface recipe */
.glass{
  background:var(--glass-bg);
  -webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));
  border:1px solid var(--glass-border);
}

/* Concentric-arc brand motif, bleeding from a corner */
.corner-arcs{position:absolute;width:min(46vw,520px);height:min(46vw,520px);color:var(--orange);opacity:0.06;pointer-events:none}
.corner-arcs--tr{top:-40px;right:-60px}

/* Section rhythm — all content sections share the brand-kit surface */
.section{position:relative;padding:var(--space-section) 0;overflow:hidden;background:var(--bg-surface)}
.section-header{position:relative;isolation:isolate;max-width:760px;margin:0 auto var(--space-8);text-align:center;--hp:0}
.section-header h2{margin-bottom:var(--space-4)}
.section-header p{font-size:var(--text-body);max-width:60ch;margin:0 auto}
/* Header parallax: eyebrow / headline / subcopy drift at different rates as the section crosses the
   viewport. --hp (-0.5 at the bottom edge .. +0.5 at the top) is set by headerParallax() in main.js.
   Compositor-only transforms; the headline glow lives on h2::before and rides the h2 transform. */
.section-header .eyebrow{transform:translateY(calc(var(--hp) * -56px))}
.section-header h2{transform:translateY(calc(var(--hp) * -30px))}
.section-header p{transform:translateY(calc(var(--hp) * -14px))}

/* Illuminated header — the headline sits under a warm overhead showroom light + gives off a
   gentle warm halo. STATIC, never pulses (site motion rule: nothing self-animates but the hero
   bob). NOT a bordered chip/badge — just light. The glow pool is anchored to and centered on the
   H2 (not .section-header — there its bright center drifted onto the short eyebrow, e.g. FAQ).
   h2's parallax transform already makes it the containing block + stacking context, so the pool
   rides the headline and its z-index:-1 stays above the #0B0F1A section bg but behind the text.
   Pain-points recolors the light to carmine so the danger tone holds (a warm-orange invitation
   would read wrong on a "You're Losing Money" headline). */
.section-header h2{text-shadow:0 0 26px rgba(255,140,35,0.20),0 0 64px rgba(255,140,35,0.09)}
.section-header h2::before{content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  z-index:-1;pointer-events:none;width:min(880px,94vw);height:clamp(240px,300%,360px);
  background:radial-gradient(60% 62% at 50% 50%,rgba(255,140,35,0.17),rgba(178,54,63,0.05) 50%,transparent 74%)}
/* Header keyword highlight — "top-lit metal": a gold highlight at the TOP of the glyphs warming
   down to carmine, as if the overhead showroom light is hitting the word, + a soft warm glow.
   SCOPED to header h2s so the global .grad-text (hero, pband, flow spine, seal) is untouched;
   overriding only background-image keeps the base rule's background-clip:text + transparent fill
   (do NOT use the `background` shorthand here — it would reset background-clip back to border-box
   and the gradient would paint as a solid block instead of clipping to the text). */
.section-header h2 .grad-text{
  background-image:linear-gradient(152deg,#FFCE8C 0%,#FF9A3D 38%,#B2363F 100%);
  filter:drop-shadow(0 1px 12px rgba(255,140,35,0.28))}
#pain-points .section-header h2::before{
  background:radial-gradient(60% 62% at 50% 50%,rgba(178,54,63,0.19),rgba(178,54,63,0.06) 52%,transparent 74%)}
#pain-points .section-header h2{text-shadow:0 0 26px rgba(178,54,63,0.20),0 0 64px rgba(178,54,63,0.09)}

.eyebrow{display:inline-block;font-size:0.75rem;font-weight:600;letter-spacing:var(--tracking-wide);
  text-transform:uppercase;color:var(--orange);margin-bottom:var(--space-4)}
.eyebrow--danger{color:var(--carmine)}

/* Inline links inside body copy (subpage prose, FAQ answers) must read as links —
   the global a{color:inherit} otherwise makes them invisible in a paragraph */
.section p a{color:var(--orange)}
.section p a:hover{text-decoration:underline}

/* Deep-page handoff link that closes a homepage beat ("See the full …") — Wave 1 cutover */
.section-more{display:flex;justify-content:center;margin-top:var(--space-6)}
.section-more a{display:inline-flex;align-items:center;gap:8px;color:var(--orange);font-weight:600;font-size:0.98rem}
.section-more a svg{width:16px;height:16px;transition:transform var(--dur-fast) ease}
.section-more a:hover svg{transform:translateX(4px)}

/* ---------- 3. BUTTONS ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-family:inherit;
  font-weight:600;letter-spacing:0.01em;border-radius:var(--radius-md);cursor:pointer;border:1px solid transparent;
  transition:transform var(--dur-fast) ease,background var(--dur-fast) ease,border-color var(--dur-fast) ease,box-shadow var(--dur-fast) ease;
  padding:12px 24px;font-size:var(--text-body)}
.btn-sm{padding:8px 16px;font-size:0.875rem}
.btn-lg{padding:16px 32px;font-size:1.0625rem}
/* Glow effect ported from 21st.dev @wisedev "Glow Button", recolored to the brand orange.
   Click sets [data-state=clicked] from main.js for 200ms -> soft press + brighter glow. */
.btn-primary{--btn-glow-base:#D96A0F;--btn-glow-hi:#FFCE8C;color:var(--text-inverse);
  background-image:linear-gradient(325deg,var(--btn-glow-base) 0%,var(--btn-glow-base) 44%,
    var(--btn-glow-hi) 50%,var(--btn-glow-base) 56%,var(--btn-glow-base) 100%);
  background-size:400%;background-position:0% 0;transition:all 0.8s;transform:scale(1);
  box-shadow:0 0 20px rgba(255,140,35,0.5),0 5px 5px -1px rgba(224,110,20,0.25),
    inset 4px 4px 8px rgba(255,220,175,0.5),inset -4px -4px 8px rgba(181,78,8,0.35)}
/* Ambient "Book a Demo" gleam (user-required): the page-content conversion CTAs — all
   .btn-lg — carry a continuous, unhurried light sweep to keep the primary CTA drawing the
   eye. Deliberate exception to the old "CTAs stay steady" rule, scoped to .btn-lg so the
   nav's .btn-sm CTA is untouched and stays steady. Declared BEFORE the :hover rule (equal
   specificity) so hover still wins with its one-shot sweep; the one-time .glare rules
   (calc nudge / value-result) are higher specificity and override while active. The global
   prefers-reduced-motion reset clamps iteration-count to 1, so this self-disables there. */
.btn-primary.btn-lg{animation:btnShine 3.6s ease-in-out infinite}
@media (hover:hover){
  .btn-primary:hover{animation:btnGlare 1.2s ease-in-out 1}
}
/* One-way downward sweep (100% -> 0%): the resting position (0% 0) matches both keyframe
   ends, so the pass starts and finishes flat with no seam. The gradient is diagonal, so
   the face sees a wider slice of it than the horizontal window alone (corners project
   onto the gradient axis) — the 400% size + narrow streak (44-56%) keep the face flat. */
@keyframes btnGlare{0%{background-position:100% 0}70%{background-position:0% 0}100%{background-position:0% 0}}
/* Ambient loop: a quick gleam (streak sweeps 100%->0% over the first ~24%) then a long rest
   at 0% 0 = the flat resting position, so every cycle starts and ends seamless — reads as a
   periodic shine, not a strobe. Same one-way sweep + flat endpoints as btnGlare. */
@keyframes btnShine{0%{background-position:100% 0}24%{background-position:0% 0}100%{background-position:0% 0}}
.btn-primary[data-state=clicked]{transform:scale(0.95);
  box-shadow:0 0 30px rgba(255,140,35,0.8),0 5px 5px -1px rgba(224,110,20,0.4),
    inset 4px 4px 12px rgba(255,220,175,0.7),inset -4px -4px 12px rgba(181,78,8,0.5)}
.btn-primary:focus-visible{outline:2px solid rgba(255,140,35,0.6);outline-offset:2px}
.btn-primary:focus:not(:focus-visible){outline:none}
.btn-secondary{background:transparent;border-color:var(--border-color);color:var(--text-primary)}
.btn-secondary:hover{border-color:var(--orange);background:rgba(255,140,35,0.08)}
.btn-secondary:active{transform:scale(0.98)}

/* ---------- 4. NAVBAR ---------- */
.navbar{position:fixed;top:0;left:0;right:0;z-index:var(--z-nav,100);height:72px;display:flex;align-items:center;
  transition:background var(--dur-normal) ease,border-color var(--dur-normal) ease,backdrop-filter var(--dur-normal) ease}
.navbar.scrolled{background:var(--glass-bg);-webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));
  border-bottom:1px solid var(--border-color)}
.nav-inner{display:flex;align-items:center;justify-content:space-between;width:100%}
.nav-logo{display:flex;align-items:center;gap:10px;font-size:1.15rem}
.brand-mark{width:30px;height:30px;flex:none}
.nav-links{display:flex;gap:30px}
.nav-links a{color:var(--text-secondary);font-size:0.95rem;font-weight:500;transition:color var(--dur-fast) ease;position:relative}
.nav-links a:hover{color:var(--text-primary)}
.nav-links a::after{content:"";position:absolute;left:0;right:100%;bottom:-6px;height:2px;background:var(--orange);
  transition:right var(--dur-normal) var(--ease-out-expo)}
.nav-links a:hover::after{right:0}
/* current-page marker (subpages set aria-current="page" on their own nav link) */
.nav-links > a[aria-current="page"]{color:var(--text-primary)}
.nav-links > a[aria-current="page"]::after{right:0}
.mobile-toggle{display:none;flex-direction:column;gap:5px;background:none;border:none;cursor:pointer;padding:8px}
.mobile-toggle span{width:24px;height:2px;background:var(--text-primary);border-radius:2px;transition:transform var(--dur-fast) ease,opacity var(--dur-fast) ease}
.mobile-toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.mobile-toggle[aria-expanded="true"] span:nth-child(2){opacity:0}
.mobile-toggle[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

/* Solutions dropdown (Wave 1 cutover). Desktop: opens on hover (hover:hover only), on
   keyboard focus (:focus-within), and on click (.open set by navDropdown() in main.js,
   which also mirrors aria-expanded). ≤768px it flattens into the mobile panel — the
   "Solutions" button hides and the four links render inline with the other nav links.
   visibility (not display) keeps the open/close transition; the ::before strip bridges
   the hover gap between the button and the floating panel so the menu doesn't close
   while the pointer crosses it. */
.nav-drop{position:relative;display:flex;align-items:center}
.nav-drop-btn{display:inline-flex;align-items:center;gap:6px;background:none;border:none;cursor:pointer;padding:0;
  font-family:inherit;font-size:0.95rem;font-weight:500;color:var(--text-secondary);
  transition:color var(--dur-fast) ease}
.nav-drop-btn:hover,.nav-drop.open .nav-drop-btn{color:var(--text-primary)}
.nav-drop-chev{width:14px;height:14px;transition:transform var(--dur-normal) var(--ease-out-expo)}
.nav-drop.open .nav-drop-chev{transform:rotate(180deg)}
.nav-drop-menu{position:absolute;top:calc(100% + 18px);left:-14px;min-width:220px;display:grid;gap:2px;
  padding:10px;border-radius:var(--radius-md);border:1px solid var(--border-color);
  background:var(--glass-bg);-webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));
  box-shadow:var(--shadow-md);
  opacity:0;visibility:hidden;transform:translateY(-6px);
  transition:opacity var(--dur-fast) ease,transform var(--dur-fast) ease,visibility 0s linear var(--dur-fast)}
.nav-drop-menu::before{content:"";position:absolute;left:0;right:0;top:-18px;height:18px}
/* NO :focus-within auto-open here — the clicked button keeps focus, which would pin the
   panel open after Escape/toggle-close. Keyboard flow is .open-driven: Enter/Space on the
   button toggles it (JS), Tab walks the links while .open holds the panel visible, and
   navDropdown() closes on Escape/outside-click/focusout. */
.nav-drop.open .nav-drop-menu{opacity:1;visibility:visible;transform:none;transition-delay:0s}
@media (hover:hover){
  .nav-drop:hover .nav-drop-menu{opacity:1;visibility:visible;transform:none;transition-delay:0s}
  .nav-drop:hover .nav-drop-chev{transform:rotate(180deg)}
}
.nav-drop-menu a{display:block;padding:9px 12px;border-radius:var(--radius-sm);
  font-size:0.92rem;font-weight:500;color:var(--text-secondary);
  transition:color var(--dur-fast) ease,background var(--dur-fast) ease}
.nav-drop-menu a::after{content:none} /* no sliding underline inside the panel */
.nav-drop-menu a:hover{color:var(--text-primary);background:rgba(255,140,35,0.08)}
/* current-page marker inside the dropdown (solution pages set aria-current="page") */
.nav-drop-menu a[aria-current="page"]{color:var(--text-primary);background:rgba(255,140,35,0.08)}

/* ---------- 5. HERO ---------- */
.hero{position:relative;padding:calc(72px + var(--space-9)) 0 var(--space-8);isolation:isolate;overflow:hidden}
.hero-glow{position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:radial-gradient(620px circle at var(--mx,72%) var(--my,38%),rgba(255,140,35,0.16),transparent 62%),
             radial-gradient(900px circle at 50% -10%,rgba(178,54,63,0.10),transparent 60%)}
.hero-grid{display:grid;grid-template-columns:1.05fr 0.95fr;gap:var(--space-8);align-items:center;min-height:min(72vh,620px)}
.hero-copy{max-width:600px}
.hero-title{font-size:var(--text-h1);margin-bottom:var(--space-5)}
.hero-sub{font-size:var(--text-body);max-width:52ch;margin-bottom:var(--space-6)}
.hero-buttons{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:var(--space-5)}
/* Trust strip (D5 numbers): scale proof right under the CTA pair, above the compliance chips */
.hero-cred{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin-bottom:var(--space-6);
  font-size:0.92rem;color:var(--text-muted)}
.hero-cred strong{color:var(--text-primary);font-weight:700}
.hero-cred-sep{width:4px;height:4px;border-radius:50%;background:var(--text-muted);opacity:0.6}
.trust-bar{display:flex;flex-wrap:wrap;gap:20px 28px}
.trust-item{display:flex;align-items:center;gap:9px;font-size:0.9rem;color:var(--text-secondary);font-weight:500}
.trust-icon{display:grid;place-items:center;width:30px;height:30px;border-radius:8px;background:rgba(255,140,35,0.1);color:var(--orange)}
.trust-icon svg{width:17px;height:17px}

/* Hero showroom stage */
.hero-stage{position:relative;height:100%;min-height:360px;display:grid;place-items:center}
/* Hero credit card: black pebbled-leather material, floating, cursor-reactive 3D tilt */
.hero-card-scene{position:relative;width:min(100%,420px);aspect-ratio:1.586/1;perspective:1100px;z-index:1}
.hero-card-float{position:relative;width:100%;height:100%;transform-style:preserve-3d;animation:cardBob 6s ease-in-out infinite}
.hero-card{--tiltX:8deg;--tiltY:-18deg;position:relative;width:100%;height:100%;border-radius:18px;overflow:hidden;
  transform-style:preserve-3d;transform:rotateX(var(--tiltX)) rotateY(var(--tiltY));transition:transform .3s var(--ease-out-expo);
  box-shadow:0 34px 64px rgba(0,0,0,0.55),0 0 0 1px rgba(255,140,35,0.20),inset 0 1px 0 rgba(255,170,90,0.18)}
/* Black pebbled leather, fully procedural (no WebGL, no assets): near-black base + an SVG
   feTurbulence->feDiffuseLighting grain tile (lit bumps = pebbles) blended soft-light so the
   texture reads as material, not noise. stitchTiles keeps the tile seamless. */
.hero-card-leather{position:absolute;inset:0;border-radius:18px;overflow:hidden;
  background:radial-gradient(120% 100% at 28% 0%,rgba(255,178,102,0.07),transparent 55%),
    linear-gradient(160deg,#17161a 0%,#0e0d11 55%,#09080b 100%)}
.hero-card-leather::before{content:"";position:absolute;inset:0;opacity:0.5;mix-blend-mode:soft-light;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='260' height='260'%3E%3Cfilter id='p'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.55' numOctaves='4' seed='11' stitchTiles='stitch'/%3E%3CfeDiffuseLighting lighting-color='%23ffffff' surfaceScale='1.7' diffuseConstant='1.1'%3E%3CfeDistantLight azimuth='235' elevation='55'/%3E%3C/feDiffuseLighting%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23p)'/%3E%3C/svg%3E");
  background-size:260px 260px}
/* Cursor-driven orange sheen: a warm light pool raking the grain, its position fed by the same
   pointer math as the tilt (--shx/--shy, unitless 0..1 set on #heroCard by main.js; rest pose =
   upper right). Lives on the leather's ::after with screen blend so the glow genuinely catches
   the pebble highlights beneath it (the leather element creates no stacking context, so the
   blend reaches the texture; putting this on .hero-card-sheen would isolate + screen away its
   own dark vignette). */
/* Sheen shares the foreground bloom's card-local center (--cgx/--cgy) and intensity (--cg-op) so
   both lights sit exactly under the cursor and rise/fall together. Card-local (not the old
   hero-relative 18%+shx*64% mapping, which put the pool in the card's MIDDLE when the cursor was at
   an edge). --cg-op is a proximity ramp set by heroPointer(): full over the card, fading out just
   outside it, so the card is caught in the cursor's glow as you approach and there's no permanent
   rest pool. Coords are unclamped, so when the cursor is just OUTSIDE, the center sits off-card and
   only the near edge catches the radial's tail. */
.hero-card-leather::after{content:"";position:absolute;inset:0;mix-blend-mode:screen;
  opacity:var(--cg-op,0);
  background:radial-gradient(70% 95% at calc(var(--cgx,0.5) * 100%) calc(var(--cgy,0.5) * 100%),
    rgba(255,140,35,0.15),rgba(255,120,30,0.05) 45%,transparent 72%);
  transition:opacity .25s var(--ease-out-expo)}
/* The usual 115deg vignette keeps the lower-right falloff so the black card has form */
.hero-card-sheen{position:absolute;inset:0;border-radius:18px;pointer-events:none;z-index:2;
  background:linear-gradient(115deg,rgba(255,255,255,0.05) 0%,transparent 28%,transparent 60%,rgba(0,0,0,0.40) 100%)}
.hero-card-face{position:absolute;inset:0;z-index:3;color:var(--white)}
/* Cursor-following FOREGROUND light. Unlike .hero-card-leather::after (the sheen, blended UNDER
   the printing), this sits ABOVE the face (z:4 > z:3) so it passes in front of the wordmark/chip/
   seal — reading as a light source ahead of the card rather than the ambient .hero-glow that hides
   behind it. Clipped to the card by the parent's overflow:hidden + radius, so it stays "only over
   the card" and can never wash the hero copy. screen blend adds warm light without dimming whites.
   Center = --cgx/--cgy (card-local 0..1 set by heroPointer); --cg-op keeps it dark until the
   pointer moves, so the resting card, touch, and reduced-motion look exactly as before. Position
   is NOT transitioned — the pool tracks the cursor instantly (like the ambient .hero-glow); only
   --cg-op fades so it appears/vanishes softly. Broad, low-contrast radial = a diffuse pool that
   matches the ambient hover light rather than a tight focused hotspot. */
.hero-card-frontglow{position:absolute;inset:0;z-index:4;pointer-events:none;mix-blend-mode:screen;
  opacity:var(--cg-op,0);transition:opacity .25s var(--ease-out-expo);
  background:radial-gradient(82% 82% at calc(var(--cgx,0.5) * 100%) calc(var(--cgy,0.5) * 100%),
    rgba(255,166,86,0.21),rgba(255,140,35,0.09) 40%,rgba(255,120,24,0.028) 64%,transparent 84%)}
/* EMV chip in its real-card position: left edge, just above vertical center */
.hc-chip{position:absolute;top:44%;left:26px;transform:translateY(-50%);width:46px;height:34px;border-radius:6px;
  background:linear-gradient(135deg,#f0cd6a,#b9822b);box-shadow:inset 0 0 0 1px rgba(0,0,0,0.25)}
.hc-chip::after{content:"";position:absolute;inset:6px 8px;border:1px solid rgba(0,0,0,0.3);border-radius:2px}
.hc-wave{position:absolute;top:26px;right:26px;width:34px;height:34px;color:rgba(255,252,247,0.9);filter:drop-shadow(0 1px 2px rgba(0,0,0,0.45))} /* ivory — orange-on-orange vanished once the metal went brand-orange */
/* White hot-foil pressed into the leather: WHITE glyphs (the brand name must stay white — a dark
   blind-stamp was tried and rejected), with a top-edge inner shadow so the foil still reads
   slightly sunk into the hide rather than floating on it. */
.hc-brand{position:absolute;left:26px;bottom:52px;font-size:1.5rem;font-weight:700;letter-spacing:-0.01em;
  color:#EDF0F5;
  text-shadow:0 -1px 1px rgba(0,0,0,0.55),0 1px 1px rgba(255,178,102,0.18),0 2px 4px rgba(0,0,0,0.35)}
.hc-brand em{font-style:italic;font-weight:600}
.hc-number{position:absolute;left:26px;bottom:22px;display:flex;gap:14px}
.hc-number i::before{content:"\2022\2022\2022\2022";letter-spacing:2px;color:rgba(255,255,255,0.55);font-size:0.78rem;text-shadow:0 1px 1px rgba(0,0,0,0.55)}
/* Faint "lit floor" pool so the dark contact shadow reads on the near-black background */
/* Visible floor surface (lighter than the black bg) so the dark shadow has contrast */
.hero-card-floor{position:absolute;left:50%;bottom:-17%;width:120%;height:66px;transform:translateX(-50%);border-radius:50%;z-index:-2;
  background:radial-gradient(65% 100% at 50% 45%,rgba(218,213,208,0.20),rgba(218,213,208,0.05) 60%,transparent 82%);filter:blur(16px)}
/* Genuine dark shadow on the floor */
.hero-card-shadow{position:absolute;left:50%;bottom:-15%;width:56%;height:26px;transform:translateX(-50%);border-radius:50%;z-index:-1;
  background:radial-gradient(closest-side,#000,rgba(0,0,0,0.88) 44%,rgba(0,0,0,0.32) 70%,transparent 82%);filter:blur(10px);
  animation:groundCard 6s ease-in-out infinite}

/* Hero "CDK Integrated" seal: DEBOSSED into the card — a shallow recess stamped into the chrome,
   not an object sitting on it (a solid disc of any color read as a foreign sticker on the
   luminous metal). The recess is a translucent darkening over the card's own liquid-metal
   surface, so the shader literally shows through it; z-index:1 keeps it above the metal canvas
   but BELOW .hero-card-sheen (z2), so the card's light sweep continues across the recess.
   Deboss lighting: top inner shadow (overhead light), bottom inner light catch, lit lower lip.
   Child of #heroCard — rides the card's tilt + bob 1:1; pure CSS, no JS, no hover state. */
.cdk-seal{position:absolute;right:1%;bottom:1%;z-index:1;width:32%;aspect-ratio:1/1;border-radius:50%;
  display:grid;place-items:center;
  /* darker center protects text legibility over the moving chrome; translucent rim keeps the stamped read */
  background:radial-gradient(circle,rgba(8,11,17,0.74) 0%,rgba(8,11,17,0.58) 58%,rgba(8,11,17,0.38) 100%);
  box-shadow:
    inset 0 3px 7px rgba(0,0,0,0.55),          /* top inner shadow — recess wall under the light */
    inset 0 -1px 2px rgba(255,255,255,0.14),   /* bottom inner edge catching the light */
    0 1px 1px rgba(255,255,255,0.16),          /* lower lip of the stamp catching light */
    0 -1px 1px rgba(0,0,0,0.25)}               /* upper lip shading */
/* Hairline orange enamel inlaid in the stamp groove — pigment, not glow */
.cdk-seal::before{content:"";position:absolute;inset:5.5%;border-radius:50%;pointer-events:none;
  border:1px solid rgba(255,140,35,0.55)}
.cdk-seal-core{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:5px;text-align:center}
/* Engraved orange check — bare mark, no filled chip (a fill reads sticker-ish inside a stamp).
   Orange (not the site-wide teal --success): teal was the lone cool hue on the warm chrome/gold/
   orange card; the check shape alone carries "verified". */
.cdk-seal-check{display:grid;place-items:center;color:var(--orange);
  filter:drop-shadow(0 1px 1px rgba(0,0,0,0.5))}
.cdk-seal-check svg{width:22px;height:22px}
.cdk-seal-text{font-size:0.82rem;font-weight:600;line-height:1.15;color:rgba(240,242,245,0.88);
  text-shadow:0 1px 1px rgba(0,0,0,0.45)}
.cdk-seal-text strong{display:block;font-size:1.05rem;letter-spacing:0.02em;
  background:var(--gradient-brand);-webkit-background-clip:text;background-clip:text;color:transparent;
  /* drop-shadow (not text-shadow, which bleeds through transparent gradient glyphs) for contrast over chrome */
  filter:drop-shadow(0 1px 1px rgba(0,0,0,0.65))}
@keyframes cardBob{0%,100%{transform:translateY(0)}50%{transform:translateY(-14px)}}
/* ground shadow shrinks as the card rises (in sync with the float) */
@keyframes groundCard{0%,100%{transform:translateX(-50%) scale(1)}50%{transform:translateX(-50%) scale(0.9)}}

/* ---------- 6. LOGO MARQUEE ---------- */
/* Full-bleed band: solid hairlines above/below the emblems. The edge fade lives on the inner
   .logo-marquee-viewport — a mask on .logo-marquee itself would fade the border lines too.
   No discs/backgrounds behind the logos: the hero's cursor-following glow made any opaque
   punch-out read as visible circles on hover. */
.logo-marquee{--marquee-dur:90s;position:relative;margin-top:var(--space-8);padding:22px 0;
  border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}
.logo-marquee--section{margin-top:0}
.logo-marquee-viewport{overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);
          mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent)}
.logo-marquee-track{display:flex;width:max-content;animation:marquee var(--marquee-dur) linear infinite}
.logo-marquee--reverse .logo-marquee-track{animation-direction:reverse}
.logo-marquee:hover .logo-marquee-track{animation-play-state:paused}
.logo-set{display:flex;gap:28px;padding-right:28px}
.logo-chip span{display:inline-flex;transition:filter var(--dur-normal) ease}
.logo-chip img{display:block;width:64px;height:64px;object-fit:contain}
.logo-marquee--warm .logo-chip span{filter:grayscale(1)}
.logo-marquee--warm.in-view .logo-chip span{filter:grayscale(0)}
@keyframes marquee{to{transform:translateX(-50%)}}

/* ---------- 7. SURCHARGE FLOW (pinned scrollytelling) ----------
   Desktop: a 150vh runway pins the diagram (position:sticky) for 10vh of scroll per
   step (user-tuned SUPER SENSITIVE: 50 -> 35 -> 20 -> 10vh; one wheel flick ~= one
   milestone. Milestone motion is time-based so band length is pure pacing);
   the far-left number rail is the progress spine. main.js drives --flow-progress
   (0..1) and data-active (1..5). Mobile/reduced-motion: normal flow, no pin. */
#how-it-works{overflow:visible} /* sticky breaks inside the .section overflow:hidden clip */
.flow-runway{position:relative;height:calc(100vh + 5 * 10vh)}
.flow-pin{position:sticky;top:0;height:100vh;display:flex;flex-direction:column;justify-content:center;
  padding-top:72px;box-sizing:border-box} /* keep the diagram clear of the fixed navbar */
.flow-pin>.container{width:100%}

/* --flow-gap: THE uniform vertical rhythm — every gap between beats (step-step,
   step-branch, branch-final) uses this one token, and the connector SVGs span exactly
   this zone.
   STRETCH-FILL: the flow is given the pin's full height and the diagram is a flex
   column — flex-grow 3/1/1 (one unit per card row) with flex-basis carrying each
   block's internal gap, so the browser distributes ALL available height across five
   EQUAL card rows + uniform gaps at ANY viewport height. Zero leftover space by
   construction — never size this section with fixed heights or compact breakpoints. */
.flow{--flow-progress:1;--flow-gap:clamp(20px,3.6vh,44px);position:relative;max-width:1100px;margin:0 auto;
  height:calc(100vh - 96px); /* pin minus navbar padding (72) minus breathing room */
  display:grid;grid-template-columns:56px minmax(0,1fr);gap:0 clamp(20px,4vw,44px)}
.flow-diagram{min-width:0;min-height:0;display:flex;flex-direction:column;gap:var(--flow-gap)}

/* Number rail (far-left trail): track + gradient fill + comet head + 5 stops */
.flow-rail{position:relative;display:flex;flex-direction:column;justify-content:space-between;align-items:center}
.rail-line{position:absolute;top:22px;bottom:22px;left:calc(50% - 1px);width:2px;border-radius:2px;
  background:var(--border-color);
  -webkit-mask-image:linear-gradient(180deg,transparent,#000 5%,#000 95%,transparent);
  mask-image:linear-gradient(180deg,transparent,#000 5%,#000 95%,transparent)}
/* Milestone fill: NOT scroll-scrubbed. main.js sets --rail-fill to the active stop's
   center (px) on each band change and the height TRANSITION plays the run to the next
   number — a 2px-wide element, so the height animation is negligible. Default 100% =
   no-JS / reduced-motion fallback (full line).
   --rail-run: the trail's stop-to-stop travel time (deliberately slow/premium — a calm
   pour with a long soft landing). The head MUST share the exact duration + curve or it
   desyncs from the fill edge. main.js STEP_COOLDOWN must stay >= this. */
.flow{--rail-run:1.25s;--ease-rail:cubic-bezier(0.45,0.05,0.15,1)}
.rail-fill{position:absolute;top:0;left:0;right:0;border-radius:2px;
  height:var(--rail-fill,100%);
  background:linear-gradient(180deg,var(--carmine),var(--orange));
  box-shadow:0 0 12px rgba(255,140,35,0.35);
  transition:height var(--rail-run) var(--ease-rail)}
.rail-head{position:absolute;left:calc(50% - 3px);top:var(--rail-fill,100%);width:6px;height:6px;
  margin-top:-3px;border-radius:50%;background:var(--orange);opacity:0.9;
  transition:top var(--rail-run) var(--ease-rail);
  box-shadow:0 0 10px 2px rgba(255,140,35,0.55)}
.rail-stop{position:relative;z-index:1;width:44px;height:44px;border-radius:50%;display:grid;place-items:center;
  font-family:inherit;font-weight:600;font-size:0.95rem;color:var(--text-muted);cursor:pointer;
  background:var(--bg-surface);border:1px solid var(--border-color);
  transition:transform var(--dur-normal) var(--ease-out-expo),border-color var(--dur-normal) ease,
    background var(--dur-normal) ease,color var(--dur-normal) ease,box-shadow var(--dur-normal) ease}
.rail-stop svg{width:18px;height:18px}
.rail-stop:hover{border-color:rgba(255,140,35,0.55);color:var(--text-primary);transform:scale(1.06)}
.rail-stop.is-passed{background:var(--gradient-brand);border-color:transparent;color:var(--text-inverse)}
.rail-stop--final.is-passed{background:var(--success);color:#fff}
.rail-stop.is-active{color:var(--text-primary);transform:scale(1.16);
  border:2px solid transparent;
  background:linear-gradient(var(--bg-elevated),var(--bg-elevated)) padding-box,
    linear-gradient(135deg,var(--carmine),var(--orange)) border-box;
  box-shadow:0 0 0 4px rgba(255,140,35,0.10),0 0 22px rgba(255,140,35,0.30)}

/* Stop 5: "5" until its beat lights (active or passed), then the number spins out
   and the check stroke-draws in. Both stack in the button's single grid cell. */
.rail-stop--final .rs-num,.rail-stop--final .rs-check{grid-area:1/1;
  transition:opacity 0.3s ease,transform 0.4s var(--ease-out-expo)}
.rail-stop--final .rs-check{opacity:0;transform:scale(0.4) rotate(-90deg)}
.rail-stop--final .rs-check path{stroke-dasharray:1;stroke-dashoffset:1;
  transition:stroke-dashoffset 0.45s var(--ease-out-expo) 0.12s}
.rail-stop--final:is(.is-active,.is-passed) .rs-num{opacity:0;transform:scale(0.3) rotate(90deg)}
.rail-stop--final:is(.is-active,.is-passed) .rs-check{opacity:1;transform:scale(1) rotate(0deg)}
.rail-stop--final:is(.is-active,.is-passed) .rs-check path{stroke-dashoffset:0}

/* Step track (desktop: rail carries the numbers; dots return on mobile) */
.flow-track{position:relative;display:flex;flex-direction:column;gap:var(--flow-gap);
  flex:3 0 calc(2*var(--flow-gap));min-height:0;list-style:none;margin:0;padding:0}
.flow-dot{display:none;width:48px;height:48px;border-radius:50%;place-items:center;font-weight:700;
  background:var(--bg-elevated);border:1px solid var(--border-color);color:var(--orange);z-index:1}
.flow-dot--ok{background:rgba(16,185,129,0.14);border-color:rgba(16,185,129,0.4);color:var(--success)}
.flow-dot--ok svg{width:22px;height:22px}
.flow-node{position:relative;display:flex;flex:1;min-height:0;
  transition:opacity 0.45s ease,transform 0.45s var(--ease-out-expo),filter 0.45s ease}
/* Dark liquid glass slab: near-black translucent tint over a strong saturated blur,
   a specular gradient rim (bright top-left edge fading around), a refraction sheen
   pooling from the top light, and an inner depth shade at the bottom. The rim is the
   border-box layer of the background stack (border stays transparent), so the active
   states swap only that layer for their orange/teal hairlines. */
.flow-body{position:relative;flex:1;display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto auto;
  column-gap:20px;row-gap:5px;align-items:center;align-content:center;padding:18px 34px;border-radius:var(--radius-lg);
  border:1px solid transparent;
  background:
    linear-gradient(160deg,rgba(255,255,255,0.05),rgba(255,255,255,0) 42%) padding-box,
    linear-gradient(rgba(7,10,18,0.62),rgba(7,10,18,0.62)) padding-box,
    linear-gradient(168deg,rgba(255,255,255,0.20),rgba(255,255,255,0.05) 30%,rgba(255,255,255,0.02) 62%,rgba(255,255,255,0.10)) border-box;
  -webkit-backdrop-filter:blur(22px) saturate(1.5);backdrop-filter:blur(22px) saturate(1.5);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.10),inset 0 -16px 30px -20px rgba(0,0,0,0.45);
  transition:box-shadow 0.45s ease,background 0.45s ease,border-color 0.45s ease}
.flow-body::before,.branch-card::before{content:"";position:absolute;inset:0;border-radius:inherit;
  pointer-events:none;
  background:radial-gradient(130% 70% at 14% -6%,rgba(255,255,255,0.07),rgba(255,255,255,0) 55%)}
.flow-icon{grid-row:1/span 2;width:52px;height:52px;border-radius:14px;display:grid;place-items:center;
  color:var(--text-muted);background:rgba(255,255,255,0.04);border:1px solid var(--border-subtle);
  transition:color 0.45s ease,border-color 0.45s ease,background 0.45s ease}
.flow-icon svg{width:24px;height:24px}
.flow-icon--ok{color:var(--success)}
.flow-body h4{margin:0;font-size:1.35rem}
.flow-body p{font-size:1.05rem;margin:0}

.flow-branch{position:relative;margin:0;padding-top:var(--flow-gap);
  flex:1 0 var(--flow-gap);min-height:0;display:flex;flex-direction:column}
.branch-lines{position:absolute;top:0;left:0;width:100%;height:var(--flow-gap);transition:opacity 0.45s ease}
/* Milestone draw: connectors play their full draw when their band lights (or when the
   pin has released / no JS), instead of scrubbing with scroll. */
.branch-lines .bl{stroke-dasharray:1;stroke-dashoffset:1;
  transition:stroke-dashoffset 0.9s var(--ease-in-out) 0.3s}
:is(.flow[data-active="4"],.flow[data-active="5"],.flow:not([data-active])) .branch-lines .bl{stroke-dashoffset:0}
.bl-credit{filter:drop-shadow(0 0 5px rgba(255,140,35,0.45))}
.branch-cards{display:grid;grid-template-columns:1fr 1fr;gap:20px;flex:1;min-height:0}
/* Branch cards share the liquid glass body but keep their 1px glass border + 2px
   top path accent (credit orange / debit muted) instead of the gradient rim. */
.branch-card{position:relative;display:flex;flex-direction:column;justify-content:center;
  padding:18px 34px;border-radius:var(--radius-lg);
  background:
    linear-gradient(160deg,rgba(255,255,255,0.05),rgba(255,255,255,0) 42%),
    rgba(7,10,18,0.62);
  -webkit-backdrop-filter:blur(22px) saturate(1.5);backdrop-filter:blur(22px) saturate(1.5);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.10),inset 0 -16px 30px -20px rgba(0,0,0,0.45);
  transition:transform 0.45s var(--ease-out-expo),box-shadow 0.45s ease,border-color 0.45s ease,opacity 0.45s ease,filter 0.45s ease}
.branch-card h4{margin:6px 0 4px;font-size:1.35rem} .branch-card p{font-size:1.05rem;margin:0}
.branch-label{font-size:0.72rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:var(--orange)}
.branch-label--muted{color:var(--text-muted)}
.branch-credit{border-top:2px solid var(--orange)}
.branch-debit{border-top:2px solid var(--text-muted)}
.branch-card:hover,.branch-card:focus-visible{transform:translateY(-3px);box-shadow:var(--shadow-lg)}
/* Hover one path -> dim the other, and light its connector */
.flow:has(.branch-credit:hover) :is(.bl-debit,.ml-debit),
.flow:has(.branch-debit:hover) :is(.bl-credit,.ml-credit){opacity:0.25}
.flow:has(.branch-credit:hover) .branch-debit,.flow:has(.branch-debit:hover) .branch-credit{opacity:0.5}
.branch-credit:hover{border-color:var(--orange);box-shadow:0 12px 40px rgba(255,140,35,0.16)}

.flow-merge{position:relative;margin:0;padding-top:var(--flow-gap);
  flex:1 0 var(--flow-gap);min-height:0;display:flex;flex-direction:column}
.merge-lines{position:absolute;top:0;left:0;width:100%;height:var(--flow-gap);transition:opacity 0.45s ease}
.merge-lines .ml{stroke-dasharray:1;stroke-dashoffset:1;
  transition:stroke-dashoffset 0.9s var(--ease-in-out) 0.3s}
:is(.flow[data-active="5"],.flow:not([data-active])) .merge-lines .ml{stroke-dashoffset:0}
.ml-credit{filter:drop-shadow(0 0 5px rgba(255,140,35,0.45))}
.flow-node--final{flex:1;width:100%;max-width:680px;margin:0 auto}

/* Spotlight: while pinned (data-active set by main.js), dim everything but the live beat */
.flow[data-active] :is(.flow-node,.branch-card,.branch-lines,.merge-lines){opacity:0.35}
.flow[data-active="1"] .flow-node[data-step="1"],
.flow[data-active="2"] .flow-node[data-step="2"],
.flow[data-active="3"] .flow-node[data-step="3"],
.flow[data-active="4"] :is(.branch-card,.branch-lines),
.flow[data-active="5"] :is(.flow-node--final,.merge-lines){opacity:1}
.flow[data-active="1"] .flow-node[data-step="1"],
.flow[data-active="2"] .flow-node[data-step="2"],
.flow[data-active="3"] .flow-node[data-step="3"],
.flow[data-active="5"] .flow-node--final{transform:translateY(-3px)}
.flow[data-active="1"] .flow-node[data-step="1"] .flow-body,
.flow[data-active="2"] .flow-node[data-step="2"] .flow-body,
.flow[data-active="3"] .flow-node[data-step="3"] .flow-body{
  border-color:transparent;
  background:
    linear-gradient(160deg,rgba(255,255,255,0.06),rgba(255,255,255,0) 42%) padding-box,
    linear-gradient(rgba(9,12,20,0.66),rgba(9,12,20,0.66)) padding-box,
    linear-gradient(120deg,rgba(255,140,35,0.55),rgba(178,54,63,0.25) 55%,rgba(255,255,255,0.07)) border-box;
  /* no dark drop shadow: it bands visibly on the near-black bg (see ground-shadow lesson) */
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.10),inset 0 -16px 30px -20px rgba(0,0,0,0.4),0 0 30px rgba(255,140,35,0.13)}
.flow[data-active="1"] .flow-node[data-step="1"] .flow-icon,
.flow[data-active="2"] .flow-node[data-step="2"] .flow-icon,
.flow[data-active="3"] .flow-node[data-step="3"] .flow-icon{
  color:var(--orange);border-color:rgba(255,140,35,0.35);background:rgba(255,140,35,0.08)}
.flow[data-active="4"] .branch-card{transform:translateY(-3px)}
.flow[data-active="4"] .branch-credit{border-color:rgba(255,140,35,0.5);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.06),0 12px 40px rgba(255,140,35,0.14)}
.flow[data-active="4"] .branch-debit{border-color:rgba(255,255,255,0.16)}
.flow[data-active="5"] .flow-node--final .flow-body{
  border-color:transparent;
  background:
    linear-gradient(160deg,rgba(255,255,255,0.06),rgba(255,255,255,0) 42%) padding-box,
    linear-gradient(rgba(9,12,20,0.66),rgba(9,12,20,0.66)) padding-box,
    linear-gradient(120deg,rgba(16,185,129,0.55),rgba(16,185,129,0.10)) border-box;
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.10),inset 0 -16px 30px -20px rgba(0,0,0,0.4),0 0 30px rgba(16,185,129,0.15)}
.flow[data-active="5"] .flow-icon--ok{background:rgba(16,185,129,0.12);border-color:rgba(16,185,129,0.4);
  animation:settlePulse 1.4s var(--ease-out-expo) 1}
@keyframes settlePulse{0%{box-shadow:0 0 0 0 rgba(16,185,129,0.45)}100%{box-shadow:0 0 0 16px rgba(16,185,129,0)}}

/* Progressive reveal: upcoming beats are GHOSTS — the real card at 8% opacity with a
   blur, so the void shows the silhouette of what's coming but nothing is readable.
   Activation blooms them in (opacity + blur transition off). data-active="0" =
   approaching the pin (whole diagram is a ghost silhouette); passed beats keep the
   35% dim from above; these later rules win the same-specificity cascade. */
.flow[data-active="0"] .flow-node[data-step="1"],
:is(.flow[data-active="0"],.flow[data-active="1"]) .flow-node[data-step="2"],
:is(.flow[data-active="0"],.flow[data-active="1"],.flow[data-active="2"]) .flow-node[data-step="3"],
:is(.flow[data-active="0"],.flow[data-active="1"],.flow[data-active="2"],.flow[data-active="3"]) .branch-card,
:is(.flow[data-active="0"],.flow[data-active="1"],.flow[data-active="2"],.flow[data-active="3"],.flow[data-active="4"]) .flow-node--final{
  opacity:0.08;filter:blur(3px);pointer-events:none}
:is(.flow[data-active="0"],.flow[data-active="1"],.flow[data-active="2"],.flow[data-active="3"]) .branch-lines,
:is(.flow[data-active="0"],.flow[data-active="1"],.flow[data-active="2"],.flow[data-active="3"],.flow[data-active="4"]) .merge-lines{opacity:0}

/* Conveyor drift: the whole flow assembly (rail + diagram together, so the stops stay
   aligned with their cards) rides ~70px upward across the pin, scrubbed directly by
   scroll (settles at 0 when released; mobile/reduced-motion reset it). */
.flow{transform:translateY(calc((1 - var(--flow-progress)) * 70px))}

/* Rail mapping: main.js measures each beat's center and pins its stop to it (class
   rail-mapped + inline top). --rail-from/--rail-to make the line span stop 1 -> check.
   Without JS the flex space-between spread above remains as the fallback. */
.flow.rail-mapped .rail-stop{position:absolute;left:50%;margin-left:-22px}
.flow.rail-mapped .rail-line{top:var(--rail-from,22px);bottom:auto;
  height:calc(var(--rail-to,100%) - var(--rail-from,22px))}

/* Very short desktop viewports: the stretch-fill layout already sizes the cards to
   fit any height — this only trims type + rail chrome when things get truly cramped. */
@media (min-width:769px) and (max-height:700px){
  .flow-body h4,.branch-card h4{font-size:1.1rem}
  .flow-body p,.branch-card p{font-size:0.92rem}
  .flow-icon{width:40px;height:40px}
  .flow-icon svg{width:19px;height:19px}
  .rail-stop{width:38px;height:38px;font-size:0.85rem}
  .rail-line{top:19px;bottom:19px}
  .flow.rail-mapped .rail-stop{margin-left:-19px}
}

/* ---------- 7b. HOW-IT-WORKS — full-screen SCROLLYTELLING with SNAP + PARALLAX ----------
   .hiw is a 100vh section: a static rail (left) beside .hiw-steps — a NESTED scroll container with
   scroll-snap-type:y mandatory + scroll-snap-stop:always, so you land ONLY on whole scenes, never
   in-between. As the container scrolls, ledgerCurrent() (main.js) sets per-scene --sp (-1..1, 0 =
   centred) for PARALLAX (visual/title/badge drift at different speeds + a glow that trails), plus
   --cur (1..5) for the rail fill and .is-current/.is-passed on the nodes. Own .hiw-* names (no
   collision with the value-ledger). Reduced motion: instant snap, no parallax. */
/* Runway gives the sticky .hiw somewhere to pin. 150vh = 100vh on-screen + 50vh of pin travel:
   wide enough that a fast flick can't skip the "catch", short enough that the exit tail is brief. */
.hiw-runway{position:relative;height:120vh}
.hiw{--hiw-rail:112px;--cur:1;--led-mono:ui-monospace,"SF Mono",SFMono-Regular,Menlo,Consolas,monospace;
  position:sticky;top:0;max-width:1200px;margin:0 auto;height:100vh;overflow:hidden;
  display:grid;grid-template-columns:var(--hiw-rail) minmax(0,1fr)}

/* Rail — static column, vertically centred in the 100vh section */
.hiw-rail{position:relative;height:100vh;display:flex;flex-direction:column;justify-content:center;
  align-items:center;gap:clamp(40px,11vh,110px);z-index:2}
.hiw-rail-track{position:absolute;top:14%;bottom:14%;left:50%;width:2px;transform:translateX(-50%);
  border-radius:2px;background:var(--border-color);overflow:hidden}
.hiw-rail-fill{position:absolute;top:0;left:0;right:0;border-radius:2px;
  height:calc((var(--cur) - 1) / 4 * 100%);
  background:linear-gradient(180deg,var(--carmine),var(--orange));box-shadow:0 0 12px rgba(255,140,35,0.5);
  transition:height 1.1s var(--ease-out-expo)}

/* Rail node buttons */
.hiw-node{position:relative;z-index:1;width:48px;height:48px;border-radius:50%;display:grid;place-items:center;
  cursor:pointer;-webkit-appearance:none;appearance:none;padding:0;
  font-family:var(--led-mono);font-weight:600;font-size:0.95rem;color:var(--text-muted);
  background:var(--bg-primary);border:1px solid var(--border-color);
  transition:color .4s ease,border-color .4s ease,background .4s ease,box-shadow .4s ease,transform .4s var(--ease-out-expo)}
.hiw-node svg{width:22px;height:22px}
.hiw-node.is-passed{color:var(--text-inverse);border-color:transparent;background:var(--gradient-brand)}
.hiw-node.is-current{color:var(--orange);border-color:var(--orange);box-shadow:0 0 22px rgba(255,140,35,0.5);transform:scale(1.08)}
.hiw-node::before,.hiw-node::after{content:"";position:absolute;border-radius:50%;pointer-events:none;opacity:0;transition:opacity .35s ease}
.hiw-node::before{inset:-10px;filter:blur(8px);background:radial-gradient(circle,rgba(178,54,63,0.45),rgba(255,140,35,0.22) 50%,transparent 70%)}
.hiw-node::after{inset:-4px;padding:2px;background:conic-gradient(from 0deg,var(--carmine),var(--orange),var(--carmine));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude}
.hiw-node.is-current::before{opacity:1;animation:ledBreathe 2s ease-in-out infinite}
.hiw-node.is-current::after{opacity:1;animation:ledSpin 3s linear infinite}
.hiw-node--check.is-current{color:var(--success);border-color:var(--success);box-shadow:0 0 22px rgba(16,185,129,0.5)}
.hiw-node--check.is-passed{background:rgba(16,185,129,0.16);border-color:rgba(16,185,129,0.5);color:var(--success)}
.hiw-tip{position:absolute;left:calc(100% + 14px);top:50%;transform:translateY(-50%) translateX(-6px);white-space:nowrap;
  background:var(--bg-elevated);color:var(--text-secondary);font-size:0.8rem;font-weight:500;padding:6px 12px;
  border-radius:8px;border:1px solid var(--border-color);box-shadow:var(--shadow-lg);opacity:0;pointer-events:none;
  transition:opacity .2s ease,transform .2s var(--ease-out-expo)}
.hiw-node:hover .hiw-tip,.hiw-node:focus-visible .hiw-tip{opacity:1;transform:translateY(-50%) translateX(0)}
@keyframes ledSpin{to{transform:rotate(360deg)}}
@keyframes ledBreathe{0%,100%{transform:scale(1);opacity:.5}50%{transform:scale(1.22);opacity:.82}}

/* Scenes deck — the wheel-stepper (main.js) drives scrollTop; not user-scrollable, so wheeling
   never leaks to the page mid-entry and there's nothing to rest between (snap is intrinsic). */
.hiw-steps{height:100vh;overflow:hidden;scroll-behavior:smooth}
.hiw-steps::-webkit-scrollbar{display:none}

/* Full-viewport step scenes (exact 100vh so each is one snap target) */
.hiw-step{position:relative;height:100vh;display:flex;align-items:center;justify-content:center;padding:9vh 3vw;
  text-align:center;scroll-snap-align:center;scroll-snap-stop:always;--sp:0}
.hiw-step::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(46% 38% at 50% 46%,rgba(255,140,35,0.09),rgba(178,54,63,0.03) 46%,transparent 72%);
  transform:translateY(calc(var(--sp) * 120px))}
.hiw-in{position:relative;z-index:1;max-width:640px}
/* PARALLAX: layers drift at different speeds with --sp (JS, per scene) */
.hiw-badge{transform:translateY(calc(var(--sp) * -46px))}
.hiw-title{transform:translateY(calc(var(--sp) * -22px))}
.hiw-desc{transform:translateY(calc(var(--sp) * -8px))}
.hiw-visual,.hiw-fork{transform:translateY(calc(var(--sp) * 58px))}

.hiw-badge{display:inline-flex;align-items:center;gap:10px;padding:6px 16px 6px 6px;border-radius:999px;
  border:1px solid var(--border-color);background:rgba(255,255,255,0.03);font-family:var(--led-mono);
  font-size:0.76rem;font-weight:600;letter-spacing:0.04em;color:var(--text-secondary);margin-bottom:26px}
.hiw-badge-dot{display:grid;place-items:center;width:28px;height:28px;border-radius:50%;flex:none;
  background:var(--gradient-brand);color:var(--text-inverse);font-size:0.82rem}
.hiw-badge-dot--ok{background:rgba(16,185,129,0.18);color:var(--success)}
.hiw-badge-dot--ok svg{width:15px;height:15px}
.hiw-badge--ok{color:var(--success)}
.hiw-title{font-size:clamp(2.6rem,6vw,4.4rem);line-height:1.03;letter-spacing:-0.025em;font-weight:800;margin:0 0 20px}
.hiw-desc{font-size:clamp(1.05rem,1.5vw,1.28rem);line-height:1.6;color:var(--text-secondary);max-width:46ch;margin:0 auto 40px}
.hiw-visual{position:relative;width:100%;max-width:440px;aspect-ratio:16/10;margin:0 auto;border-radius:var(--radius-lg);
  display:grid;place-items:center;background:linear-gradient(150deg,rgba(178,54,63,0.10),rgba(255,140,35,0.08));
  border:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.hiw-visual-ico{display:grid;place-items:center;width:96px;height:96px;border-radius:24px;color:var(--orange);
  background:rgba(255,140,35,0.10);border:1px solid rgba(255,140,35,0.28)}
.hiw-visual-ico svg{width:48px;height:48px}
.hiw-visual--ok{background:linear-gradient(150deg,rgba(16,185,129,0.12),rgba(16,185,129,0.05))}
.hiw-visual--ok .hiw-visual-ico{color:var(--success);background:rgba(16,185,129,0.10);border-color:rgba(16,185,129,0.3)}

/* Fork scene (step 4): credit / debit panels */
.hiw-fork{display:grid;grid-template-columns:1fr 1fr;gap:20px;max-width:560px;margin:0 auto;text-align:left}
.hiw-branch{padding:22px 24px;border-radius:var(--radius-lg);background:rgba(255,255,255,0.03);border:1px solid var(--border-subtle)}
.hiw-branch--credit{border-top:2px solid rgba(255,140,35,0.6)}
.hiw-branch--debit{border-top:2px solid var(--border-color)}
.hiw-branch-label{display:block;font-family:var(--led-mono);font-size:0.72rem;font-weight:600;text-transform:uppercase;
  letter-spacing:0.1em;color:var(--orange);margin-bottom:8px}
.hiw-branch--debit .hiw-branch-label{color:var(--text-muted)}
.hiw-branch h4{margin:0 0 5px;font-size:1.2rem}
.hiw-branch p{margin:0;font-size:0.98rem;line-height:1.5;color:var(--text-secondary)}

@media (prefers-reduced-motion:reduce){
  .hiw-node::before,.hiw-node::after{animation:none}
  .hiw-rail-fill{transition:none}
  .hiw-step::before,.hiw-badge,.hiw-title,.hiw-desc,.hiw-visual,.hiw-fork{transform:none}
  /* No pin/stepper under reduced motion (ledgerWheel bails too): scenes flow so every one is
     reachable by normal scrolling — nobody gets stuck on scene 1 in a scroll-locked deck. */
  .hiw-runway{height:auto}
  .hiw{position:static;height:auto;overflow:visible;display:block}
  .hiw-rail{display:none}
  .hiw-steps{overflow:visible;height:auto;scroll-behavior:auto}
  .hiw-step{height:auto;min-height:78vh}
}
@media (max-width:768px){
  /* No pin/stepper on touch: the section flows normally and scenes stack down the page. */
  .hiw-runway{height:auto}
  .hiw{--hiw-rail:54px;position:static;height:auto;overflow:visible;display:block}
  .hiw-rail{display:none}
  .hiw-steps{overflow:visible;height:auto}
  .hiw-step{height:auto;min-height:78vh;padding:6vh 5vw}
  .hiw-node{width:40px;height:40px;font-size:0.82rem}
  .hiw-tip{display:none}
  .hiw-title{font-size:clamp(2rem,8vw,2.8rem)}
  .hiw-desc{font-size:1.02rem}
  .hiw-fork{grid-template-columns:1fr;gap:14px}
  .hiw-visual{max-width:320px}
}

/* Callout row */
.callout-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;text-align:center;max-width:960px;margin:0 auto}
.callout-item h5{font-size:0.92rem;margin-bottom:3px;font-weight:600}
.callout-item p{font-size:0.8rem;margin:0}
.callout-icon{display:grid;place-items:center;width:46px;height:46px;margin:0 auto 12px;border-radius:12px;
  background:rgba(255,140,35,0.1);color:var(--orange)}
.callout-icon svg{width:22px;height:22px}

/* ---------- 8. PAIN CARDS (bento: live leak-counter lead + two editorial stat cards) ---------- */
/* Faint carmine "danger" wash so this section reads emotionally distinct from the neutral surfaces */
/* Soft on-brand warmth behind the pain cards — carmine-forward (danger register), kept low.
   No blur filter (it flickers under the cards' backdrop-filter); the radial stops are soft already. */
#pain-points::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background:
    radial-gradient(44% 48% at 22% 58%, rgba(178,54,63,0.11), transparent 72%),
    radial-gradient(46% 50% at 82% 64%, rgba(255,140,35,0.05), transparent 74%)}
#pain-points .container{position:relative;z-index:1}

.pain-bento{display:grid;grid-template-columns:1.55fr 1fr;
  grid-template-areas:"lead cdk" "lead pci";gap:22px;align-items:stretch}
.pain-card{position:relative;padding:30px;border-radius:var(--radius-card);border-top:2px solid var(--carmine);
  transition:transform var(--dur-normal) var(--ease-out-expo),box-shadow var(--dur-normal) ease,border-color var(--dur-normal) ease}
/* Danger-register hover glow (carmine) — keeps the convex inset lighting, never a flat dark shadow */
.pain-card:hover{transform:translateY(-4px);
  box-shadow:inset 0 1px 0.5px rgba(255,255,255,0.4),inset -1px -3px 9px rgba(0,0,0,0.36),
    0 0 0 1px rgba(178,54,63,0.28),0 0 40px rgba(178,54,63,0.18),0 30px 60px rgba(0,0,0,0.5)}
.pain-card h3{font-size:1.2rem;margin-bottom:10px}
.pain-card p{font-size:0.95rem}
.pain-card--lead{grid-area:lead;display:flex;flex-direction:column;padding:34px 36px}
.pain-card--lead h3{font-size:1.35rem;margin-bottom:0}
.pain-card--lead p{margin:18px 0 0}
/* Annual escalation pinned to the card's base: $15K/mo reads as $180K/yr */
.leak-annual{margin-top:auto;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding-top:20px;border-top:1px solid var(--border-color);font-size:0.9rem;color:var(--text-muted)}
.leak-annual-num{font-size:1.5rem;font-weight:800;letter-spacing:-0.01em;color:#E4565D;
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
.pain-card--cdk{grid-area:cdk;transition-delay:var(--stagger)}
.pain-card--pci{grid-area:pci;transition-delay:calc(var(--stagger) * 2)}
.card-icon{display:grid;place-items:center;width:52px;height:52px;margin-bottom:16px;border-radius:12px;
  background:rgba(178,54,63,0.12);color:var(--carmine)}
.card-icon svg{width:26px;height:26px}

/* Live "leak counter": the money is the hero, counting up = the loss piling up */
.leak-meter{margin:14px 0 20px}
.leak-amount{display:block;font-size:clamp(2.9rem,2rem + 4vw,4.7rem);font-weight:800;line-height:1;
  letter-spacing:-0.03em;color:#E4565D;font-variant-numeric:tabular-nums;font-feature-settings:"tnum";
  text-shadow:0 0 36px rgba(178,54,63,0.42)}
.leak-label{display:inline-flex;align-items:center;gap:8px;margin-top:12px;
  font-size:0.9rem;font-weight:600;color:var(--carmine);letter-spacing:0.01em}
.leak-label svg{width:17px;height:17px;flex:none}

/* Oversized editorial figures anchor the two supporting cards */
.stat-figure{display:flex;align-items:baseline;gap:11px;margin:2px 0 16px}
.stat-num{font-size:clamp(2.4rem,1.7rem + 2.6vw,3.4rem);font-weight:800;line-height:0.92;
  letter-spacing:-0.03em;color:#E4565D;font-variant-numeric:tabular-nums;font-feature-settings:"tnum";
  text-shadow:0 0 26px rgba(178,54,63,0.34)}
.stat-unit{font-size:0.72rem;font-weight:600;line-height:1.3;color:var(--text-muted);
  text-transform:uppercase;letter-spacing:var(--tracking-wide)}

/* Pain -> relief bridge: hands the eye down into "How It Works" */
.pain-bridge-row{display:flex;justify-content:center;margin-top:38px}
.pain-bridge{display:inline-flex;align-items:center;gap:9px;padding:11px 22px;border-radius:var(--radius-pill);
  font-size:0.92rem;font-weight:600;color:var(--text-secondary);border:1px solid var(--border-color);
  background:var(--glass-bg);-webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));
  transition:color var(--dur-normal) ease,border-color var(--dur-normal) ease,transform var(--dur-normal) var(--ease-out-expo)}
.pain-bridge svg{width:18px;height:18px;flex:none;animation:painNudge 1.9s var(--ease-out-expo) infinite}
.pain-bridge:hover{color:var(--orange);border-color:rgba(255,140,35,0.42);transform:translateY(-2px)}
@keyframes painNudge{0%,58%,100%{transform:translateY(0)}78%{transform:translateY(4px)}}

/* ---------- 9. PRICING + SAVINGS ---------- */
.pricing-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;margin-bottom:var(--space-8);perspective:1000px}
.pricing-card{position:relative;padding:34px 28px;border-radius:var(--radius-lg);background:var(--bg-elevated);
  border:1px solid var(--border-color);overflow:hidden;transition:transform var(--dur-normal) var(--ease-out-expo),box-shadow var(--dur-normal) ease;
  transform-style:preserve-3d}
.pricing-card::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--gradient-brand)}
.pricing-card::after{content:"";position:absolute;top:20px;right:22px;width:34px;height:26px;border-radius:5px;
  background:linear-gradient(135deg,#d9a441,#b9822b);opacity:0.5;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,0.2)}
.pricing-card.featured{border-color:rgba(255,140,35,0.5);box-shadow:0 0 0 1px rgba(255,140,35,0.2),var(--shadow-md)}
.pricing-card.featured::after{opacity:0.85}
.pricing-card:hover{box-shadow:var(--shadow-lg)}
.card-label{font-size:0.8rem;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;color:var(--text-secondary)}
.card-price{font-size:3rem;font-weight:700;margin:14px 0 12px;font-feature-settings:var(--tabular)}
.card-price span{font-size:1.1rem;color:var(--text-muted);font-weight:600}
.card-qual{display:block;margin:-6px 0 12px;font-size:0.72rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:var(--text-muted)}
.card-desc{font-size:0.9rem;margin:0}

/* Interactive savings calculator: tri-gauge instrument cluster in a dashboard binnacle.
   Housing is a curved cowl (elliptical top radii + inner bevels) rather than a glass card;
   hierarchy comes from borders/overlays since every surface is the same near-black. No dark
   drop shadows (they band on --bg-primary) — glow and bevels only. */
.value.before{color:var(--carmine)} .value.after{color:var(--text-primary)} .value.saved{color:var(--success)}

.calc-binnacle{position:relative;padding:clamp(28px,4vw,46px) clamp(20px,4vw,52px) clamp(24px,3vw,34px);overflow:hidden;
  border:1px solid var(--border-color);
  border-radius:clamp(28px,5vw,60px) clamp(28px,5vw,60px) var(--radius-lg) var(--radius-lg) / clamp(40px,7vw,92px) clamp(40px,7vw,92px) var(--radius-lg) var(--radius-lg);
  background:linear-gradient(180deg,rgba(255,255,255,0.045),rgba(255,255,255,0.012) 34%,rgba(0,0,0,0.24));
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.07),inset 0 -1px 0 rgba(0,0,0,0.5),inset 0 -26px 48px rgba(0,0,0,0.26)}
.calc-binnacle::before{content:"";position:absolute;top:0;left:14%;right:14%;height:1px;
  background:linear-gradient(90deg,transparent,rgba(178,54,63,0.9) 28%,rgba(255,140,35,0.95) 72%,transparent);
  box-shadow:0 0 14px rgba(255,140,35,0.35)}
/* Backlight behind the dials; .is-lit is added by main.js at ignition (instantly under reduced motion) */
.calc-binnacle::after{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;transition:opacity 900ms ease;
  background:radial-gradient(56% 44% at 50% 24%,rgba(255,140,35,0.09),transparent 70%)}
.calc-binnacle.is-lit::after{opacity:1}

.cluster{position:relative;display:grid;grid-template-columns:minmax(140px,190px) minmax(250px,320px) minmax(140px,190px);
  justify-content:center;align-items:end;gap:clamp(14px,3.5vw,44px);margin-bottom:10px}
.dial{display:flex;flex-direction:column;align-items:center;min-width:0}
.dial-svg,.gauge-svg{display:block;width:100%;height:auto;overflow:visible}

/* Center speedo */
.dial--center{position:relative}
.gauge-bezel{fill:none;stroke:rgba(255,255,255,0.06);stroke-width:1.5}
.gauge-track{fill:none;stroke:rgba(255,255,255,0.08);stroke-width:12;stroke-linecap:round}
/* dasharray "100 200" (not plain 100): at full retraction (dashoffset 100, the parked state)
   a plain 100 pattern restarts exactly at the path end and the round linecap paints a stray
   dot there — the oversized gap keeps the whole path inside one gap instead. */
.gauge-value{fill:none;stroke:url(#gaugeGrad);stroke-width:12;stroke-linecap:round;stroke-dasharray:100 200;stroke-dashoffset:14;
  transition:stroke-dashoffset var(--dur-normal) var(--ease-out-expo);filter:drop-shadow(0 0 6px rgba(255,140,35,0.25))}
.gauge-minor{fill:none;stroke:rgba(255,255,255,0.16);stroke-width:5;stroke-dasharray:0.5 4.5;stroke-dashoffset:0.25}
.gauge-major{fill:none;stroke:rgba(255,255,255,0.38);stroke-width:9;stroke-dasharray:1 24;stroke-dashoffset:0.5}
.gauge-nums text{fill:var(--text-muted);font-size:10px;font-weight:600;text-anchor:middle;font-family:var(--font-sans)}
.gauge-needle{transform-box:view-box;transform-origin:110px 118px;transform:rotate(64.8deg);
  transition:transform var(--dur-normal) var(--ease-overshoot)}
.gauge-needle line{stroke:var(--orange);stroke-width:3.5;stroke-linecap:round;filter:drop-shadow(0 0 5px rgba(255,140,35,0.7))}
.gauge-needle .hub{fill:#1A2030;stroke:rgba(255,255,255,0.25);stroke-width:1}
.gauge-needle .hub-dot{fill:var(--orange)}
.gauge-center{position:absolute;left:0;right:0;bottom:4px;text-align:center;pointer-events:none}
.gauge-pct{display:block;font-size:clamp(1.8rem,3vw,2.4rem);font-weight:700;color:var(--success);font-feature-settings:var(--tabular);line-height:1}
.gauge-center small{font-size:0.72rem;text-transform:uppercase;letter-spacing:0.08em;color:var(--text-muted)}

/* Side dials: BEFORE pegged in its carmine redline, AFTER idling near zero in teal */
.dial-track{fill:none;stroke:rgba(255,255,255,0.08);stroke-width:8;stroke-linecap:round}
.dial-zone{fill:none;stroke-width:8}
.dial-zone--red{stroke:rgba(178,54,63,0.55);stroke-dasharray:16 84;stroke-dashoffset:-84}
.dial-zone--teal{stroke:rgba(16,185,129,0.45);stroke-dasharray:22 78}
.dial-ticks{fill:none;stroke:rgba(255,255,255,0.2);stroke-width:5;stroke-dasharray:0.7 19.3;stroke-dashoffset:0.35}
.dial-needle{transform-box:view-box;transform-origin:60px 72px;transition:transform var(--dur-normal) var(--ease-overshoot)}
.dial-needle line{stroke-width:3;stroke-linecap:round}
.dial-needle circle{fill:#1A2030;stroke:rgba(255,255,255,0.22);stroke-width:1}
.dial--before .dial-needle{transform:rotate(77.4deg)}
.dial--before .dial-needle line{stroke:var(--carmine);filter:drop-shadow(0 0 4px rgba(178,54,63,0.7))}
.dial--after .dial-needle{transform:rotate(-66.6deg)}
.dial--after .dial-needle line{stroke:var(--success);filter:drop-shadow(0 0 4px rgba(16,185,129,0.6))}
.dial-readout{display:flex;align-items:baseline;gap:5px;margin-top:2px}
.dial-readout .label{font-size:0.7rem;text-transform:uppercase;letter-spacing:0.07em;color:var(--text-muted)}
.dial-readout .value{font-size:1.25rem;font-weight:700;font-feature-settings:var(--tabular);line-height:1.05}
.dial-readout .unit{font-size:0.72rem;color:var(--text-muted)}

/* Ignition sweep: needles swing to full scale and back, the arc chases, then both settle
   onto the live values (main.js parks everything at zero, then adds .ignite on scroll-in).
   Endpoints are per-element custom properties so one keyframe serves every dial. */
@keyframes needleSweep{
  0%{transform:rotate(-90deg)}
  10%{transform:rotate(-90deg);animation-timing-function:cubic-bezier(0.55,0,0.35,1)}
  58%{transform:rotate(88deg);animation-timing-function:cubic-bezier(0.5,0,0.35,1.1)}
  100%{transform:rotate(var(--needle-final,-90deg))}
}
@keyframes arcSweep{
  0%{stroke-dashoffset:100}
  10%{stroke-dashoffset:100;animation-timing-function:cubic-bezier(0.55,0,0.35,1)}
  58%{stroke-dashoffset:2;animation-timing-function:cubic-bezier(0.5,0,0.35,1.1)}
  100%{stroke-dashoffset:var(--arc-final,100)}
}
.ignite .gauge-needle,.ignite .dial-needle{animation:needleSweep 1.55s linear both}
.ignite .dial--before .dial-needle{animation-delay:100ms}
.ignite .dial--after .dial-needle{animation-delay:200ms}
.ignite .gauge-value{animation:arcSweep 1.55s linear both}
/* While the V12 rev sim drives the center dial (slider input), its CSS transitions step aside
   so the per-frame spring + flutter writes land raw. */
.rev-live .gauge-needle,.rev-live .gauge-value{transition:none}

/* Odometer: mechanical digit drums. Each cell is a masked window over a 0-9x2 strip;
   main.js rolls strips to the nearest matching digit via --odo-i. */
.odo-row{display:flex;flex-direction:column;align-items:center;gap:8px;margin:6px 0 2px}
.odo-label{font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.1em;color:var(--text-secondary)}
.odo{display:flex;align-items:center;gap:3px;padding:8px 14px;border-radius:var(--radius-md);
  background:linear-gradient(180deg,rgba(0,0,0,0.5),rgba(0,0,0,0.28));border:1px solid rgba(255,255,255,0.08);
  box-shadow:inset 0 2px 6px rgba(0,0,0,0.6),inset 0 -1px 0 rgba(255,255,255,0.04);
  font-size:clamp(1.5rem,2.6vw,1.9rem);font-weight:700;font-feature-settings:var(--tabular)}
.odo-cur{color:var(--success);font-size:0.72em;margin-right:2px}
.odo-sep{color:var(--success);line-height:1}
.odo-unit{font-size:0.44em;color:var(--text-muted);font-weight:600;margin-left:6px;align-self:flex-end;padding-bottom:0.35em}
.odo-cell{position:relative;height:1.35em;width:0.72em;overflow:hidden;border-radius:3px;
  line-height:1.35em;text-align:center;color:var(--success);
  background:linear-gradient(180deg,#060910,#0D1220 50%,#060910);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,0.05)}
.odo-cell::after{content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
  background:linear-gradient(180deg,rgba(0,0,0,0.55),transparent 32%,transparent 68%,rgba(0,0,0,0.55))}
.odo-strip{display:block;transition:transform 560ms cubic-bezier(0.22,1,0.36,1);
  transform:translateY(calc(var(--odo-i,0) * -1.35em))}
.odo-strip i{display:block;height:1.35em;line-height:1.35em;font-style:normal}
.odo-cell.odo-dim .odo-strip{opacity:0.22}
/* Ignition roll: longer travel, cascading left to right */
.odo-ignite .odo-strip{transition-duration:1350ms;transition-delay:120ms}
.odo-ignite .odo-cell:nth-child(3) .odo-strip{transition-delay:180ms}
.odo-ignite .odo-cell:nth-child(5) .odo-strip{transition-delay:240ms}
.odo-ignite .odo-cell:nth-child(6) .odo-strip{transition-delay:300ms}
.odo-ignite .odo-cell:nth-child(7) .odo-strip{transition-delay:360ms}
.calc-annual{font-size:0.95rem;color:var(--text-secondary)}
.calc-annual span{color:var(--success);font-weight:700;font-feature-settings:var(--tabular)}

/* Conversion CTA: kicker + primary glow button rise in under the annual line after the first
   ignition settles. The .glare class (added by JS for ~2s, then removed) fires the button's
   btnGlare sweep once as it lands — it must NOT be left on permanently or its higher
   specificity would permanently shadow the :hover sweep declaration. */
.calc-demo-nudge{display:flex;flex-direction:column;align-items:center;gap:12px;margin:14px 0 4px;
  opacity:0;transform:translateY(10px);transition:opacity 600ms ease,transform 600ms var(--ease-out-expo)}
.calc-demo-nudge[hidden]{display:none} /* display:flex would otherwise defeat the hidden attribute */
.calc-demo-nudge.show{opacity:1;transform:none}
.nudge-kicker{font-size:0.85rem;color:var(--text-secondary)}
.calc-demo-nudge.glare .btn-primary{animation:btnGlare 1.2s ease-in-out 550ms 1}

/* Dead panel: until the starter is pressed the dials + odometer sit dim and desaturated.
   Scoped to .is-armed (added by JS) so no-JS visitors keep the full-brightness static seed. */
.cluster,.odo-row{transition:opacity 800ms ease,filter 800ms ease}
.calc-binnacle.is-armed:not(.is-lit) :is(.cluster,.odo-row){opacity:0.78;filter:saturate(0.5)}

/* Console controls: machined groove tracks, engraved panel lettering, knurled metal thumb,
   and the round ACTIVATE push-start at the end of the row (a real dash layout) */
.calc-controls{display:grid;grid-template-columns:1fr 1fr auto;gap:36px;margin-top:30px;padding-top:30px;border-top:1px solid var(--border-subtle)}
.calc-field--start{display:flex;align-items:center;justify-content:center;padding:0 4px}
.push-start{position:relative;width:96px;height:96px;border-radius:50%;cursor:pointer;font-family:inherit;
  display:grid;place-items:center;border:1px solid rgba(255,255,255,0.18);
  background:radial-gradient(circle at 34% 28%,#3A4356,#232A3A 55%,#141926 82%);
  box-shadow:0 0 0 4px rgba(15,19,31,0.9),0 0 0 5px rgba(255,255,255,0.09),
    inset 0 2px 3px rgba(255,255,255,0.12),inset 0 -6px 12px rgba(0,0,0,0.55);
  transition:transform var(--dur-fast) ease,filter var(--dur-fast) ease}
.push-start:hover{filter:brightness(1.12)}
.push-start:active{transform:translateY(1px) scale(0.96)}
.push-start:disabled{cursor:default}
.ps-ring{position:absolute;inset:6px;border-radius:50%;pointer-events:none;
  border:2px solid rgba(255,255,255,0.10);transition:border-color 300ms ease,box-shadow 300ms ease}
.is-lit .ps-ring{border-color:rgba(255,140,35,0.85);
  box-shadow:0 0 12px rgba(255,140,35,0.5),inset 0 0 10px rgba(255,140,35,0.25)}
.ps-face{display:flex;flex-direction:column;align-items:center;gap:3px;line-height:1}
.ps-face strong{font-size:0.7rem;font-weight:700;letter-spacing:0.13em;text-transform:uppercase;color:var(--text-primary)}
.ps-face small{font-size:0.5rem;font-weight:600;letter-spacing:0.09em;text-transform:uppercase;color:var(--text-muted)}
/* Starter crank: LED flickers and the parked needles shudder before the engine catches */
@keyframes ledFlicker{
  0%,100%{border-color:rgba(255,140,35,0.2)}
  20%{border-color:rgba(255,140,35,0.9)}
  40%{border-color:rgba(255,140,35,0.3)}
  60%{border-color:rgba(255,140,35,0.8)}
  80%{border-color:rgba(255,140,35,0.4)}
}
@keyframes crankJitter{
  0%,100%{transform:rotate(-90deg)}
  25%{transform:rotate(-86.5deg)}
  50%{transform:rotate(-89deg)}
  75%{transform:rotate(-85deg)}
}
.is-cranking .ps-ring{animation:ledFlicker 500ms linear}
.is-cranking .gauge-needle,.is-cranking .dial-needle{animation:crankJitter 260ms linear 2}
.calc-field-top{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px}
.calc-field label{font-size:0.76rem;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:var(--text-secondary)}
.calc-out{font-size:1.02rem;font-weight:700;color:var(--orange);font-feature-settings:var(--tabular);
  text-shadow:0 0 12px rgba(255,140,35,0.35)}
.calc-ticks{height:6px;margin-bottom:7px;
  background:repeating-linear-gradient(90deg,rgba(255,255,255,0.14) 0 1px,transparent 1px calc(100%/24));
  -webkit-mask:linear-gradient(90deg,transparent,#000 4% 96%,transparent);
  mask:linear-gradient(90deg,transparent,#000 4% 96%,transparent)}
.calc-scale{display:flex;justify-content:space-between;font-size:0.7rem;color:var(--text-muted);margin-top:9px;
  font-feature-settings:var(--tabular);letter-spacing:0.06em;text-shadow:0 1px 0 rgba(0,0,0,0.6)}
input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:10px;border-radius:6px;cursor:pointer;
  border:1px solid rgba(255,255,255,0.07);
  background:linear-gradient(90deg,#B2363F,var(--orange) var(--range-fill,50%),rgba(9,12,20,0.9) var(--range-fill,50%));
  box-shadow:inset 0 1px 3px rgba(0,0,0,0.7),inset 0 -1px 0 rgba(255,255,255,0.04),0 1px 0 rgba(255,255,255,0.05)}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:26px;height:26px;border-radius:50%;cursor:pointer;
  background:radial-gradient(circle at 34% 30%,#F2F4F7,#B9C1CC 40%,#59637A 72%,#262D3D);
  border:1px solid rgba(255,255,255,0.35);
  box-shadow:0 0 0 3px rgba(11,15,26,0.9),0 0 10px rgba(255,140,35,0.45),0 2px 6px rgba(0,0,0,0.5);
  transition:transform var(--dur-fast) ease}
input[type=range]::-webkit-slider-thumb:hover{transform:scale(1.12)}
input[type=range]::-moz-range-thumb{width:26px;height:26px;border-radius:50%;cursor:pointer;
  background:radial-gradient(circle at 34% 30%,#F2F4F7,#B9C1CC 40%,#59637A 72%,#262D3D);
  border:1px solid rgba(255,255,255,0.35);
  box-shadow:0 0 0 3px rgba(11,15,26,0.9),0 0 10px rgba(255,140,35,0.45),0 2px 6px rgba(0,0,0,0.5)}
input[type=range]:focus-visible{box-shadow:var(--focus-ring)}

.calc-note{font-size:0.8rem;color:var(--text-muted);margin-top:24px;max-width:72ch}

/* ---------- 10. TABLES ---------- */
.table-wrap{overflow-x:auto;border-radius:var(--radius-lg);border:1px solid var(--border-color);margin-bottom:28px}
table{width:100%;border-collapse:collapse;min-width:560px}
th{background:var(--bg-elevated);color:var(--orange);text-transform:uppercase;font-size:0.75rem;letter-spacing:var(--tracking-wide);
  font-weight:700;text-align:left;padding:16px 20px}
td{padding:15px 20px;border-top:1px solid var(--border-subtle);font-size:0.92rem;color:var(--text-secondary)}
td:first-child{color:var(--text-primary);font-weight:500}
.check{color:var(--success);font-weight:600} .cross{color:var(--text-muted)}
.check::before{content:"\2713  ";font-weight:700} .cross::before{content:"\2715  "}
.negative{color:var(--text-muted)} .highlight{color:var(--success);font-weight:600}
.tech-callout{padding:28px 32px;border-radius:var(--radius-lg);border-left:3px solid var(--orange)}
.tech-callout h4{color:var(--orange);margin-bottom:8px}
.tech-callout p{font-size:0.95rem;margin:0}

/* ---------- 11. SECURITY: encrypt-a-live-card pipeline ---------- */
.enc-demo{position:relative;isolation:isolate;max-width:1120px;margin:0 auto 40px;
  display:flex;flex-direction:column;align-items:center;gap:28px}

/* --- terminal card (the real <button>) --- */
.enc-terminal-col{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center}
.enc-terminal{position:relative;display:block;padding:0;border:none;background:none;cursor:pointer;border-radius:18px}
.enc-terminal:focus-visible{outline:none;box-shadow:var(--focus-ring)}
/* real credit-card proportions: ISO 7810 ID-1 is 1.585:1 (was ~2.6:1 — too long/short) */
.enc-card{display:flex;flex-direction:column;justify-content:space-between;width:min(360px,86vw);aspect-ratio:1.585;
  padding:22px 24px;border-radius:14px;text-align:left;
  background:linear-gradient(150deg,#222c46 0%,#141b2e 58%,#0e1424 100%);
  border:1px solid rgba(255,255,255,0.10);
  box-shadow:var(--shadow-lg),inset 0 1px 0 rgba(255,255,255,0.06);
  transition:transform var(--dur-fast) ease,box-shadow var(--dur-normal) ease}
.enc-terminal:hover .enc-card{transform:translateY(-4px)}
.enc-terminal:active .enc-card{transform:translateY(-1px) scale(0.99)}
/* pulsing "ping" ring — makes it unmistakable the card is clickable (idle only) */
.enc-terminal::after{content:"";position:absolute;inset:0;border-radius:14px;pointer-events:none;border:2px solid var(--orange);opacity:0}
.enc-demo:not(.is-running):not(.is-secure) .enc-terminal::after{animation:encPing 2s ease-out infinite}
@keyframes encPing{0%{opacity:0.75;transform:scale(1)}70%,100%{opacity:0;transform:scale(1.06)}}
/* capture punch: the terminal jolts as encryption fires (beat 1) */
.enc-card.enc-punch{animation:encPunch 200ms var(--ease-out-expo)}
@keyframes encPunch{0%{transform:translateY(0) scale(1)}32%{transform:translateY(2px) scale(0.955)}100%{transform:translateY(0) scale(1)}}
/* idle glow invites the click; suppressed while running/sealed */
.enc-demo:not(.is-running):not(.is-secure) .enc-card{animation:encGlow 2.4s ease-in-out infinite}
@keyframes encGlow{0%,100%{box-shadow:var(--shadow-lg),0 0 0 0 rgba(255,140,35,0)}
  50%{box-shadow:var(--shadow-lg),0 0 40px 2px rgba(255,140,35,0.55)}}
.enc-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:0}
.enc-card-chip{position:relative;width:34px;height:26px;border-radius:6px;
  background:linear-gradient(135deg,#efc963,#b9822b);box-shadow:inset 0 0 0 1px rgba(0,0,0,0.25)}
.enc-card-chip::after{content:"";position:absolute;inset:5px 7px;border:1px solid rgba(0,0,0,0.25);border-radius:1px}
.enc-card-wave{width:22px;height:22px;color:var(--orange)}
.enc-pan{display:flex;align-items:center;gap:2px;font-weight:700;font-size:1.18rem;letter-spacing:0.01em;
  color:var(--text-primary);font-variant-numeric:tabular-nums}
.enc-digit{display:inline-block;width:0.66em;text-align:center;transition:color var(--dur-fast) ease}
.enc-gap{display:inline-block;width:0.5em}
/* ciphertext: orange while being captured, teal once "in transit / secure" */
.enc-pan.is-cipher .enc-digit{color:var(--orange);text-shadow:0 0 10px rgba(255,140,35,0.35)}
.enc-demo.is-transit .enc-pan.is-cipher .enc-digit,
.enc-demo.is-decrypt .enc-pan.is-cipher .enc-digit,
.enc-demo.is-secure  .enc-pan.is-cipher .enc-digit{color:var(--success);text-shadow:0 0 10px rgba(16,185,129,0.4)}
.enc-card-foot{display:flex;align-items:center;justify-content:space-between;margin-top:0;
  font-size:0.7rem;text-transform:uppercase;letter-spacing:0.08em;color:var(--text-muted)}
.enc-card-state{font-weight:700;color:var(--orange);transition:color var(--dur-normal) ease}
.enc-demo.is-secure .enc-card-state{color:var(--success)}

/* --- click prompt: two states stacked in one grid cell so swapping never reflows --- */
.enc-cta{display:inline-grid;justify-items:center;margin-top:20px;font-size:0.92rem;font-weight:700}
.enc-cta-state{grid-area:1/1;display:inline-flex;align-items:center;gap:9px;padding:10px 20px;border-radius:var(--radius-pill);
  border:1px solid transparent;transition:opacity var(--dur-normal) ease}
.enc-cta svg{width:18px;height:18px;flex:none}
/* FIRST-click prompt: a bright, gently BOUNCING orange pill — unmistakably clickable */
.enc-cta-state--run{color:var(--orange);background:rgba(255,140,35,0.14);border-color:rgba(255,140,35,0.55)}
.enc-demo:not(.is-running):not(.is-secure) .enc-cta-state--run{animation:encCtaBounce 1.7s ease-in-out infinite}
@keyframes encCtaBounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
/* replay is calmer once they've already seen it run */
.enc-cta-state--again{color:var(--text-secondary);background:rgba(255,255,255,0.04);border-color:var(--border-color)}
.enc-demo.is-secure .enc-cta-state--run,
.enc-demo:not(.is-secure) .enc-cta-state--again{opacity:0;visibility:hidden}

/* --- connected 4-beat pipeline: rail + traveling comet behind the node row --- */
.enc-flow{position:relative;z-index:1;width:100%}
.enc-rail{position:absolute;left:12.5%;right:12.5%;top:26px;height:2px;border-radius:2px;
  background:var(--border-color);pointer-events:none}
.enc-rail-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:2px;
  background:linear-gradient(90deg,var(--orange),var(--success));box-shadow:0 0 9px rgba(255,140,35,0.55);
  transition:width .7s var(--ease-out-expo)}
.enc-comet{position:absolute;top:50%;left:0;width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;
  background:#fff;box-shadow:0 0 16px 4px rgba(255,140,35,0.9),0 0 5px 1px #fff;opacity:0;
  transition:left .7s var(--ease-out-expo),opacity .3s ease}
/* comet wake: a glowing streak trailing behind as it charges down the rail */
.enc-comet::before{content:"";position:absolute;top:50%;right:5px;transform:translateY(-50%);
  width:46px;height:4px;border-radius:3px;pointer-events:none;opacity:0;
  background:linear-gradient(270deg,rgba(255,170,80,0.85),rgba(255,140,35,0));transition:opacity .3s ease}
.enc-demo.is-running .enc-comet::before{opacity:1}
.enc-demo[data-beat="1"] .enc-comet{left:0;opacity:1}
.enc-demo[data-beat="2"] .enc-rail-fill{width:33.33%}
.enc-demo[data-beat="2"] .enc-comet{left:33.33%;opacity:1}
.enc-demo[data-beat="3"] .enc-rail-fill{width:66.66%}
.enc-demo[data-beat="3"] .enc-comet{left:66.66%;opacity:1}
.enc-demo[data-beat="4"] .enc-rail-fill{width:100%}
.enc-demo[data-beat="4"] .enc-comet{left:100%;opacity:1}
/* at the finale the comet DISSOLVES before it parks on "Your Exposure" (opacity fades faster
   than it travels) — the rail-fill still completes the connection, but no light sits on the far card */
.enc-demo.is-secure .enc-comet{opacity:0}

/* --- steps: <ol> with markers killed (bug fix); dim-until-active only when JS arms it --- */
.enc-steps{position:relative;list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(4,1fr);gap:18px}
.enc-step{position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px;
  transition:opacity .4s ease,transform .4s var(--ease-out-expo),filter .4s ease}
.enc-demo.is-armed .enc-step{opacity:.4;filter:saturate(.55)}
.enc-demo.is-armed .enc-step.is-active{opacity:1;filter:none;transform:translateY(-3px)}
.enc-demo.is-armed .enc-step.is-done{opacity:.85;filter:none}
.enc-node{position:relative;z-index:1;width:52px;height:52px;border-radius:15px;display:grid;place-items:center;
  color:var(--text-muted);background:var(--bg-elevated);border:1px solid var(--border-color);
  transition:color .4s ease,background .4s ease,border-color .4s ease,box-shadow .4s ease,transform .4s var(--ease-out-expo)}
.enc-node svg{width:24px;height:24px}
/* the active step's icon GROWS while the beat is on it (each node in turn); returns to size once done */
.enc-step.is-active .enc-node{color:var(--text-inverse);background:var(--gradient-brand);border-color:transparent;transform:scale(1.12);
  box-shadow:0 0 0 5px rgba(255,140,35,0.12),0 8px 22px -10px rgba(255,140,35,0.7)}
.enc-step.is-done .enc-node{color:var(--success);background:rgba(16,185,129,0.12);border-color:rgba(16,185,129,0.4)}
/* node 4 ("Your Exposure") grows like the others when active but casts NO glow (user: no light on the far card) */
.enc-step[data-step="4"].is-active .enc-node{color:var(--success);background:rgba(16,185,129,0.16);border-color:transparent;box-shadow:none}
.enc-step-txt{display:flex;flex-direction:column;gap:3px}
.enc-step-txt b{font-size:1rem;color:var(--text-primary)}
.enc-step-txt span{font-size:0.82rem;color:var(--text-secondary);line-height:1.4}
.enc-step[data-step="4"] .enc-step-txt strong{color:var(--success)}

/* --- payoff: seal + label + value chip --- */
.enc-payoff{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;gap:14px}
.enc-seal-label{font-size:0.8rem;font-weight:700;letter-spacing:0.05em;text-transform:uppercase;color:var(--success)}
.enc-value-chip{display:inline-flex;align-items:center;gap:9px;padding:7px 15px;border-radius:var(--radius-pill);
  background:rgba(16,185,129,0.10);border:1px solid rgba(16,185,129,0.28);font-size:0.86rem}
.enc-value-chip s{color:var(--text-muted);text-decoration-thickness:1px}
.enc-value-chip svg{width:16px;height:16px;color:var(--text-muted)}
.enc-value-chip b{color:var(--success);font-weight:700}

/* --- converge burst: ciphertext tokens implode into the seal (WAAPI, built in JS) --- */
.enc-burst{position:absolute;width:0;height:0;pointer-events:none;z-index:2}
.enc-token{position:absolute;left:0;top:0;transform:translate(-50%,-50%);font-size:0.7rem;font-weight:700;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--success);
  text-shadow:0 0 8px rgba(16,185,129,0.8);will-change:transform,opacity}

/* ---------- Promoted authority stat band ---------- */
/* real dark liquid-glass slab (flow-body recipe) so it reads as a surface on near-black */
.trust-band{position:relative;display:flex;align-items:center;gap:22px;padding:26px 30px;margin-bottom:26px;
  border-radius:var(--radius-lg);border:1px solid transparent;overflow:hidden;
  background:
    linear-gradient(160deg,rgba(255,255,255,0.05),rgba(255,255,255,0) 42%) padding-box,
    linear-gradient(rgba(7,10,18,0.62),rgba(7,10,18,0.62)) padding-box,
    linear-gradient(168deg,rgba(255,255,255,0.20),rgba(255,255,255,0.05) 30%,rgba(255,255,255,0.02) 62%,rgba(255,255,255,0.10)) border-box;
  -webkit-backdrop-filter:blur(22px) saturate(1.5);backdrop-filter:blur(22px) saturate(1.5);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.10),inset 0 -16px 30px -20px rgba(0,0,0,0.45)}
.trust-band::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(130% 80% at 12% -10%,rgba(16,185,129,0.10),rgba(255,255,255,0) 55%)}
.trust-seal{position:relative;flex:none;width:58px;height:58px;border-radius:50%;display:grid;place-items:center;
  color:var(--success);background:rgba(16,185,129,0.10);border:1px solid rgba(16,185,129,0.32)}
.trust-seal svg{width:30px;height:30px}
.trust-stat{position:relative;flex:none;display:flex;flex-direction:column;line-height:1}
.trust-stat .count{font-size:2.6rem;font-weight:800;color:var(--orange);letter-spacing:-0.01em}
.trust-stat small{font-size:0.72rem;text-transform:uppercase;letter-spacing:0.08em;color:var(--text-muted);margin-top:5px}
.trust-copy{position:relative;font-size:0.98rem;color:var(--text-secondary);
  border-left:1px solid var(--border-color);padding-left:22px}
.trust-copy strong{color:var(--text-primary);font-weight:600}

/* ---------- Battle-card table — scoped to .security-table only (shared table/th/td + #cdk untouched) ---------- */
.security-table{min-width:600px}
.security-table thead th{border-bottom:1px solid var(--border-color)}
.security-table th:nth-child(2){color:var(--carmine)}
.security-table th:nth-child(3){color:var(--success)}
.security-table th:nth-child(2),.security-table td.negative{background:rgba(178,54,63,0.06)}
.security-table th:nth-child(3),.security-table td.highlight{background:rgba(16,185,129,0.07);
  box-shadow:inset 1px 0 0 rgba(16,185,129,0.22),inset -1px 0 0 rgba(16,185,129,0.22)}
.security-table td.negative{color:var(--text-secondary)}
.security-table td.negative::before{content:"\2715\00a0\00a0";color:var(--carmine);font-weight:800}
.security-table td.highlight{color:var(--success);font-weight:600}
.security-table td.highlight::before{content:"\2713\00a0\00a0";color:var(--success);font-weight:800}
/* emphasize the killer deltas: 329->21 and ~$130K/yr->$0 */
.security-table tr.enc-key td.negative,.security-table tr.enc-key td.highlight{font-size:1.05rem;font-weight:800}
.security-table tr.enc-key td.negative{color:var(--text-primary)}

/* ---------- tighten vertical dead-space ---------- */
#security .section-header{margin-bottom:var(--space-6)}
#security .table-wrap{margin-bottom:0}   /* last element in the section */

/* ---------- 11b. SECURITY PROOF BAND (slim homepage beat — Wave 1 cutover) ----------
   The homepage's #security section is now ONE glass slab: shield + claim on the left, the
   three killer numbers on the right, and a handoff link to /security/ (where the full
   encryption demo + trust band + comparison table moved). Glass recipe = .trust-band's
   (gradient rim as the border-box layer, teal cast), so the two read as siblings once the
   trust band re-appears on /security/. */
.sec-band{position:relative;display:grid;grid-template-columns:1.25fr auto;gap:20px 44px;align-items:center;
  padding:36px 40px;border-radius:var(--radius-lg);border:1px solid transparent;overflow:hidden;
  background:
    linear-gradient(160deg,rgba(255,255,255,0.05),rgba(255,255,255,0) 42%) padding-box,
    linear-gradient(rgba(7,10,18,0.62),rgba(7,10,18,0.62)) padding-box,
    linear-gradient(168deg,rgba(255,255,255,0.20),rgba(255,255,255,0.05) 30%,rgba(255,255,255,0.02) 62%,rgba(255,255,255,0.10)) border-box;
  -webkit-backdrop-filter:blur(22px) saturate(1.5);backdrop-filter:blur(22px) saturate(1.5);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.10),inset 0 -16px 30px -20px rgba(0,0,0,0.45)}
.sec-band::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(130% 80% at 12% -10%,rgba(16,185,129,0.10),rgba(255,255,255,0) 55%)}
.sec-band-head{position:relative;display:flex;gap:22px;align-items:flex-start}
.sec-band-seal{flex:none;width:58px;height:58px;border-radius:50%;display:grid;place-items:center;margin-top:4px;
  color:var(--success);background:rgba(16,185,129,0.10);border:1px solid rgba(16,185,129,0.32)}
.sec-band-seal svg{width:30px;height:30px}
.sec-band .eyebrow{margin-bottom:8px}
.sec-band h2{font-size:clamp(1.45rem,1.05rem + 1.6vw,2.05rem);margin-bottom:10px;max-width:22ch}
.sec-band-head p{font-size:0.97rem;max-width:52ch}
.sec-band-stats{position:relative;display:grid;gap:16px;border-left:1px solid var(--border-color);padding-left:40px}
.sec-band-stats li{display:flex;flex-direction:column;line-height:1.2}
.sec-band-stats strong{font-size:1.4rem;font-weight:800;color:var(--success);
  font-variant-numeric:tabular-nums;font-feature-settings:var(--tabular)}
.sec-band-stats span{font-size:0.8rem;color:var(--text-muted)}
.sec-band-link{position:relative;grid-column:1 / -1;justify-self:start;display:inline-flex;align-items:center;gap:8px;
  color:var(--orange);font-weight:600;font-size:0.98rem}
.sec-band-link svg{width:16px;height:16px;transition:transform var(--dur-fast) ease}
.sec-band-link:hover svg{transform:translateX(4px)}
@media (max-width:900px){
  .sec-band{grid-template-columns:1fr;padding:30px 26px}
  .sec-band-stats{border-left:none;border-top:1px solid var(--border-color);
    padding:20px 0 0;grid-template-columns:repeat(3,auto);gap:24px;justify-content:start}
}
@media (max-width:520px){
  .sec-band-head{flex-direction:column}
  .sec-band-stats{grid-template-columns:1fr;gap:14px}
}

/* ---------- SECURITY responsive (self-contained; replaces the deleted .security-steps rule at old line 1243) ---------- */
@media (max-width:1024px){
  .enc-steps{grid-template-columns:repeat(2,1fr);gap:26px 18px}
  .enc-rail,.enc-comet{display:none}   /* the horizontal comet only makes sense in one row */
}
@media (max-width:768px){
  .enc-steps{grid-template-columns:1fr;gap:0}
  .enc-step{flex-direction:row;text-align:left;gap:16px;padding:14px 0}
  .enc-step-txt{align-items:flex-start}
  .enc-steps::before{content:"";position:absolute;left:25px;top:30px;bottom:30px;width:2px;border-radius:2px;
    background:var(--border-color)}   /* vertical spine keeps the beats connected when stacked */
  .trust-band{flex-direction:column;text-align:center;gap:14px}
  .trust-copy{border-left:none;border-top:1px solid var(--border-color);padding:14px 0 0}
}

/* ---------- 12. INCLUDED — ZERO-OUT LEDGER ----------
   A designed dealer "statement". As each row scrolls into view its sticker price is
   aggressively slashed (carmine) and a green "FREE" stamps in; the total counts up to
   $2,900 on scroll, and the "$0 to get started · $99/month" payoff sits below with the
   Book-a-Demo CTA. No button — the reveal is scroll-driven (the row-strike cascade is
   the delight moment). Rest / no-JS / reduced-motion floor = the honest end state (every
   line "FREE", full total, payoff visible); JS adds .is-armed (hide FREE, show the price)
   so there is something to reveal, then per-row .is-struck fires the slash + stamp. */
/* /pricing/ page: small print under the rate cards + the worked-math payoff line */
.rate-note{max-width:72ch;margin:-24px auto 0;text-align:center;font-size:0.85rem;color:var(--text-muted)}
.rate-note a{color:var(--orange)}
.math-payoff{max-width:56ch;margin:0 auto var(--space-6);text-align:center;font-size:var(--text-body)}

/* Intro for the ledger now that it lives INSIDE #pricing (the old #included section header) */
.included-head{max-width:760px;margin:var(--space-9) auto var(--space-6);text-align:center}
.included-head h3{font-size:clamp(1.6rem,1.1rem + 2vw,2.4rem);margin-bottom:12px}
.included-head p{font-size:var(--text-body)}
.value-ledger{position:relative;max-width:860px;margin:0 auto;padding:6px 0 8px;
  border-radius:var(--radius-lg);overflow:hidden}
.value-ledger::before{content:"";position:absolute;top:0;left:0;right:0;height:2px;
  background:var(--gradient-brand)}
.ledger{list-style:none;margin:0;padding:0}
.ledger-row{position:relative;overflow:hidden;display:grid;grid-template-columns:auto 1fr auto;align-items:center;
  gap:18px;padding:16px 26px;border-bottom:1px solid var(--border-color)}
/* green light that sweeps L->R across a row as it is "freed" (clipped by overflow) */
.ledger-row::after{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;transform:translateX(-100%);
  background:linear-gradient(100deg,transparent 30%,rgba(34,197,94,0.30) 50%,transparent 70%)}
.ledger-icon{display:grid;place-items:center;width:46px;height:46px;border-radius:12px;
  background:rgba(255,140,35,0.10);color:var(--orange);
  transition:background var(--dur-normal) ease,color var(--dur-normal) ease}
.ledger-icon svg{width:22px;height:22px}
.ledger-main{min-width:0}
.ledger-name{display:block;font-weight:600;font-size:1.05rem;color:var(--text-primary)}
.ledger-desc{display:block;font-size:0.85rem;color:var(--text-secondary);margin-top:2px}
/* value cell: crossed price + green "FREE" sit SIDE BY SIDE and BOTH persist at rest, so
   "$800 -> FREE" reads even if the animation is missed. FREE holds its slot via opacity so
   the price never shifts when it lands. */
.ledger-value{display:inline-flex;align-items:baseline;gap:9px;justify-self:end;white-space:nowrap;
  font-variant-numeric:tabular-nums}
.lv-was{color:var(--text-muted);font-weight:600;font-size:0.9rem;position:relative}
.lv-free{color:#22C55E;font-weight:800;font-size:0.95rem;letter-spacing:0.06em;text-transform:uppercase;
  text-shadow:0 0 12px rgba(34,197,94,0.4)}
/* strike over the price: calm GRAY at rest. .is-armed sets it carmine + scaleX(0); .is-struck
   transitions it back to scaleX(1) gray, so it draws left->right while cooling red->gray. */
.ledger-value[data-value] .lv-was::after{content:"";position:absolute;left:-3px;right:-3px;top:50%;
  height:2px;border-radius:2px;background:var(--text-secondary);box-shadow:none;
  transform:translateY(-50%) scaleX(1);transform-origin:left center}
/* feature row (Ingenico): scale contrast + brand edge */
.ledger-row--feature::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
  background:var(--gradient-brand)}
.ledger-row--feature .ledger-icon{width:56px;height:56px}
.ledger-row--feature .ledger-icon svg{width:26px;height:26px}
.ledger-row--feature .ledger-name{font-size:1.2rem}
@media (hover:hover){
  .ledger-row:hover .ledger-icon{background:rgba(255,140,35,0.20);color:#ffd9a8}
}
/* ---- Foot: total + push-start + payoff ---- */
.ledger-foot{text-align:center;padding:30px 26px 6px}
.ledger-total{display:flex;flex-direction:column;align-items:center;gap:2px;margin-bottom:22px}
.lt-label{font-size:0.78rem;text-transform:uppercase;letter-spacing:0.08em;
  color:var(--text-muted);font-weight:600}
.lt-figure{font-size:clamp(2.6rem,6vw,4rem);font-weight:800;line-height:1;color:var(--text-primary);
  font-variant-numeric:tabular-nums;font-feature-settings:var(--tabular)}
/* payoff — visible by default (no-JS/reduced), hidden while armed, stamps in on settle */
.value-result{margin-top:22px;display:flex;flex-direction:column;align-items:center;gap:16px}
.vr-price{font-size:clamp(1.25rem,3vw,1.75rem);font-weight:600;color:var(--text-primary)}
.vr-zero{color:var(--orange);font-weight:800}
.vr-price strong{color:var(--orange);font-weight:800}
.vr-dot{color:var(--text-muted);margin:0 6px}
/* ---- STATE: scroll-driven ripple ----
   No-JS / reduced-motion never arm, so the honest END state shows: every priced line crossed
   out (gray) beside green "FREE", full total, payoff. JS adds .is-armed (un-strike the price to
   carmine-scaleX0, hide FREE) = the "before"; the ripple adds .is-struck per row. The PERSISTENT
   result (gray strike drawn + FREE shown) is reached by TRANSITION toward declared targets, so a
   row can never get stuck mid-flip. The green light sweep + the shake are the only @keyframes
   animations and are purely additive (a row missing them still ends in the correct state). */
.value-ledger.is-armed .ledger-value[data-value] .lv-was::after{transform:translateY(-50%) scaleX(0)}
.value-ledger.is-armed .lv-free{opacity:0;transform:scale(.7)}
/* prices glare RED while you scroll (the cost), then drain to gray as the green slash kills them */
.value-ledger.is-armed .ledger-value[data-value] .lv-was{color:var(--carmine);font-weight:700}
.value-ledger.is-armed .ledger-row.is-struck .ledger-value[data-value] .lv-was{
  color:var(--text-muted);font-weight:600;transition:color .45s ease}
.value-ledger.is-armed .ledger-row.is-struck .ledger-value[data-value] .lv-was::after{
  transform:translateY(-50%) scaleX(1);background:var(--text-secondary);box-shadow:none;
  transition:transform .28s var(--ease-overshoot);animation:slashFlash .45s ease-out}
/* the cut itself flashes aggressive green, then the crossing line settles to a neutral cross-out */
@keyframes slashFlash{0%{background:#22C55E;box-shadow:0 0 16px rgba(34,197,94,0.95)}
  55%{background:#22C55E;box-shadow:0 0 12px rgba(34,197,94,0.85)}
  100%{background:var(--text-secondary);box-shadow:none}}
.value-ledger.is-armed .ledger-row.is-struck .lv-free{opacity:1;transform:scale(1);
  transition:opacity .3s ease,transform .4s var(--ease-overshoot)}
.value-ledger.is-armed .ledger-row.is-struck::after{animation:rowSweep .6s ease-out}
.value-ledger.is-armed .ledger-row.is-struck .lv-was{animation:priceShake .3s ease}
@keyframes rowSweep{0%{opacity:0;transform:translateX(-100%)}22%{opacity:1}100%{opacity:0;transform:translateX(100%)}}
@keyframes priceShake{0%,100%{transform:translateX(0)}18%{transform:translateX(-3px)}
  38%{transform:translateX(3px)}58%{transform:translateX(-2px)}78%{transform:translateX(2px)}}
/* one-time CTA glare as the payoff scrolls into view (removed by JS so :hover keeps working) */
.value-result.glare .btn-primary{animation:btnGlare 1.2s ease-in-out 1}
/* whole-panel green energy flash the instant the whole list is axed to FREE (.is-axing, main.js) */
.value-ledger::after{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;opacity:0;
  background:radial-gradient(120% 70% at 50% 45%,rgba(34,197,94,0.20),transparent 70%)}
.value-ledger.is-axing::after{animation:ledgerFlash .8s ease-out}
@keyframes ledgerFlash{0%{opacity:0}25%{opacity:1}100%{opacity:0}}
/* rumble: the whole ledger vibrates with intensifying amplitude right before the axe hits */
.value-ledger.is-rumbling{animation:ledgerRumble .72s cubic-bezier(.36,.07,.19,.97)}
@keyframes ledgerRumble{
  0%{transform:translate(0,0)}7%{transform:translate(-1px,1px)}14%{transform:translate(1px,-1px)}
  21%{transform:translate(-1px,-1px)}28%{transform:translate(2px,1px)}35%{transform:translate(-2px,1px)}
  42%{transform:translate(2px,-1px)}50%{transform:translate(-2px,-1px)}58%{transform:translate(2px,1px)}
  65%{transform:translate(-3px,1px)}72%{transform:translate(3px,-1px)}80%{transform:translate(-3px,1px)}
  88%{transform:translate(2px,-1px)}94%{transform:translate(-1px,1px)}100%{transform:translate(0,0)}}
@media (max-width:768px){
  .ledger-row{padding:14px 16px;gap:14px}
  .ledger-row--feature .ledger-name{font-size:1.1rem}
  .ledger-foot{padding:26px 16px 4px}
}
@media (max-width:480px){
  .ledger-icon,.ledger-row--feature .ledger-icon{width:40px;height:40px}
  .ledger-icon svg,.ledger-row--feature .ledger-icon svg{width:20px;height:20px}
  .ledger-name,.ledger-row--feature .ledger-name{font-size:0.98rem}
  .ledger-desc{font-size:0.8rem}
  .ledger-value{font-size:0.85rem}
}

/* ---------- 13. GROWTH CARDS ---------- */
.growth-badge{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:var(--radius-pill);
  background:rgba(255,140,35,0.12);color:var(--orange);font-size:0.8rem;font-weight:600;margin-bottom:var(--space-4)}
/* GROWTH SUITE — service-bay tool tray. The 4 tools laid in a felt-lined drawer with brushed
   gunmetal name-plates. PASSIVE: on scroll-in (.fade-up -> .visible) a single sheen sweeps the
   felt once and the plates settle in staggered; static after. Orange is spent ONLY on the sheen
   + a top hairline (the one-accent rule the hero follows). No prices — value stays in the section
   header so it never echoes the $2,900 receipt in #included directly above. Reduced-motion/no-JS:
   reveals() adds .visible up front and the global reduced-motion reset collapses the sweep/stagger
   to an instant, honest, fully-shown state. */
.growth-tray{position:relative;max-width:940px;margin:0 auto;padding:14px;border-radius:var(--radius-lg);
  background:linear-gradient(180deg,#1b1f2a,#0e1119);border:1px solid var(--border-color);
  box-shadow:0 26px 60px rgba(0,0,0,0.5),inset 0 1px 0 rgba(255,255,255,0.06)}
/* the single spent accent besides the sheen: a brand hairline along the drawer lip */
.growth-tray::before{content:"";position:absolute;left:14px;right:14px;top:0;height:1px;border-radius:2px;
  background:var(--gradient-brand);opacity:0.55;pointer-events:none}
.gt-felt{position:relative;overflow:hidden;border-radius:calc(var(--radius-lg) - 5px);padding:clamp(16px,2.4vw,26px);
  background:repeating-linear-gradient(135deg,rgba(0,0,0,0.16) 0 2px,transparent 2px 5px),
    linear-gradient(180deg,#12151f,#0b0e16);
  box-shadow:inset 0 4px 18px rgba(0,0,0,0.75),inset 0 -1px 0 rgba(255,255,255,0.04)}
/* one-shot diagonal sheen — parked off-screen left, sweeps once when the tray reveals */
.gt-felt::after{content:"";position:absolute;inset:0;z-index:3;pointer-events:none;transform:translateX(-120%);
  background:linear-gradient(115deg,transparent 34%,rgba(255,140,35,0.16) 47%,rgba(255,255,255,0.10) 52%,transparent 66%)}
.growth-tray.visible .gt-felt::after{animation:traySheen 1.15s var(--ease-out-expo) 0.25s 1 forwards}
@keyframes traySheen{to{transform:translateX(120%)}}
.gt-slots{position:relative;z-index:1;display:grid;grid-template-columns:1fr 1fr;gap:clamp(12px,1.6vw,18px)}
.growth-slot{display:flex;align-items:center;gap:14px;padding:16px 18px;border-radius:var(--radius-md);
  background:linear-gradient(180deg,#20242e,#14171f);border:1px solid rgba(255,255,255,0.06);
  box-shadow:0 3px 8px rgba(0,0,0,0.5),inset 0 1px 0 rgba(255,255,255,0.05);
  opacity:0;transform:translateY(10px);
  transition:opacity var(--dur-slow) var(--ease-out-expo),transform var(--dur-slow) var(--ease-out-expo),
    border-color var(--dur-normal) ease}
.growth-tray.visible .growth-slot{opacity:1;transform:none}
.growth-tray.visible .growth-slot:nth-child(1){transition-delay:.05s}
.growth-tray.visible .growth-slot:nth-child(2){transition-delay:.13s}
.growth-tray.visible .growth-slot:nth-child(3){transition-delay:.21s}
.growth-tray.visible .growth-slot:nth-child(4){transition-delay:.29s}
/* machined gunmetal name-plate cradling the icon */
.gs-plate{flex:none;display:grid;place-items:center;width:46px;height:46px;border-radius:11px;color:#cfd4de;
  background:linear-gradient(180deg,#3a3f4b,#22262f);border:1px solid rgba(255,255,255,0.12);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.18),inset 0 -2px 4px rgba(0,0,0,0.5),0 1px 2px rgba(0,0,0,0.5);
  transition:color var(--dur-normal) ease,border-color var(--dur-normal) ease}
.gs-plate svg{width:22px;height:22px}
.gs-text{min-width:0;display:flex;flex-direction:column;gap:2px}
.gs-name{font-weight:600;font-size:1.02rem;color:var(--text-primary);text-shadow:0 1px 0 rgba(0,0,0,0.5)}
.gs-benefit{font-size:0.86rem;color:var(--text-secondary)}
/* desktop hover is ambient polish only — the section is fully passive without it */
@media (hover:hover){
  .growth-slot:hover{border-color:rgba(255,140,35,0.22)}
  .growth-slot:hover .gs-plate{color:#ffd9a8;border-color:rgba(255,140,35,0.3)}
}
@media (max-width:640px){.gt-slots{grid-template-columns:1fr}}
/* reduced motion: drop the per-plate delay so plates appear with the tray, not staggered-late */
@media (prefers-reduced-motion:reduce){.growth-tray .growth-slot{transition-delay:0!important}}

/* ---------- 14. WHO WE SERVE ---------- */
.department-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:var(--space-8)}
.department-card{padding:26px;border-radius:var(--radius-card);text-align:center;transition:transform var(--dur-normal) var(--ease-out-expo),box-shadow var(--dur-normal) ease}
.department-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)}
.dept-icon{display:grid;place-items:center;width:50px;height:50px;margin:0 auto 14px;border-radius:12px;background:rgba(255,140,35,0.1);color:var(--orange)}
.dept-icon svg{width:24px;height:24px}
.department-card h4{font-size:1.05rem;margin-bottom:6px} .department-card p{font-size:0.85rem;margin:0}

/* ============ LIQUID GLASS — feature cards (Apple-style, restrained) ============ */
/* Subtle neutral frost that reveals the DARK content behind it (transparency the Apple way — not
   colored light), with a delicate luminous edge + gentle bevel. On-brand warm ambiance ONLY and
   kept very low so it never reads bright/harsh. NO filter:blur behind the glass — that repaints
   under backdrop-filter and causes the flashing. Low saturate keeps refracted color calm. */
.pain-card,.pricing-card,.principle-card{
  position:relative;isolation:isolate;
  background:
    linear-gradient(180deg, rgba(255,255,255,0.055), rgba(255,255,255,0) 42%),   /* faint surface gloss */
    linear-gradient(155deg, rgba(255,255,255,0.045), rgba(255,255,255,0.012));    /* subtle frost fill */
  border:1px solid rgba(255,255,255,0.08);
  -webkit-backdrop-filter:blur(16px) saturate(1.2);
  backdrop-filter:blur(16px) saturate(1.2);
  box-shadow:
    0 16px 40px rgba(0,0,0,0.4),                    /* soft lift */
    inset 0 1px 0.5px rgba(255,255,255,0.24),       /* delicate top edge */
    inset 0 -20px 30px -24px rgba(0,0,0,0.4);       /* gentle bottom depth */
}
/* Refraction rim — a delicate luminous edge, masked to the border only (no body bleed).
   On pricing this REPLACES the old 3px ::before top-edge (inset:0 + height:auto override it). */
.pain-card::before,.pricing-card::before,.principle-card::before{
  content:"";position:absolute;inset:0;height:auto;border-radius:inherit;padding:1px;pointer-events:none;z-index:2;
  background:linear-gradient(140deg,
    rgba(255,255,255,0.4) 0%, rgba(255,255,255,0.04) 34%, rgba(255,255,255,0.015) 64%, rgba(255,255,255,0.18) 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
}
.pain-card{border-radius:var(--radius-card)}
.pricing-card{border-radius:var(--radius-lg)}
/* Featured pricing card: a soft warm edge (badge ::after stays intact) */
.pricing-card.featured::before{
  background:linear-gradient(140deg,
    rgba(255,170,90,0.5) 0%, rgba(255,140,35,0.08) 36%, rgba(178,54,63,0.05) 64%, rgba(255,140,35,0.3) 100%);
}
.pricing-card.featured{
  box-shadow:
    0 16px 40px rgba(0,0,0,0.4),
    inset 0 1px 0.5px rgba(255,255,255,0.26),
    inset 0 -20px 30px -24px rgba(0,0,0,0.4),
    0 0 0 1px rgba(255,140,35,0.14),
    0 0 30px rgba(255,140,35,0.08);
}
/* Hover: gentle lift + a touch more edge light (pain keeps its carmine hover defined above) */
.pricing-card:hover{
  transform:translateY(-4px);
  box-shadow:
    0 24px 50px rgba(0,0,0,0.48),
    inset 0 1px 0.5px rgba(255,255,255,0.32),
    inset 0 -20px 30px -24px rgba(0,0,0,0.4),
    0 0 26px rgba(255,140,35,0.08);
}
/* No colored light behind the lower grids — they read as clean dark Apple frost (the delicate edge
   + frost carry the glass). Avoids both the off-theme color AND the z-index:-1-behind-backdrop-filter
   flicker. Only the pain section keeps a subtle carmine warmth (see #pain-points::before). */

/* ============ FLIP CARDS — Growth Suite + Who We Serve (hover / focus / tap to reveal) ============ */
/* Vanilla port of a 3D flip card. Faces use a SOLID dark surface (NO backdrop-filter — it breaks
   preserve-3d / backface-visibility on a rotated face), so these two sections trade the frosted
   glass for the flip interaction. Fixed height because the faces are absolutely positioned. */
.growth-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
/* Six-card variant (/growth-suite/): 3x2 instead of a 4+2 orphan row. Same (0,1,0) specificity
   as the responsive .growth-cards rules further down, so the 2-col/1-col overrides still win. */
.growth-cards--six{grid-template-columns:repeat(3,1fr)}
.flip-card{position:relative;height:238px;border-radius:var(--radius-card);cursor:pointer;outline:none;
  perspective:800px;-webkit-tap-highlight-color:transparent}
.flip-inner{position:absolute;inset:0;border-radius:inherit;transform-style:preserve-3d;
  transition:transform 0.9s var(--ease-out-expo)}
.flip-card:hover .flip-inner,
.flip-card:focus-visible .flip-inner,
.flip-card.is-flipped .flip-inner{transform:rotateY(180deg)}
.flip-card:focus-visible{box-shadow:0 0 0 2px var(--bg-primary),0 0 0 4px var(--orange)}
/* Subtle pulsing orange edge-glow that invites the hover. All cards pulse in unison (user preference),
   breathing low->high (never blinks fully off), and fading out on the hovered/focused card since it's
   already being used. Behind the faces (z-index:-1); these cards have no backdrop-filter, so the
   negative z-index is safe here. */
.flip-card::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:-1;
  box-shadow:0 0 0 1px rgba(255,140,35,0.55),0 0 26px 2px rgba(255,140,35,0.45);
  opacity:0.2;transition:box-shadow 0.3s ease;animation:flipInvite 3s ease-in-out infinite}
/* Hide the glow on the hovered/focused card by dropping its box-shadow — NOT by touching the
   animation. Killing/pausing the animation would restart it on un-hover and desync that card from
   the rest; leaving the timeline untouched keeps all cards pulsing in lockstep no matter what. */
.flip-card:hover::after,.flip-card:focus-visible::after{box-shadow:none}
@keyframes flipInvite{0%,100%{opacity:0.28}50%{opacity:1}}
/* overflow MUST stay visible: overflow:hidden flattens transform-style:preserve-3d and kills the lift.
   The face bg/border still clip to its own rounded corners; only the lifted content can cross edges. */
.flip-face{position:absolute;inset:0;border-radius:inherit;transform-style:preserve-3d;
  -webkit-backface-visibility:hidden;backface-visibility:hidden;
  display:flex;flex-direction:column;justify-content:center;padding:26px;
  border:1px solid rgba(255,255,255,0.09);
  background:linear-gradient(180deg,rgba(255,255,255,0.05),transparent 42%),linear-gradient(158deg,#171d2a 0%,#0d1119 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.14),0 18px 42px rgba(0,0,0,0.45)}
.flip-face--back{transform:rotateY(180deg);border-top:2px solid rgba(255,140,35,0.55)}
/* Constant 3D lift: content floats 50px proud of the face and parallaxes hard as the card turns.
   scale(.94) cancels the perspective magnification so it still fits at rest. backface hidden so the
   floating front content disappears (not mirror-bleeds) once the card is showing its back. */
.flip-face>*{transform:translateZ(50px) scale(.94);-webkit-backface-visibility:hidden;backface-visibility:hidden}
.flip-icon{display:grid;place-items:center;width:50px;height:50px;border-radius:14px;
  color:var(--orange);background:rgba(255,140,35,0.12);border:1px solid rgba(255,140,35,0.22)}
.flip-icon svg{width:25px;height:25px}
.flip-title{font-size:1.12rem;font-weight:700;line-height:1.25;margin:16px 0 0}
.flip-back-title{display:block;font-size:0.78rem;font-weight:700;text-transform:uppercase;
  letter-spacing:var(--tracking-wide);color:var(--orange);margin:0 0 10px}
.flip-face--back p{font-size:0.94rem;line-height:1.5;color:var(--text-secondary);margin:0}
/* Reduced motion: keep the flip animating (user-chosen exception to the global transition kill),
   but flatten the 3D lift so the vestibular-heavy parallax backs off. */
@media (prefers-reduced-motion:reduce){
  .flip-inner{transition-duration:0.9s!important}
  .flip-face>*{transform:none}
  .flip-card::after{animation:none;opacity:0.26}  /* static faint edge instead of a pulse */
}

/* ---------- 15. FAQ ---------- */
.faq-list{display:grid;gap:12px}
.faq-item{border:1px solid var(--border-color);border-radius:var(--radius-card);background:var(--bg-elevated);overflow:hidden;
  transition:border-color var(--dur-fast) ease}
.faq-item.active{border-color:rgba(255,140,35,0.4)}
.faq-question{width:100%;display:flex;align-items:center;justify-content:space-between;gap:16px;text-align:left;
  padding:20px 24px;background:none;border:none;cursor:pointer;font-family:inherit;font-size:1.05rem;font-weight:600;color:var(--text-primary)}
.faq-question:hover{color:var(--orange)}
.faq-toggle{flex:none;display:grid;place-items:center;width:28px;height:28px;border-radius:8px;background:rgba(255,140,35,0.1);color:var(--orange);transition:transform var(--dur-normal) var(--ease-out-expo)}
.faq-item.active .faq-toggle{transform:rotate(135deg)}
.faq-answer{max-height:0;overflow:hidden;transition:max-height var(--dur-normal) var(--ease-in-out)}
.faq-answer p{padding:0 24px 20px;font-size:0.94rem;margin:0}

/* ---------- 16. BOOKING FORM CARD + TRUST LIST ----------
   The standalone .final-cta section is GONE — the booking form now lives inside the parallax
   band (#book-demo, section 17b), which is the page's single merged closer + conversion moment.
   These rules style the pieces the band reuses: the trust list and the glass form card. */
.final-trust{display:grid;gap:12px}
.final-trust li{display:flex;align-items:center;gap:10px;color:var(--text-secondary);font-weight:500}
.final-trust svg{width:20px;height:20px;color:var(--success);flex:none}
.cta-form-card{position:relative;padding:12px;border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);min-height:544px}
.booking-skeleton{position:absolute;inset:0;display:grid;place-items:center;color:var(--text-muted);font-size:0.9rem}
#book-demo.form-ready .booking-skeleton{display:none}
.booking-iframe{width:100%;min-height:520px;border:none;border-radius:calc(var(--radius-lg) - 4px);background:transparent;display:block;
  opacity:0;transition:opacity var(--dur-normal) ease}
#book-demo.form-ready .booking-iframe{opacity:1}

/* ---------- 17. FOOTER ---------- */
.footer{background:var(--bg-primary);padding:64px 0 32px;border-top:1px solid var(--border-color)}
.footer-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr;gap:40px;margin-bottom:40px}
.footer-logo{display:flex;align-items:center;gap:10px;font-size:1.15rem;margin-bottom:14px}
.footer-brand p{font-size:0.9rem;max-width:34ch}
.footer-col h4{font-size:0.9rem;margin-bottom:14px;color:var(--text-primary)}
.footer-col ul{display:grid;gap:10px}
.footer-col a{color:var(--text-secondary);font-size:0.9rem;transition:color var(--dur-fast) ease}
.footer-col a:hover{color:var(--orange)}
.footer-col ul .soon{color:var(--text-muted);font-size:0.9rem;cursor:default}
/* D10 canonical contact block (phone / email / Houston address) in the brand column */
.footer-contact{display:grid;gap:9px;margin-top:18px;font-style:normal;font-size:0.9rem}
.footer-contact a,.footer-contact span{display:flex;align-items:flex-start;gap:9px;color:var(--text-secondary);
  transition:color var(--dur-fast) ease}
.footer-contact a:hover{color:var(--orange)}
.footer-contact svg{width:15px;height:15px;flex:none;margin-top:4px;color:var(--orange)}
.footer-bottom{padding-top:24px;border-top:1px solid var(--border-subtle);font-size:0.85rem;color:var(--text-muted)}

/* ---------- 17c. SUBPAGE SCAFFOLDING (templates/page.html) ----------
   Deep pages have no ignition loader and no hero stage — a compact header (breadcrumb +
   eyebrow + H1 + lede) opens the page, {{PAGE_CONTENT}} sections follow the homepage's
   .section rhythm, and .page-cta closes every page at the Book-a-Demo ask (/#book-demo). */
.page-hero{position:relative;padding:calc(72px + var(--space-8)) 0 var(--space-6);overflow:hidden;
  background:var(--bg-surface);border-bottom:1px solid var(--border-subtle);isolation:isolate}
.page-hero h1{font-size:var(--text-h2);max-width:24ch;margin-bottom:0}
.page-lede{font-size:var(--text-body);max-width:62ch;margin-top:var(--space-4)}
.crumbs{margin-bottom:var(--space-5);font-size:0.82rem;color:var(--text-muted)}
.crumbs ol{display:flex;flex-wrap:wrap;gap:8px;list-style:none}
.crumbs li{display:flex;align-items:center;gap:8px}
.crumbs li + li::before{content:"/";opacity:0.5}
.crumbs a{color:var(--text-muted);transition:color var(--dur-fast) ease}
.crumbs a:hover{color:var(--orange)}
.page-cta-inner{max-width:640px;margin:0 auto;text-align:center;display:flex;flex-direction:column;
  align-items:center;gap:var(--space-4)}
.page-cta-copy{max-width:52ch}

/* ---------- Interactive CDK diagram: tap the card machine -> auto-posts to CDK ---------- */
.cdk-demo{position:relative;isolation:isolate;display:flex;align-items:center;justify-content:center;gap:0;max-width:780px;margin:0 auto 18px}
/* Desktop-only 25% upscale (user request). zoom (not transform:scale) so it takes real
   layout space; everything inside — terminal, panel, type, shatter burst — scales with it.
   Tablet/mobile keep the base size: the column layout is already near full width there. */
@media (min-width:1025px){
  .cdk-demo{zoom:1.25}
}
.cdk-terminal-col{display:flex;flex-direction:column;align-items:center;gap:16px;flex:none}

/* Shatter burst layer: a 0x0 anchor pinned to the RO panel's center; main.js
   spawns the shards/ring inside and drives them with WAAPI (colors set inline).
   Negative z-index (scoped by the demo's isolation) paints the burst BEHIND the
   panel, so shards/ring emerge from its edges instead of crossing its face. */
.cdk-shatter{position:absolute;width:0;height:0;pointer-events:none;z-index:-1}
.cdk-shard{position:absolute;left:0;top:0}
.cdk-shatter-ring{position:absolute;left:0;top:0;transform:translate(-50%,-50%);border-radius:var(--radius-pill)}

/* Card machine (a real button) + a credit card that taps onto it */
.cdk-terminal{position:relative;display:block;width:154px;padding:0;border:none;background:none;cursor:pointer;border-radius:22px}
.cdk-terminal:focus-visible{box-shadow:var(--focus-ring)}
.ct-body{position:relative;z-index:1;display:block;border-radius:20px 20px 14px 14px;padding:16px 14px 18px;
  background:linear-gradient(180deg,#1d263c,#0f1526);border:1px solid var(--border-color);
  box-shadow:var(--shadow-md),inset 0 1px 0 rgba(255,255,255,0.06);transition:transform var(--dur-fast) ease}
.cdk-terminal:hover .ct-body{transform:translateY(-2px)}
.cdk-terminal:active .ct-body{transform:translateY(0) scale(0.99)}
.ct-antenna{display:block;width:34px;height:4px;margin:0 auto 12px;border-radius:3px;background:rgba(255,255,255,0.10)}
/* Idle: glow to invite the click */
.cdk-demo:not(.is-running):not(.is-done) .ct-body{animation:termGlow 2.4s ease-in-out infinite}
@keyframes termGlow{0%,100%{box-shadow:var(--shadow-md),0 0 0 0 rgba(255,140,35,0)}50%{box-shadow:var(--shadow-md),0 0 28px 2px rgba(255,140,35,0.4)}}

.ct-screen{position:relative;height:74px;border-radius:10px;background:var(--navy);border:1px solid var(--border-color);
  display:grid;place-items:center;overflow:hidden;background-image:radial-gradient(circle at 50% 20%,rgba(255,140,35,0.16),transparent 72%)}
.ct-line{position:absolute;display:inline-flex;align-items:center;gap:6px;font-size:0.9rem;font-weight:600;opacity:0;transition:opacity var(--dur-normal) ease}
.ct-idle{color:var(--text-secondary)} .ct-reading{color:var(--orange)} .ct-approved{color:var(--success)}
.ct-approved svg{width:16px;height:16px}
.cdk-demo:not(.is-reading):not(.is-approved):not(.is-done) .ct-idle{opacity:1}
.cdk-demo.is-reading .ct-reading{opacity:1}
.cdk-demo.is-approved .ct-approved,.cdk-demo.is-done .ct-approved{opacity:1}
.ct-keys{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;padding:14px 20px 0}
.ct-keys i{height:12px;border-radius:4px;background:rgba(255,255,255,0.08)}

/* Credit card: chip + contactless waves; hovers, then taps the terminal on interaction */
.ct-card{position:absolute;left:50%;top:-30px;z-index:2;width:106px;height:66px;border-radius:9px;
  background:linear-gradient(135deg,#28324f 0%,#161d30 60%,#10172a 100%);border:1px solid rgba(255,255,255,0.14);
  box-shadow:var(--shadow-lg);transform:translateX(-50%) rotate(-9deg);
  transition:transform .5s var(--ease-out-expo),opacity .35s ease}
.ct-card-chip{position:absolute;top:16px;left:13px;width:24px;height:18px;border-radius:4px;
  background:linear-gradient(135deg,#efc963,#b9822b);box-shadow:inset 0 0 0 1px rgba(0,0,0,0.2)}
.ct-card-chip::after{content:"";position:absolute;inset:5px 6px;border:1px solid rgba(0,0,0,0.25);border-radius:1px}
.ct-card-wave{position:absolute;top:14px;right:11px;width:22px;height:22px;color:var(--orange)}
.ct-card-strip{position:absolute;left:12px;right:12px;bottom:13px;height:7px;border-radius:3px;
  background:linear-gradient(90deg,rgba(255,255,255,0.18),rgba(255,255,255,0.05))}
.cdk-demo:not(.is-running):not(.is-done) .ct-card{animation:cardHover 3s ease-in-out infinite}
.cdk-demo:not(.is-running):not(.is-done) .ct-card-wave{animation:waveGlow 2s ease-in-out infinite}
@keyframes cardHover{0%,100%{transform:translateX(-50%) rotate(-9deg) translateY(0)}50%{transform:translateX(-50%) rotate(-9deg) translateY(-7px)}}
@keyframes waveGlow{0%,100%{opacity:0.5}50%{opacity:1}}
.cdk-demo.is-reading .ct-card{animation:none;transform:translateX(-50%) rotate(-3deg) translateY(34px)}
.cdk-demo.is-approved .ct-card,.cdk-demo.is-done .ct-card{animation:none;opacity:0;transform:translateX(-50%) rotate(-9deg) translateY(-16px)}

/* Both hint states share one grid cell so the column keeps the width/height
   of the widest message — swapping them never reflows the demo row */
.cdk-cta{display:inline-grid;justify-items:center;max-width:100%;font-size:0.86rem;font-weight:600;color:var(--orange)}
.cdk-cta-state{grid-area:1/1;display:inline-flex;align-items:center;gap:8px;transition:opacity var(--dur-normal) ease}
.cdk-cta svg{width:18px;height:18px;flex:none}
.cdk-demo:not(.is-running):not(.is-done) .cdk-cta svg{animation:ctaNudge 1.8s ease-in-out infinite}
@keyframes ctaNudge{0%,100%{transform:translate(0,0)}50%{transform:translate(2px,2px)}}
.cdk-demo.is-done .cdk-cta{color:var(--text-secondary)}
.cdk-demo.is-done .cdk-cta-state--run,.cdk-demo:not(.is-done) .cdk-cta-state--again{opacity:0;visibility:hidden}

/* Connector */
.cdk-wire{position:relative;flex:1;min-width:64px;max-width:150px;height:2px;
  background:linear-gradient(90deg,var(--orange),var(--success));opacity:0.4;transition:opacity var(--dur-normal) ease}
.cdk-demo.is-posting .cdk-wire,.cdk-demo.is-done .cdk-wire{opacity:1}
.cdk-pulse{position:absolute;top:50%;left:0;width:11px;height:11px;margin-top:-5.5px;border-radius:50%;background:var(--white);
  box-shadow:0 0 12px 2px rgba(255,140,35,0.85);opacity:0}
.cdk-demo.is-posting .cdk-pulse{animation:cdkTravel .7s ease-in forwards}
@keyframes cdkTravel{from{opacity:1;left:0}to{opacity:1;left:100%}}

/* CDK Drive repair-order panel. Opaque surface (not the 60%-alpha glass bg): the
   shatter burst plays behind this panel and must not glow through its face. Same
   RGB as --bg-surface, so it renders identically to glass over the section bg. */
.cdk-panel{flex:none;width:286px;padding:18px 20px;border-radius:var(--radius-card);
  background:var(--bg-elevated);-webkit-backdrop-filter:none;backdrop-filter:none}
.cdk-head{display:flex;align-items:center;gap:8px;font-size:0.76rem;font-weight:700;text-transform:uppercase;letter-spacing:0.04em;color:var(--text-secondary);margin-bottom:16px}
.cdk-dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted);transition:background var(--dur-normal) ease,box-shadow var(--dur-normal) ease}
.cdk-demo.is-done .cdk-dot{background:var(--success);box-shadow:0 0 0 4px rgba(16,185,129,0.15)}
.cdk-lines{display:grid;gap:12px;margin-bottom:16px}
.cdk-lines li{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:0.9rem}
.cdk-lbl{color:var(--text-primary);font-weight:500}
.cdk-bar{flex:0 0 82px;height:7px;border-radius:4px;background:rgba(255,255,255,0.09)}
.cdk-payment{opacity:0.32;transition:opacity var(--dur-normal) ease}
.cdk-posted{display:inline-flex;align-items:center;gap:5px;font-size:0.8rem;font-weight:700;color:var(--success);
  opacity:0;transform:translateX(6px);transition:opacity var(--dur-normal) ease,transform var(--dur-normal) var(--ease-out-expo)}
.cdk-posted svg{width:14px;height:14px}
.cdk-demo.is-done .cdk-payment{opacity:1}
.cdk-demo.is-done .cdk-posted{opacity:1;transform:none}
.cdk-status{font-size:0.85rem;color:var(--text-muted);border-top:1px solid var(--border-subtle);padding-top:13px}
.cdk-status-val{font-weight:700;color:var(--warning)}
.cdk-demo.is-done .cdk-status-val{color:var(--success)}
.cdk-caption{text-align:center;font-size:0.92rem;color:var(--text-secondary);margin:0 auto 28px;max-width:600px}

/* ---------- P2PE shield recast as a DEBOSSED SEAL (deboss vocabulary from .cdk-seal, teal enamel) ---------- */
.enc-seal{position:relative;width:132px;height:132px;border-radius:50%;display:grid;place-items:center;
  background:radial-gradient(circle,rgba(8,11,17,0.74) 0%,rgba(8,11,17,0.58) 58%,rgba(8,11,17,0.38) 100%);
  box-shadow:
    inset 0 3px 8px rgba(0,0,0,0.55),          /* top inner recess wall */
    inset 0 -1px 2px rgba(255,255,255,0.14),   /* bottom inner light catch */
    0 1px 1px rgba(255,255,255,0.14),          /* lower lip highlight */
    0 -1px 1px rgba(0,0,0,0.25)}               /* upper lip shade */
.enc-seal::before{content:"";position:absolute;inset:6%;border-radius:50%;pointer-events:none;
  border:1px solid rgba(16,185,129,0.5)}       /* teal enamel inlay — pigment, not glow */
.enc-seal::after{content:"";position:absolute;inset:0;border-radius:50%;pointer-events:none;
  border:2px solid var(--success);opacity:0}
.enc-demo.is-stamped .enc-seal::after{animation:encSealPulse 900ms var(--ease-out-expo) forwards}
@keyframes encSealPulse{0%{opacity:.9;transform:scale(1)}100%{opacity:0;transform:scale(1.9)}}
.enc-shield{position:relative;z-index:1;width:76px;height:auto;filter:drop-shadow(0 1px 2px rgba(0,0,0,0.5))}
/* draw contract preserved; retargeted from scroll (.p2pe-shield.visible) to the demo finale.
   The fast draw is the WIND-UP; the STAMP (.is-stamped, fired from JS after a held beat) is the payoff. */
.shield-outline,.shield-check{stroke-dasharray:1;stroke-dashoffset:1}
.enc-demo.is-secure .shield-outline{animation:draw .35s var(--ease-out-expo) .05s forwards}
.enc-demo.is-secure .shield-check{animation:draw .3s var(--ease-out-expo) .35s forwards}
@keyframes draw{to{stroke-dashoffset:0}}

/* ---- STAMP: the seal punches HARD into the leather; its impact throws flash + shockwave + thunk ---- */
.enc-demo.is-stamped .enc-seal{animation:encStamp 560ms var(--ease-out-expo)}
@keyframes encStamp{0%{transform:scale(1)}26%{transform:scale(0.74)}60%{transform:scale(1.11)}100%{transform:scale(1)}}
/* within-demo flash bloom (bright warm-white core -> teal), centered on the seal, screen-blended, contained by isolate.
   z-index:0 = BEHIND the pipeline/seal content (z-index:1) so the light glows behind the seal, never in front.
   Radius is BOUNDED (210px at the seal) — it must NOT reach the pipeline node row (only brightness was raised, not reach). */
.enc-demo::after{content:"";position:absolute;inset:0;pointer-events:none;z-index:0;opacity:0;transform-origin:50% 83%;
  background:radial-gradient(circle 210px at 50% 83%,rgba(240,255,248,1),rgba(120,255,205,0.72) 24%,rgba(16,185,129,0.55) 42%,rgba(16,185,129,0) 72%);
  mix-blend-mode:screen}
/* the flash BLOOMS outward from the seal (scale) then fades — a slower, boomier release */
.enc-demo.is-stamped::after{animation:encFlash 780ms ease-out}
@keyframes encFlash{0%{opacity:0;transform:scale(0.6)}13%{opacity:1}100%{opacity:0;transform:scale(1.45)}}
/* whole-demo thunk (one decaying bounce) */
.enc-demo.is-stamped{animation:encThunk 400ms var(--ease-out-expo)}
@keyframes encThunk{0%{transform:translateY(0)}20%{transform:translateY(6px)}50%{transform:translateY(-3px)}76%{transform:translateY(1.5px)}100%{transform:translateY(0)}}
/* expanding shockwave ring(s) (JS-spawned .enc-shock, TWO of them for a layered impact); transform-scaled so
   it never grows scrollWidth, and #security's .section overflow:hidden clips it. Bright/thick for punch;
   capped scale keeps each ring below the node row (no light at the pipeline cards). */
.enc-shock{position:absolute;width:300px;height:300px;border-radius:50%;pointer-events:none;z-index:0;
  transform:translate(-50%,-50%);  /* base-center on its (left,top) seal point — so a non-filled animation frame never shoves it down-right */
  border:3px solid rgba(120,255,205,0.9);box-shadow:0 0 34px 4px rgba(16,185,129,0.6),inset 0 0 30px rgba(16,185,129,0.4)}
/* finale ICON REACTION (user, 2026-07-06): as the seal stamps, each node's ICON POPS (scale + brighten) in a
   left->right sweep. The pop lives on the SVG (a child), NOT the node — so it never fights the per-beat node
   scale and casts NO outward glow (brightness only lightens the glyph itself). */
.enc-demo.is-stamped .enc-node svg{animation:encIconPop 560ms var(--ease-out-expo)}
.enc-demo.is-stamped .enc-step[data-step="1"] .enc-node svg{animation-delay:60ms}
.enc-demo.is-stamped .enc-step[data-step="2"] .enc-node svg{animation-delay:190ms}
.enc-demo.is-stamped .enc-step[data-step="3"] .enc-node svg{animation-delay:320ms}
.enc-demo.is-stamped .enc-step[data-step="4"] .enc-node svg{animation-delay:450ms}
@keyframes encIconPop{0%,100%{transform:scale(1);filter:none}42%{transform:scale(1.45);filter:brightness(1.7)}}

/* ---------- 17b. PARALLAX BRAND BAND ("the CDK wedge") ----------
   Full-height cinematic moment. Absolutely-stacked brand layers each DRIFT by their own --dy
   as the band crosses the viewport; main.js parallaxBand() sets --p (0..1) from a passive,
   IO-gated scroll listener — the page scroll itself is never touched. Gentle proximity
   the pageStepper drags to it. Reduced motion: --p parked at .5 (flat). */
.pband{position:relative;min-height:100vh;overflow:hidden;background:var(--bg-primary);
  border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}
.pband-stage{--p:.5;position:relative;width:100%;min-height:100vh;display:grid;place-items:center}
.player{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none;
  transform:translate3d(0,calc((var(--p) - .5) * var(--dy,0px)),0);will-change:transform}

.player--mark{--dy:-90px;opacity:.05}
.pband-mark{width:min(74vw,820px);height:auto}
.player--glow{--dy:-46px}
.player--glow::before{content:"";width:min(82vw,1000px);height:min(82vw,1000px);border-radius:50%;
  background:radial-gradient(circle,rgba(255,140,35,.16),rgba(178,54,63,.05) 45%,transparent 66%);filter:blur(12px)}
.player--arcs{--dy:130px;display:flex;align-items:center;justify-content:space-between;
  padding:0 clamp(8px,6vw,120px);color:var(--orange);opacity:.09}
.player--arcs svg{width:min(42vw,460px);height:auto}
.pband-arcs-flip{transform:scaleX(-1)}
/* Title player is position:RELATIVE (bg layers stay absolute): it's the one layer with real
   content (copy + booking form), so it must size the stage — taller-than-viewport content grows
   the band instead of clipping under .pband's overflow:hidden. */
.player--title{--dy:36px;z-index:2;pointer-events:auto;position:relative;inset:auto;width:100%;
  max-width:1180px;padding:110px 24px 72px;place-self:center}
.pband-grid{display:grid;grid-template-columns:1.05fr 1fr;gap:clamp(32px,4.5vw,72px);align-items:center;width:100%}
.pband-copy{text-align:left}
.pband-copy .final-trust{margin-top:28px}
.pband-kicker{display:inline-block;font-size:.78rem;font-weight:600;letter-spacing:var(--tracking-wide);
  text-transform:uppercase;color:var(--orange);margin:0 0 18px}
.pband-title{font-size:clamp(2.2rem,3.6vw,3.3rem);line-height:1.08;letter-spacing:-0.025em;font-weight:800;margin:0 0 20px} /* sized for the copy COLUMN (~550px), not full width — bigger wraps "now," ragged */
.pband-title .grad-text{white-space:nowrap} /* the gradient phrase must never split across lines — keep it SHORT (1-2 words) or it overflows on mobile */
.pband-sub{font-size:clamp(1rem,1.4vw,1.2rem);line-height:1.6;color:var(--text-secondary);max-width:46ch;margin:0 0 4px}

@media (max-width:1024px){
  .pband{scroll-snap-align:none} /* stacked band is taller than the viewport — center-snap would trap the middle */
  .pband-grid{grid-template-columns:1fr;gap:40px}
  .pband-copy{text-align:center}
  .pband-copy .pband-sub{margin-inline:auto}
  .pband-copy .final-trust{justify-content:center;display:flex;flex-wrap:wrap;gap:12px 24px}
  .player--title{padding:96px 24px 56px}
}
@media (max-width:768px){
  .pband,.pband-stage{min-height:84vh}
  .player--arcs{opacity:.07;padding:0 4px}
}
@media (prefers-reduced-motion:reduce){
  html{scroll-snap-type:none}
  .player{transform:none}
}

/* ---------- 18. SCROLL REVEALS ---------- */
.fade-up{opacity:0;transform:translateY(24px);transition:opacity var(--dur-slow) var(--ease-out-expo),transform var(--dur-slow) var(--ease-out-expo)}
.fade-up.visible{opacity:1;transform:none}
/* stagger children within a revealed grid */
.pain-cards.visible .pain-card,.callout-grid.visible .callout-item{animation:none}

/* ---------- 19. RESPONSIVE ---------- */
@media (max-width:1024px){
  .hero-grid{grid-template-columns:1fr;gap:var(--space-6)}
  .hero-stage{min-height:300px;order:2}
  .callout-grid{grid-template-columns:repeat(2,1fr);max-width:520px}
  .footer-grid{grid-template-columns:1fr 1fr}
  .department-cards,.growth-cards{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:768px){
  .nav-links{display:none}
  /* Keep the primary CTA in the already-sticky top bar on phones: logo … [Book a Demo] [☰] */
  .nav-cta{margin-left:auto;margin-right:12px;flex:none}
  .nav-cta .btn{white-space:nowrap}
  .nav-links.open{display:flex;flex-direction:column;position:absolute;top:72px;left:0;right:0;gap:18px;
    padding:24px;background:var(--glass-bg);-webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));border-bottom:1px solid var(--border-color)}
  .mobile-toggle{display:flex}
  /* Solutions dropdown flattens into the mobile panel: hide the button, inline the links */
  .nav-drop{display:contents}
  .nav-drop-btn{display:none}
  .nav-drop-menu{position:static;min-width:0;padding:0;border:none;border-radius:0;background:none;
    -webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none;
    opacity:1;visibility:visible;transform:none;transition:none;gap:18px}
  .nav-drop-menu::before{display:none}
  .nav-drop-menu a{padding:0;border-radius:0;font-size:0.95rem}
  .nav-drop-menu a:hover{background:none}
  .pricing-cards{grid-template-columns:1fr}
  /* Bento collapses to a single stack: leak lead, then the two stat cards */
  .pain-bento{grid-template-columns:1fr;grid-template-areas:"lead" "cdk" "pci";gap:16px}
  .pain-card--lead{padding:28px}
  .calc-controls{grid-template-columns:1fr;gap:24px}
  /* Cluster collapses: center dial stays the hero, side dials become carmine/teal readout chips */
  .cluster{grid-template-columns:1fr 1fr;gap:12px;align-items:stretch;margin-bottom:14px}
  .dial--center{grid-column:1 / -1;order:-1;width:min(100%,330px);margin:0 auto 6px}
  .dial--side .dial-svg{display:none}
  .dial--side{border-radius:var(--radius-md);padding:10px 14px}
  .dial--before{background:rgba(178,54,63,0.07);border:1px solid rgba(178,54,63,0.30)}
  .dial--after{background:rgba(16,185,129,0.06);border:1px solid rgba(16,185,129,0.26)}
  .dial--side .dial-readout{width:100%;justify-content:space-between;margin-top:0}
  /* Flow: no pin, no rail — today's stacked scroll-linked draw */
  #how-it-works{overflow:hidden}
  .flow-runway{height:auto}
  .flow-pin{position:static;height:auto;display:block}
  .flow{display:block;height:auto;margin-bottom:var(--space-8)}
  .flow-rail{display:none}
  .flow-diagram{display:block}
  .flow-track{display:grid;gap:22px;padding-left:6px}
  .flow-track::before{content:"";position:absolute;left:27px;top:24px;bottom:24px;width:2px;border-radius:2px;
    background:var(--gradient-brand);transform:scaleY(clamp(0,calc(var(--flow-progress)/0.5),1));transform-origin:top}
  .flow-node{display:grid;grid-template-columns:56px 1fr;align-items:center;gap:16px}
  .flow-dot{display:grid}
  .flow-body{padding:20px 24px}
  .branch-card{display:block;padding:20px 24px}
  .flow-branch,.flow-merge{display:block}
  .flow-node--final{display:block;max-width:none;margin:0}
  .flow-icon--ok{display:none} /* the final dot already carries the check */
  .flow-node--final .flow-body{grid-template-columns:1fr}
  /* Safety: never spotlight-dim, ghost, or drift outside the pinned experience */
  .flow[data-active] :is(.flow-node,.flow-node[data-step],.flow-node--final,.branch-card,.branch-lines,.merge-lines){
    opacity:1;transform:none;filter:none;pointer-events:auto}
  .flow{transform:none}
  .branch-cards{grid-template-columns:1fr}
  .branch-lines{display:none}
  .flow-branch{padding-top:20px}
  .merge-lines{display:none}
  .flow-merge{padding-top:0;margin-top:8px}
  .cdk-demo{flex-direction:column}
  .cdk-wire{width:2px;height:34px;min-width:0;max-width:none;background:linear-gradient(180deg,var(--orange),var(--success))}
  .cdk-panel{width:100%;max-width:320px}
  .cdk-pulse{display:none}
  .cdk-seal{width:28%} /* clears the hc-brand wordmark on the small card */
  .cdk-seal-core{gap:3px}
  .cdk-seal-text{font-size:0.68rem} .cdk-seal-text strong{font-size:0.86rem}
  .cdk-seal-check svg{width:16px;height:16px}
  .hero-card-scene{width:min(86%,330px);margin:0 auto}
  .hero-card{--tiltY:-12deg;--tiltX:6deg}
  .hc-chip{left:20px;width:40px;height:30px} /* keeps the base rule's middle-left top:44% */
  .hc-wave{top:20px;right:20px;width:30px;height:30px}
  .hc-brand{left:20px;bottom:42px;font-size:1.1rem} /* short enough to clear the welded seal */
  .hc-number{left:20px;bottom:18px;gap:11px}
  .hc-number i::before{font-size:0.68rem}
}
@media (max-width:480px){
  .callout-grid{grid-template-columns:1fr}
  .department-cards,.growth-cards{grid-template-columns:1fr}
  .hero-buttons .btn{width:100%}
  .cluster{grid-template-columns:1fr}
  .footer-grid{grid-template-columns:1fr}
}

/* ---------- 20. REDUCED MOTION ---------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:0.001ms!important;animation-iteration-count:1!important;transition-duration:0.001ms!important;scroll-behavior:auto!important}
  .fade-up{opacity:1;transform:none}
  html{scroll-snap-type:none}
  .section-header .eyebrow,.section-header h2,.section-header p{transform:none}
  .section-header::before{transform:translateX(-50%)}
  .flow{--flow-progress:1}
  .flow-runway{height:auto}
  .flow-pin{position:static;height:auto;display:block}
  .flow{height:auto;margin-bottom:var(--space-8)}
  .rail-head{display:none}
  .flow[data-active] :is(.flow-node,.flow-node[data-step],.flow-node--final,.branch-card,.branch-lines,.merge-lines){
    opacity:1;transform:none;filter:none;pointer-events:auto}
  .flow{transform:none}
  .hero-card-float,.hero-card-shadow{animation:none!important;opacity:1}
  .logo-marquee-track{animation:none;transform:none}
  .logo-marquee--warm .logo-chip span{filter:none}
  .ct-body,.ct-card,.ct-card-wave,.cdk-cta svg,.cdk-pulse{animation:none!important}
  .shield-outline,.shield-check{stroke-dashoffset:0}
  .gauge-value{transition:none}
  .gauge-needle,.dial-needle,.odo-strip{transition:none}
  .calc-binnacle::after{transition:none}
  .enc-comet,.enc-seal::after,.enc-comet::before,.enc-shock,.enc-demo::after{display:none}
  .enc-rail-fill,.enc-step,.enc-node,.enc-card,.enc-card-state{transition:none}
  .enc-card.enc-punch,.enc-demo.is-stamped,.enc-demo.is-stamped .enc-seal,.enc-demo.is-stamped .enc-node{animation:none!important}
}

/* ---------- 21. ABOUT PAGE — numbers stat band + operating principles (Wave 1 item 9) ---------- */
/* Three-up stat band: reuses .trust-band's dark liquid-glass recipe (border-box gradient rim,
   backdrop blur) but as an even 3-column grid instead of the seal+2-stat+copy layout, since all
   three entries here are equal-weight brand numbers, not a stat-plus-explanation pairing. */
/* Story prose: the global reset zeroes <p> margins, so give the plain stacked paragraphs
   real rhythm (this page has no card/table scaffolding to space them). #story only exists
   on /about/. */
#story p{margin:0 0 18px;font-size:1.02rem;color:var(--text-secondary)}
#story p:last-child{margin-bottom:0}
#story p a{font-weight:600}
.about-stats{position:relative;display:grid;grid-template-columns:repeat(3,1fr);gap:0;
  border-radius:var(--radius-lg);border:1px solid transparent;overflow:hidden;
  background:
    linear-gradient(160deg,rgba(255,255,255,0.05),rgba(255,255,255,0) 42%) padding-box,
    linear-gradient(rgba(7,10,18,0.62),rgba(7,10,18,0.62)) padding-box,
    linear-gradient(168deg,rgba(255,255,255,0.20),rgba(255,255,255,0.05) 30%,rgba(255,255,255,0.02) 62%,rgba(255,255,255,0.10)) border-box;
  -webkit-backdrop-filter:blur(22px) saturate(1.5);backdrop-filter:blur(22px) saturate(1.5);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.10),inset 0 -16px 30px -20px rgba(0,0,0,0.45)}
.about-stat{position:relative;padding:36px 30px;text-align:center}
.about-stat + .about-stat::before{content:"";position:absolute;left:0;top:20%;bottom:20%;width:1px;
  background:var(--border-color)}
.about-stat .count{display:block;font-size:clamp(2.4rem,1.8rem + 2.2vw,3.2rem);font-weight:800;
  line-height:1;letter-spacing:-0.02em;color:var(--orange);font-variant-numeric:tabular-nums}
.about-stat-label{display:block;margin-top:10px;font-size:0.82rem;font-weight:600;
  color:var(--text-secondary);text-transform:uppercase;letter-spacing:var(--tracking-wide)}
/* The non-animated stat ("Houston, TX") gets the same display treatment as the .count
   numbers so the three cells read as equal-weight brand facts. */
.about-stat-figure{display:block;font-size:clamp(2.4rem,1.8rem + 2.2vw,3.2rem);font-weight:800;
  line-height:1;letter-spacing:-0.02em;color:var(--orange)}

/* Operating principles: four equal cards, same surface language as .pain-card but a neutral
   orange top edge (these are strengths, not pain points, so no carmine). */
.principle-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:var(--space-8)}
.principle-card{position:relative;padding:28px 26px;border-radius:var(--radius-card);
  border-top:2px solid var(--orange);transition:transform var(--dur-normal) var(--ease-out-expo),box-shadow var(--dur-normal) ease}
.principle-card:hover{transform:translateY(-4px);
  box-shadow:inset 0 1px 0.5px rgba(255,255,255,0.4),inset -1px -3px 9px rgba(0,0,0,0.36),
    0 0 0 1px rgba(255,140,35,0.28),0 0 40px rgba(255,140,35,0.14),0 30px 60px rgba(0,0,0,0.5)}
.principle-card h3{font-size:1.05rem;margin-bottom:8px}
.principle-card p{font-size:0.92rem;margin:0}
.principle-card p a{color:var(--orange);font-weight:600}
.principle-card p a:hover{text-decoration:underline}

@media (max-width:1024px){
  .principle-cards{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:768px){
  .about-stats{grid-template-columns:1fr}
  .about-stat + .about-stat::before{left:20%;right:20%;top:0;bottom:auto;width:auto;height:1px}
}
@media (max-width:480px){
  .principle-cards{grid-template-columns:1fr}
}
@media (prefers-reduced-motion:reduce){
  .principle-card{transition:none}
}

/* ---------- 20. CONTACT PAGE (Wave 1 item 10, /contact-us/) ----------
   Two contact-channel cards (phone, email) share the .pain-card/.principle-card surface
   language (neutral orange top edge, same hover lift) but add a centered icon chip + a link
   row, since each card's job is "get the visitor to tap/click a channel" rather than state a
   fact. #quick-answers reuses the .principle-card glass recipe as whole-card links (4 teasers
   to shipped deep pages). The booking section reuses .cta-form-card/.glass (the exact recipe
   from the homepage's parallax finale) inside a plain two-column grid — no parallax here, this
   is a normal .section, not .pband — so the same iframe skeleton/sizing holds without dragging
   in the drift/scroll-snap machinery. #location is a single centered glass locator card (map
   pin + canonical address + Get directions), no map embed per COPY-VOICE.md. */
.contact-cards{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-top:var(--space-8);max-width:640px;margin-left:auto;margin-right:auto}
.contact-card{position:relative;padding:32px 28px;border-radius:var(--radius-card);
  border-top:2px solid var(--orange);text-align:center;
  transition:transform var(--dur-normal) var(--ease-out-expo),box-shadow var(--dur-normal) ease}
.contact-card:hover{transform:translateY(-4px);
  box-shadow:inset 0 1px 0.5px rgba(255,255,255,0.4),inset -1px -3px 9px rgba(0,0,0,0.36),
    0 0 0 1px rgba(255,140,35,0.28),0 0 40px rgba(255,140,35,0.14),0 30px 60px rgba(0,0,0,0.5)}
.contact-card-icon{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;
  margin:0 auto 18px;border-radius:var(--radius-md);background:rgba(255,140,35,0.10);
  border:1px solid rgba(255,140,35,0.28);color:var(--orange)}
.contact-card-icon svg{width:24px;height:24px}
.contact-card h3{font-size:1.1rem;margin-bottom:8px}
.contact-card p{font-size:0.92rem;color:var(--text-secondary);margin:0 0 18px}
.contact-card-link{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--orange);font-size:1rem}
.contact-card-link:hover{text-decoration:underline}
.contact-card-link svg{width:15px;height:15px;flex:none;transition:transform var(--dur-fast) ease}
.contact-card-link:hover svg{transform:translateX(3px)}

/* Quick answers: whole-card links (the .principle-card glass recipe, kept a distinct class
   since the interaction is different — the entire card is the <a>, not just a link row). */
.quick-answer-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:var(--space-8)}
.quick-answer-card{display:block;position:relative;padding:28px 26px;border-radius:var(--radius-card);
  border-top:2px solid var(--orange);
  transition:transform var(--dur-normal) var(--ease-out-expo),box-shadow var(--dur-normal) ease}
.quick-answer-card:hover,.quick-answer-card:focus-visible{transform:translateY(-4px);
  box-shadow:inset 0 1px 0.5px rgba(255,255,255,0.4),inset -1px -3px 9px rgba(0,0,0,0.36),
    0 0 0 1px rgba(255,140,35,0.28),0 0 40px rgba(255,140,35,0.14),0 30px 60px rgba(0,0,0,0.5)}
.quick-answer-card:focus-visible{outline:2px solid var(--orange);outline-offset:3px}
.quick-answer-card h3{font-size:1.05rem;margin-bottom:8px}
.quick-answer-card p{font-size:0.92rem;color:var(--text-secondary);margin:0 0 16px}
.quick-answer-link{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--orange);font-size:0.92rem}
.quick-answer-link svg{width:15px;height:15px;flex:none;transition:transform var(--dur-fast) ease}
.quick-answer-card:hover .quick-answer-link svg,.quick-answer-card:focus-visible .quick-answer-link svg{transform:translateX(3px)}

/* Booking section: copy + trust list left, form card right, plain (non-parallax) two-column layout. */
.contact-book-grid{display:grid;grid-template-columns:0.85fr 1fr;gap:clamp(32px,4.5vw,64px);align-items:center}
.contact-book-copy{display:flex;flex-direction:column;gap:24px}
.contact-book-copy>p{color:var(--text-secondary);font-size:1.05rem;margin:0}
.contact-book-copy .final-trust{margin:0}
.contact-book-phone{font-size:0.95rem;color:var(--text-muted)}
.contact-book-phone a{color:var(--orange);font-weight:600}
.contact-book-phone a:hover,.contact-book-phone a:focus-visible{text-decoration:underline}

/* Location: single centered glass locator card, reuses the .glass recipe (not .principle-card,
   this is a standalone fact card with no grid siblings). */
.location-card{position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;
  max-width:420px;margin:var(--space-8) auto 0;padding:36px 32px;border-radius:var(--radius-card)}
.location-card-icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;
  margin-bottom:18px;border-radius:var(--radius-md);background:rgba(255,140,35,0.10);
  border:1px solid rgba(255,140,35,0.28);color:var(--orange)}
.location-card-icon svg{width:26px;height:26px}
.location-card-address{font-style:normal;font-size:1.05rem;color:var(--text-primary);line-height:1.5;margin-bottom:18px}
.location-card-link{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--orange);font-size:1rem}
.location-card-link:hover,.location-card-link:focus-visible{text-decoration:underline}
.location-card-link svg{width:15px;height:15px;flex:none;transition:transform var(--dur-fast) ease}
.location-card-link:hover svg,.location-card-link:focus-visible svg{transform:translateX(3px)}

@media (max-width:1024px){
  .quick-answer-cards{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:768px){
  .contact-cards{grid-template-columns:1fr;max-width:360px}
  .contact-book-grid{grid-template-columns:1fr;gap:32px}
}
@media (max-width:480px){
  .quick-answer-cards{grid-template-columns:1fr}
  .location-card{padding:28px 24px}
}
@media (prefers-reduced-motion:reduce){
  .contact-card,.quick-answer-card{transition:none}
}

/* ---------- 18. LEGAL PAGES (/privacy-policy/ /terms-conditions/ /surcharge-policy/) ----------
   Quiet long-form prose on the shared subpage scaffold. Legal pages are the ONE approved
   deviation from the demo-CTA closer (COPY-VOICE "Legal pages claims" block, grilled
   2026-07-13): they end at .page-outro ("Questions? Contact us" -> /contact-us/), never
   .page-cta. Body copy restores real list bullets (the global reset strips them). */
.legal-meta{font-size:0.85rem;color:var(--text-muted);margin-top:var(--space-4)}
.legal-body{max-width:74ch}
.legal-body h2{font-size:1.5rem;margin:var(--space-8) 0 var(--space-4)}
.legal-body h2:first-of-type{margin-top:0}
.legal-body h3{font-size:1.12rem;margin:var(--space-5) 0 12px}
.legal-body p{color:var(--text-secondary);margin-bottom:var(--space-4)}
.legal-body ul{list-style:disc;padding-left:1.35em;margin-bottom:var(--space-4);color:var(--text-secondary)}
.legal-body li{margin-bottom:8px;padding-left:4px}
.legal-body li::marker{color:var(--orange)}
.legal-body a{color:var(--orange);font-weight:600}
.legal-body a:hover,.legal-body a:focus-visible{text-decoration:underline}
.legal-note{margin:0 0 var(--space-6);padding:14px 20px;border-left:3px solid var(--orange);
  background:rgba(255,140,35,0.06);border-radius:0 var(--radius-md) var(--radius-md) 0;
  color:var(--text-secondary);font-size:0.95rem}
.page-outro{text-align:center}
.page-outro p{color:var(--text-muted);font-size:var(--text-body);max-width:52ch;margin:0 auto}
.page-outro a{color:var(--orange);font-weight:700}
.page-outro a:hover,.page-outro a:focus-visible{text-decoration:underline}
