.elementor-3248 .elementor-element.elementor-element-jsfcanv01{padding:0px 0px 0px 0px;}.elementor-3248 .elementor-element.elementor-element-jsfcanv0c > .elementor-element-populated{padding:0px 0px 0px 0px;}/* Start custom CSS */@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,900;1,9..144,400;1,9..144,500&amp;family=Inter:wght@400;500;600;700&amp;display=swap');
/* == JSF flagship campaign (managed) == */
/* ---- tokens (from src/design/tokens.css) + local palette (campaign.css .camp) ---- */
.camp{
  --font-display:"Fraunces",Georgia,serif; --font-body:"Inter",system-ui,sans-serif;
  --ink:#23221f; --paper:#fbf6e8; --warm:#f6efdc; --stage:#14120e; --stage-2:#1c1913;
  --gold:#daa520; --gold-deep:#7a5e0c; --gold-text-light:#5a4a12;
  --rule:rgba(35,34,31,0.14); --rule-strong:rgba(35,34,31,0.26);
  --on-dark:#f4efe2; --on-dark-mut:rgba(244,239,226,0.74);
  --color-sand:#eace84; --color-gray-light:#b3b0aa; --text-muted:#65645e;
  --radius-sm:6px; --radius-md:10px; --radius-lg:16px; --radius-pill:999px;
  --shadow-card:0 8px 24px rgba(35,34,31,0.08);
  --dur-fast:120ms; --dur-base:200ms; --dur-slow:400ms;
  --ease-out:cubic-bezier(0.16,1,0.3,1); --ease-standard:cubic-bezier(0.4,0,0.2,1);
  /* motion vocabulary — one easing family, four named tiers */
  --m-ease:cubic-bezier(0.22,1,0.36,1); --m-ease-out:cubic-bezier(0.16,1,0.3,1);
  --m-fast:190ms; --m-reveal:660ms; --m-narrative:1100ms; --m-story:1900ms; --m-step:90ms;
  --container-full:100%; --container-wide:1440px; --container-content:1200px;
  --container-reading:72ch; --container-narrow:640px; --gutter:24px; --gutter-mobile:16px;
  margin:0; font-family:var(--font-body); color:var(--ink); background:var(--paper);
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
}
.camp *{box-sizing:border-box;}
.camp img{display:block; max-width:100%;}
.camp :where(h1,h2,h3,h4,h5,h6,p,ul,ol,li,figure,blockquote,dl,dd,dt,fieldset,legend){margin:0; padding:0;}
.camp :where(h1,h2,h3,h4,h5,h6,p,li,blockquote,figcaption,dt,dd,legend,label){color:inherit; font-family:inherit;}
.camp :where(ul,ol){list-style:none;}
.camp :where(a){color:inherit;}
/* the host Elementor kit uppercases headings; the flagship Fraunces display type
   is sentence-case by design (restore the approved decision after full replace). */
.camp h1,.camp h2,.camp h3,.camp h4,.camp h5,.camp h6{text-transform:none !important;}
.camp .visually-hidden{position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;}

/* ---- containers (from src/design/grid.css) ---- */
.camp .container{width:100%; margin-inline:auto; padding-inline:var(--gutter); max-width:var(--container-content);}
.camp .container--full{max-width:var(--container-full); padding-inline:0;}
.camp .container--wide{max-width:var(--container-wide);}
.camp .container--content{max-width:var(--container-content);}
.camp .container--reading{max-width:var(--container-reading);}
.camp .container--narrow{max-width:var(--container-narrow);}

/* ---- buttons ---- */
.camp .btn{--_bg:transparent; --_fg:currentColor; display:inline-flex; align-items:center; justify-content:center; gap:0.5em; font-family:var(--font-body); font-weight:600; font-size:1rem; line-height:1; padding:0.95em 1.6em; border-radius:var(--radius-pill); border:1.5px solid transparent; background:var(--_bg); color:var(--_fg); text-decoration:none; cursor:pointer; transition:transform var(--dur-fast) var(--ease-out),background var(--dur-base),color var(--dur-base),border-color var(--dur-base);}
.camp .btn--primary{--_bg:var(--gold); --_fg:var(--ink); box-shadow:0 8px 24px rgba(218,165,32,0.3);}
.camp .btn--primary:hover{--_bg:var(--gold-deep); --_fg:#fff; transform:translateY(-1px);}
.camp .btn--ghost{border-color:currentColor;}
.camp .btn--ghost:hover{background:rgba(255,255,255,0.12);}
.camp .btn--block{width:100%;}
.camp .btn:focus-visible{outline:3px solid var(--gold); outline-offset:3px;}

/* ---- nav ---- */
.camp .nav{position:fixed; inset:0 0 auto 0; z-index:100; border-bottom:1px solid transparent; transition:background var(--dur-slow),border-color var(--dur-slow);}
.camp .nav__row{display:flex; align-items:center; justify-content:space-between; padding-block:18px;}
.camp .nav__logo{height:26px; width:auto;}
.camp .nav .nav__logo--onLight{display:none;}
.camp .nav__links{display:flex; align-items:center; gap:28px;}
.camp .nav__links a{color:var(--on-dark); text-decoration:none; font-size:0.95rem; font-weight:500; opacity:0.88;}
.camp .nav__links a:hover{opacity:1;}
.camp .nav__give{border:1.5px solid rgba(244,239,226,0.5); border-radius:var(--radius-pill); padding:0.5em 1.1em; opacity:1 !important;}
.camp .nav__give:hover{background:var(--gold); color:var(--ink) !important; border-color:var(--gold);}
.camp .nav.is-solid{background:rgba(251,246,232,0.92); backdrop-filter:blur(10px); border-color:var(--rule);}
.camp .nav.is-solid .nav__logo--onDark{display:none;}
.camp .nav.is-solid .nav__logo--onLight{display:block;}
.camp .nav.is-solid .nav__links a{color:var(--ink);}
.camp .nav.is-solid .nav__give{border-color:var(--rule-strong);}
.camp .ampule{width:52px; height:168px; border-radius:26px; background:linear-gradient(180deg,rgba(255,255,255,0.06),rgba(0,0,0,0.3)); border:1px solid rgba(218,165,32,0.28); position:relative; overflow:hidden; box-shadow:inset 0 0 30px rgba(0,0,0,0.5);}
.camp .ampule__charge{position:absolute; inset:4px; border-radius:22px; background:linear-gradient(180deg,rgba(218,165,32,0.95),rgba(122,94,12,0.55)); box-shadow:0 0 24px rgba(218,165,32,0.6),inset 0 0 12px rgba(255,240,200,0.5);}
.camp .ampule--sm{width:40px; height:120px; margin:0 auto 18px;}
.camp .ampule__label{text-align:center; margin:0;}
.camp .ampule__label b{display:block; font-size:0.72rem; letter-spacing:0.16em; text-transform:uppercase; color:var(--gold);}
.camp .ampule__label span{display:block; font-size:0.8rem; color:rgba(244,239,226,0.75); margin-top:4px;}

/* ---- chapters / prose / caps ---- */
.camp .chapter{position:relative;}
.camp .chapter--paper{background:var(--paper);}
.camp .chapter--warm{background:var(--warm);}
.camp .chapter--stage{background:radial-gradient(120% 90% at 50% 0%,var(--stage-2),var(--stage)); color:var(--on-dark);}
.camp .chapter__head{margin-bottom:clamp(28px,4vw,52px);}
.camp .chapter__num{display:block; font-family:var(--font-display); font-size:clamp(2rem,4vw,3rem); font-weight:500; color:var(--gold-text-light); line-height:1; margin-bottom:0.3em; padding-bottom:0.3em; border-bottom:2px solid var(--gold); width:max-content; min-width:1.4em;}
.camp .chapter__num--onDark{color:var(--gold);}
.camp .chapter__title{font-family:var(--font-display); font-weight:500; font-size:clamp(1.9rem,4vw,3.4rem); line-height:1.04; letter-spacing:-0.015em; margin:0; max-width:22ch; text-wrap:balance;}
.camp .chapter__title--onDark{color:var(--on-dark);}
.camp .chapter__lede{font-size:clamp(1.05rem,1.6vw,1.3rem); color:var(--on-dark-mut); margin:18px 0 0; max-width:40ch;}
.camp .prose{font-size:clamp(1.08rem,1.4vw,1.28rem); line-height:1.62;}
.camp .prose p{margin:0 0 1.1em; max-width:62ch;}
.camp .prose strong{font-weight:700;}
.camp .prose .drop::first-letter{font-family:var(--font-display); font-weight:500; float:left; font-size:3.6em; line-height:0.72; padding:0.06em 0.12em 0 0; color:var(--gold-text-light);}
.camp .caps{list-style:none; padding:0; margin:1.4em 0 0; max-width:62ch;}
.camp .caps li{font-family:var(--font-display); font-size:clamp(1.15rem,2vw,1.6rem); font-weight:500; padding:0.6em 0; border-top:1px solid var(--rule); display:flex; align-items:baseline; gap:0.9em;}
.camp .caps li:last-child{border-bottom:1px solid var(--rule);}
.camp .caps span{font-family:var(--font-body); font-size:0.7rem; font-weight:700; color:var(--gold-text-light); letter-spacing:0.06em;}

/* ---- figures / caption ---- */
.camp .figure{margin:0;}
.camp .figure--bleed{margin-top:clamp(48px,7vw,96px);}
.camp .figure--bleed img{width:100%; max-height:76vh; object-fit:cover;}
.camp .figure figcaption{font-size:0.86rem; color:var(--text-muted); padding:12px 0 0; max-width:60ch;}
.camp .figure--bleed figcaption{box-sizing:content-box; padding-inline:max(var(--gutter),calc((100% - var(--container-content)) / 2));}
@media (max-width:768px){.camp .figure--bleed figcaption{padding-inline:var(--gutter-mobile);}}

/* ---- SIGNATURE MOMENT: the doubling ($1 → prism → $2) ---- */
/* margin-left/right:auto !important defeats the host theme's figure{margin:0}
   reset (which otherwise left-anchors this <figure> instead of centering it). */
.camp .doubling{display:flex; align-items:center; justify-content:center; flex-wrap:nowrap; gap:clamp(18px,4vw,60px); margin-top:clamp(36px,5vw,72px); margin-bottom:0; margin-left:auto !important; margin-right:auto !important;}
.camp .doubling__side{flex:0 0 auto; display:flex; flex-direction:column; gap:12px;}
.camp .doubling__side--sum{text-align:right; align-items:flex-end;}
.camp .doubling__amt{font-family:var(--font-display); font-weight:500; font-size:clamp(3.25rem,8vw,7rem); line-height:0.82; letter-spacing:-0.02em; color:var(--ink);}
.camp .doubling__amt--gold{color:var(--gold-text-light);}
.camp .doubling__lbl{font-size:0.78rem; letter-spacing:0.14em; text-transform:uppercase; color:var(--text-muted); font-weight:600; max-width:18ch;}
.camp .doubling__lbl em{display:block; margin-top:8px; font-style:normal; text-transform:none; letter-spacing:0; font-weight:400; font-size:0.98rem; color:var(--gold-text-light);}
.camp .doubling__flow{flex:1 1 auto; min-width:0; display:flex; flex-direction:column; align-items:center; gap:8px;}
.camp .doubling__prism{display:block; width:100%; max-width:520px; aspect-ratio:720 / 220; background:center/contain no-repeat url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20720%20220'%20preserveAspectRatio%3D'xMidYMid%20meet'%3E%3Cpath%20d%3D'M20%20110%20H340'%20fill%3D'none'%20stroke%3D'%2323221f'%20stroke-width%3D'4'%20stroke-linecap%3D'round'%2F%3E%3Cpolygon%20points%3D'360%2C64%20398%2C110%20360%2C156%20322%2C110'%20fill%3D'rgba(218%2C165%2C32%2C0.16)'%20stroke%3D'%23daa520'%20stroke-width%3D'2'%2F%3E%3Cpath%20d%3D'M398%20110%20C520%20110%20570%2056%20700%2056'%20fill%3D'none'%20stroke%3D'%2323221f'%20stroke-width%3D'4'%20stroke-linecap%3D'round'%2F%3E%3Cpath%20d%3D'M398%20110%20C520%20110%20570%20164%20700%20164'%20fill%3D'none'%20stroke%3D'%23daa520'%20stroke-width%3D'4'%20stroke-linecap%3D'round'%2F%3E%3C%2Fsvg%3E");}
.camp .doubling__flow-label{font-family:var(--font-display); font-style:italic; font-size:clamp(1rem,1.5vw,1.3rem); color:var(--text-muted);}

/* ---- split / pullquote ---- */
.camp .split{display:grid; grid-template-columns:1.1fr 0.9fr; gap:clamp(28px,5vw,72px); align-items:center;}
.camp .split .figure img{width:100%; aspect-ratio:4/5; object-fit:cover;}
.camp .pullquote{font-family:var(--font-display); font-style:italic; font-weight:500; font-size:clamp(1.5rem,2.6vw,2.3rem); line-height:1.18; margin:0.6em 0 0; color:var(--gold-text-light); border-left:3px solid var(--gold); padding-left:0.7em;}

/* ---- impact engine ---- */
.camp .engine{position:relative; border-radius:var(--radius-lg);}
.camp .engine__stage{display:flex; flex-wrap:wrap; gap:clamp(36px,4.5vw,68px); align-items:center; justify-content:center;}
.camp .engine__readout{flex:1 1 440px; max-width:600px;}
.camp .engine__eyebrow{font-size:0.76rem; letter-spacing:0.18em; text-transform:uppercase; color:var(--color-sand); margin:0 0 14px; font-weight:600;}
.camp .engine__total{font-family:var(--font-display); font-weight:500; font-variant-numeric:tabular-nums; font-size:clamp(3.6rem,9vw,7.5rem); line-height:0.85; letter-spacing:-0.02em; color:#fff; margin:0;}
.camp .engine__of{font-variant-numeric:tabular-nums; color:var(--on-dark-mut); margin:14px 0 0; font-size:1.02rem;}
.camp .engine__zone{display:flex; align-items:center; gap:10px; margin:22px 0 0; font-size:0.98rem; color:var(--color-sand);}
.camp .engine__zone i{width:9px; height:9px; border-radius:50%; background:var(--gold); box-shadow:0 0 10px var(--gold); flex:none;}
.camp .engine__stats{display:grid; gap:0; margin:30px 0 0; border-top:1px solid rgba(244,239,226,0.16);}
.camp .engine__stats &gt; div{display:flex; align-items:baseline; justify-content:space-between; gap:16px; padding:14px 0; border-bottom:1px solid rgba(244,239,226,0.12);}
.camp .engine__stats dt{margin:0; color:var(--on-dark-mut); font-size:0.95rem;}
.camp .engine__stats dd{margin:0; font-family:var(--font-display); font-weight:500; font-variant-numeric:tabular-nums; font-size:1.5rem; color:#fff;}
.camp .engine__instrument{flex:0 0 auto; display:flex; align-items:stretch; gap:22px; height:clamp(420px,58vh,560px);}
.camp .core{position:relative; display:flex; flex-direction:column; align-items:center;}
.camp .core__ticks{position:absolute; inset:0 auto 0 0; left:-6px; width:100%; pointer-events:none;}
.camp .core__ticks span{position:absolute; left:0; transform:translateY(50%); display:flex; flex-direction:column; align-items:flex-start; gap:0; line-height:1.15; font-variant-numeric:tabular-nums;}
.camp .core__ticks em{font-style:normal; font-size:0.72rem; color:rgba(244,239,226,0.6);}
.camp .core__ticks small{font-size:0.58rem; letter-spacing:0.08em; text-transform:uppercase; color:rgba(244,239,226,0.42);}
.camp .core__ticks span::before{content:""; position:absolute; left:82px; top:50%; width:12px; height:1px; background:rgba(244,239,226,0.2);}
.camp .core__tick--cap em{color:var(--gold);}
.camp .core__tick--cap small{color:var(--color-sand);}
.camp .core__tick--cap::before{background:var(--gold) !important; height:2px !important;}
.camp .core__tube{position:relative; width:clamp(104px,13vw,148px); flex:1; margin-left:96px; border-radius:74px; background:linear-gradient(180deg,rgba(255,255,255,0.05),rgba(0,0,0,0.35)); border:1px solid rgba(218,165,32,0.18); overflow:hidden; box-shadow:inset 0 0 40px rgba(0,0,0,0.6),inset 6px 0 16px rgba(255,255,255,0.04);}
.camp .core__tube::after{content:""; position:absolute; top:6px; left:12%; width:10%; height:88%; border-radius:40px; background:linear-gradient(180deg,rgba(255,255,255,0.14),transparent 40%); z-index:3;}
.camp .core__fill{position:absolute; left:0; right:0; bottom:0; border-radius:0 0 74px 74px; display:flex; flex-direction:column-reverse; transition:height var(--dur-slow) var(--ease-out);}
.camp .core__seg{display:block; width:100%; transition:height var(--dur-slow) var(--ease-out);}
.camp .core__seg--donor{background:linear-gradient(180deg,rgba(246,211,107,0.22),rgba(120,96,30,0.42));}
.camp .core__seg--match{background:linear-gradient(180deg,rgba(218,165,32,0.62),rgba(218,165,32,0.34)); border-top:1px solid rgba(255,240,200,0.35); box-shadow:0 -1px 10px rgba(218,165,32,0.35);}
.camp .core__meniscus{position:absolute; top:-2px; left:0; right:0; height:4px; z-index:2; background:linear-gradient(90deg,#f6d36b,#daa520,#f6d36b); box-shadow:0 0 18px 2px rgba(218,165,32,0.85); border-radius:3px;}
.camp .core__lens{position:absolute; left:8%; right:8%; bottom:12%; height:2px; background:var(--gold); box-shadow:0 0 16px 3px rgba(218,165,32,0.7); opacity:0.5;}
.camp .core__inlet{position:absolute; left:50%; bottom:0; width:14px; height:14px; transform:translateX(-50%); border-radius:50%; background:radial-gradient(circle,#ffe9a8,rgba(218,165,32,0)); opacity:0.7;}
.camp .core__beam{position:absolute; bottom:12%; width:2px; height:0; opacity:0;}
.camp .core__beam--donor{left:38%; background:linear-gradient(180deg,#fff,transparent);}
.camp .core__beam--match{left:62%; background:linear-gradient(180deg,var(--gold),transparent);}
.camp .core__legend{display:flex; align-items:center; justify-content:center; gap:6px; flex-wrap:wrap; font-size:0.68rem; letter-spacing:0.04em; text-transform:uppercase; color:rgba(244,239,226,0.6); margin:14px 0 0; text-align:center;}
.camp .core__key{width:11px; height:11px; border-radius:3px; display:inline-block;}
.camp .core__key--donor{background:linear-gradient(180deg,rgba(246,211,107,0.5),rgba(120,96,30,0.6));}
.camp .core__key--match{background:var(--gold); margin-left:8px;}
.camp .reservoir{display:flex; flex-direction:column; align-items:center; justify-content:flex-end; gap:10px; padding-bottom:26px;}
.camp .reservoir__tube{position:relative; width:26px; flex:1; border-radius:14px; background:rgba(0,0,0,0.3); border:1px solid rgba(218,165,32,0.16); overflow:hidden; box-shadow:inset 0 0 16px rgba(0,0,0,0.6);}
.camp .reservoir__fill{position:absolute; left:0; right:0; bottom:0; background:linear-gradient(180deg,#f6d36b,rgba(122,94,12,0.6)); box-shadow:0 0 14px rgba(218,165,32,0.5); transition:height var(--dur-slow) var(--ease-out);}
.camp .reservoir__label{font-size:0.62rem; letter-spacing:0.1em; text-transform:uppercase; color:rgba(244,239,226,0.5); text-align:center; margin:0; line-height:1.3;}
.camp .reservoir__val{font-family:var(--font-display); font-variant-numeric:tabular-nums; font-size:0.95rem; color:var(--color-sand); margin:0;}
.camp .engine__controls{display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:18px; margin-top:40px; padding-top:24px; border-top:1px solid rgba(244,239,226,0.14);}
.camp .engine__steps{display:flex; gap:8px; flex-wrap:wrap;}
.camp .engine__step{font:inherit; font-size:0.8rem; padding:0.5em 0.9em; border-radius:var(--radius-pill); cursor:pointer; background:transparent; color:rgba(244,239,226,0.75); border:1px solid rgba(244,239,226,0.24); transition:all var(--dur-base);}
.camp .engine__step:hover{border-color:var(--gold); color:#fff;}
.camp .engine__step.is-active{background:var(--gold); color:var(--ink); border-color:var(--gold); font-weight:600;}
.camp .engine__demos{display:flex; gap:8px; flex-wrap:wrap;}
.camp .engine__demo{font:inherit; font-size:0.8rem; padding:0.5em 0.9em; border-radius:var(--radius-pill); cursor:pointer; background:rgba(244,239,226,0.06); color:var(--on-dark-mut); border:1px solid rgba(244,239,226,0.18); transition:all var(--dur-base);}
.camp .engine__demo:hover{color:#fff; border-color:rgba(244,239,226,0.4);}
.camp .engine__demo--gift{background:rgba(218,165,32,0.14); color:var(--color-sand); border-color:rgba(218,165,32,0.4); font-weight:600;}
.camp .engine__demo--gift:hover{background:rgba(218,165,32,0.24); color:#fff;}
.camp .engine__note{font-size:0.8rem; line-height:1.5; color:rgba(244,239,226,0.7); margin:22px 0 0; max-width:72ch;}
.camp .engine__note code{color:var(--color-sand);}
.camp .engine__loading{position:absolute; inset:0; z-index:5; display:flex; align-items:center; justify-content:center; gap:14px; border-radius:var(--radius-lg); background:rgba(20,18,14,0.72); backdrop-filter:blur(4px); color:var(--on-dark-mut); font-size:0.95rem;}
.camp .engine__loading[hidden]{display:none;}
.camp .engine__spinner{width:26px; height:26px; border:2px solid rgba(244,239,226,0.2); border-top-color:var(--gold); border-radius:50%;}
.camp .engine__loading:not([hidden]) .engine__spinner{animation:spin 0.8s linear infinite;}
@keyframes spin{to{transform:rotate(360deg);}}
.camp .engine__stale{display:flex; align-items:center; gap:8px; margin-bottom:18px; padding:10px 16px; border-radius:var(--radius-md); background:rgba(218,165,32,0.12); border:1px solid rgba(218,165,32,0.34); color:var(--color-sand); font-size:0.86rem;}
.camp .engine__stale[hidden]{display:none;}
.camp .engine__stale::before{content:"\26A0";}

/* ---- donation product ---- */
.camp .give{display:grid; grid-template-columns:1fr 1fr; gap:clamp(24px,4vw,56px); align-items:start;}
.camp .seg{display:inline-flex; background:rgba(35,34,31,0.06); border-radius:var(--radius-pill); padding:4px; gap:4px;}
.camp .seg__btn{font:inherit; font-weight:600; font-size:0.95rem; padding:0.6em 1.4em; border:0; border-radius:var(--radius-pill); background:transparent; color:var(--ink); cursor:pointer; transition:all var(--dur-base);}
.camp .seg__btn.is-active{background:#fff; box-shadow:var(--shadow-card);}
.camp .seg__btn[disabled]{color:var(--color-gray-light); cursor:not-allowed;}
.camp .seg__btn small{font-size:0.62em; letter-spacing:0.1em; text-transform:uppercase; vertical-align:super; margin-left:3px; color:var(--gold-text-light);}

/* ---- close / proof / footer ---- */
.camp .close{background:var(--stage); color:var(--on-dark); padding-block:clamp(56px,8vw,110px);}
.camp .foot{background:#100e0b; color:rgba(244,239,226,0.62); padding-block:44px;}

.camp .foot__brand{display:flex; align-items:center; gap:14px;}
.camp .foot__eyebrow{font-size:0.72rem; letter-spacing:0.14em; text-transform:uppercase; color:rgba(244,239,226,0.5); white-space:nowrap;}
.camp .foot__brand img{height:30px; width:auto; opacity:0.9;}
.camp .foot__patriot{filter:brightness(0) invert(1); opacity:0.55 !important;}
.camp .foot__legal{font-size:0.78rem; line-height:1.5; margin:0; max-width:60ch;}
.camp .foot__back{color:var(--color-sand); text-decoration:none; font-weight:600; white-space:nowrap;}
.camp .foot__back:hover{color:var(--gold);}
.camp .handoff{position:fixed; inset:0; z-index:300; display:grid; place-items:center; background:rgba(15,13,10,0.9); backdrop-filter:blur(8px);}
.camp .handoff[hidden]{display:none;}
.camp .handoff__card{text-align:center; color:var(--on-dark); padding:40px;}
.camp .handoff__title{font-family:var(--font-display); font-size:1.5rem; margin:0 0 6px;}
.camp .handoff__sub{color:var(--color-sand); margin:0;}

/* ---- reveal base: content is ALWAYS visible by DEFAULT (opacity defaults to
   1). Entrances are pure-CSS enhancement layered on top (see MOTION SYSTEM) and
   each fails safe — no JS, so nothing can strand content at opacity:0.
   NB: we deliberately do NOT declare .reveal opacity:1 — a competing opacity
   declaration on an element poisons the before-phase base value of that
   element's own scroll-driven (view-timeline) animation in current Chromium,
   painting it visible before it enters. Relying on the initial value is both
   correct and immune. ---- */

/* ---- interaction microinteractions: response, not spectacle ---- */
.camp .btn:active,.camp .amount:active{transform:translateY(0) scale(0.985);}
.camp .engine__step:active,.camp .engine__demo:active,.camp .seg__btn:not([disabled]):active{transform:scale(0.97);}
.camp .nav__links a:not(.nav__give){position:relative;}
.camp .nav__links a:not(.nav__give)::after{content:""; position:absolute; left:0; right:0; bottom:-4px; height:1.5px; background:currentColor; opacity:0.7; transform:scaleX(0); transform-origin:left center; transition:transform var(--m-fast) var(--m-ease);}
.camp .nav__links a:not(.nav__give):hover::after,.camp .nav__links a:not(.nav__give):focus-visible::after{transform:scaleX(1);}
.camp .foot__back{background-image:linear-gradient(currentColor,currentColor); background-repeat:no-repeat; background-size:0% 1.5px; background-position:0 100%; transition:background-size var(--m-reveal) var(--m-ease);}
.camp .foot__back:hover,.camp .foot__back:focus-visible{background-size:100% 1.5px;}

/* smooth in-page nav ("See how it works" → Section I), never landing under the fixed nav */
.camp .chapter,.camp .close{scroll-margin-top:96px;}
@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth;}}

/* ---- responsive art direction ---- */
@media (max-width:1024px){
  .camp .hero__grid{grid-template-columns:1fr;}
  .camp .hero__ampule{flex-direction:row; align-items:center; gap:16px;}
  .camp .ampule{width:40px; height:96px;}
  .camp .ampule__label{text-align:left;}
  .camp .split{grid-template-columns:1fr;}
  .camp .split .figure img{aspect-ratio:16/10;}
  .camp .engine__stage{flex-direction:column; gap:40px;}
  .camp .engine__readout{flex-basis:auto; max-width:none;}
  .camp .engine__instrument{height:440px; justify-content:center;}
}
@media (max-width:768px){
  .camp .container{padding-inline:var(--gutter-mobile);}
  .camp .nav__links a:not(.nav__give){display:none;}
  .camp .engine__controls{flex-direction:column; align-items:stretch;}
  .camp .doubling{flex-direction:column; align-items:flex-start; gap:22px;}
  .camp .doubling__side--sum{align-items:flex-start; text-align:left;}
  .camp .doubling__amt{font-size:clamp(3.5rem,20vw,5.5rem);}
  .camp .doubling__flow{width:100%; align-items:flex-start;}
  .camp .doubling__prism{max-width:380px;}
  .camp .doubling__lbl{max-width:none;}
}
@media (max-width:480px){
  .camp .ampule{width:26px; height:60px; border-radius:14px;}
  .camp .ampule__label b{font-size:0.66rem;}
  .camp .ampule__label span{font-size:0.74rem;}
  .camp .engine__instrument{height:400px; gap:14px;}
  .camp .core__tube{margin-left:78px;}
  .camp .core__ticks span::before{left:66px;}
  .camp .engine__total{font-size:clamp(3rem,15vw,4.2rem);}
}

/* ==========================================================================
   MOTION SYSTEM — directed, scene-based entrances.
   Default (above): everything is visible. The rules below are ENHANCEMENT only:
   • Scene 01 (hero) is the ONLY sequence that plays on load (0–1.8s).
   • Every scene below the fold is driven by the scroll position of its OWN
     element entering the viewport, observed by the plugin — nothing fires before the visitor
     can see it, there are no scroll listeners, and (unlike a JS observer) a
     restored mid-page scroll shows already-passed scenes resolved, never stuck.
   • @supports gates the scroll layer; browsers without it show the final
     composition. prefers-reduced-motion removes all of it.
   ========================================================================== */
@media (prefers-reduced-motion:no-preference){
  /* ---- SCENE 01 · HERO — plays once on load. Groups, not word-by-word. ---- */
  .camp .hero__kicker{opacity:0; animation:heroRise var(--m-reveal) var(--m-ease) 0.12s both;}
  .camp .hero__headline{opacity:0; animation:heroRise var(--m-reveal) var(--m-ease) 0.26s both;}
  .camp .hero__headline em{opacity:0; animation:heroFade var(--m-reveal) var(--m-ease) 0.42s both;}
  .camp .hero__sub{opacity:0; animation:heroRise var(--m-reveal) var(--m-ease) 0.65s both;}
  .camp .hero__cta{opacity:0; animation:heroRise var(--m-reveal) var(--m-ease) 0.85s both;}
  .camp .hero__equation{opacity:0; animation:heroRise var(--m-reveal) var(--m-ease) 0.95s both;}
  .camp .hero__ampule{opacity:0; animation:heroFade var(--m-reveal) var(--m-ease) 1.05s both;}
  /* ampule charge: one warm swell on arrival, then rest — no perpetual pulse */
  .camp .ampule__charge{transform-origin:bottom; animation:chargeIn var(--m-narrative) var(--m-ease-out) 0.9s both;}
  @keyframes heroRise{from{opacity:0; transform:translateY(22px);}to{opacity:1; transform:none;}}
  @keyframes heroFade{from{opacity:0;}to{opacity:1;}}
  @keyframes chargeIn{0%{opacity:0; transform:scaleY(0.4);}60%{opacity:1;}100%{opacity:0.92; transform:none;}}



  /* ---- SCROLL-REVEALED SCENES — one-shot, on viewport entry ----------------
     Driven by the plugin's IntersectionObserver (initReveals adds .is-in to
     .camp .reveal, then unobserves, so an entrance never replays on back-scroll).

     NO CHILD COMBINATORS ANYWHERE IN THIS STYLESHEET. WordPress stores page
     custom CSS with the child-combinator character escaped to an HTML entity,
     so any rule using it reaches the browser malformed and is discarded —
     silently, with no console error and no visual clue except that the reveal
     never hides anything. Twelve rules died that way. Descendant body.elementor-page-3248s only.

     Transitions, not animations: once a transition finishes nothing remains
     applied, so no element holds a compositor layer for the rest of the
     session. The hidden pre-state is gated on .reveals-armed, added only by JS,
     so no-JS and prefers-reduced-motion both render the finished composition. */
  .camp.reveals-armed .reveal .chapter__num,
  .camp.reveals-armed .reveal .chapter__title,
  .camp.reveals-armed .reveal .chapter__lede,
  .camp.reveals-armed .reveal .prose p,
  .camp.reveals-armed .reveal .caps li,
  .camp.reveals-armed .reveal .proofline__title,
  .camp.reveals-armed .reveal .proofline__stats li,
  .camp.reveals-armed .reveal figcaption,
  .camp.reveals-armed .reveal .pullquote,
  .camp.reveals-armed .reveal .pullquote__cite,
  .camp.reveals-armed .reveal .split__text,
  .camp.reveals-armed .reveal .doubling__side,
  .camp.reveals-armed .reveal .doubling__flow-label,
  .camp.reveals-armed .reveal .matchby__eyebrow,
  .camp.reveals-armed .reveal .matchby__mark,
  .camp.reveals-armed .reveal .engine__stage,
  .camp.reveals-armed .reveal .engine__controls,
  .camp.reveals-armed .reveal .engine__note,
  .camp.reveals-armed .reveal .give__lede,
  .camp.reveals-armed .reveal .give__form,
  .camp.reveals-armed .reveal .give__reflect,
  .camp.reveals-armed .reveal .give__state,
  .camp.reveals-armed .reveal .proof__item{opacity:0; transform:translateY(14px);
    transition:opacity 620ms var(--m-ease), transform 620ms var(--m-ease);}
  .camp.reveals-armed .reveal.is-in .chapter__num,
  .camp.reveals-armed .reveal.is-in .chapter__title,
  .camp.reveals-armed .reveal.is-in .chapter__lede,
  .camp.reveals-armed .reveal.is-in .prose p,
  .camp.reveals-armed .reveal.is-in .caps li,
  .camp.reveals-armed .reveal.is-in .proofline__title,
  .camp.reveals-armed .reveal.is-in .proofline__stats li,
  .camp.reveals-armed .reveal.is-in figcaption,
  .camp.reveals-armed .reveal.is-in .pullquote,
  .camp.reveals-armed .reveal.is-in .pullquote__cite,
  .camp.reveals-armed .reveal.is-in .split__text,
  .camp.reveals-armed .reveal.is-in .doubling__side,
  .camp.reveals-armed .reveal.is-in .doubling__flow-label,
  .camp.reveals-armed .reveal.is-in .matchby__eyebrow,
  .camp.reveals-armed .reveal.is-in .matchby__mark,
  .camp.reveals-armed .reveal.is-in .engine__stage,
  .camp.reveals-armed .reveal.is-in .engine__controls,
  .camp.reveals-armed .reveal.is-in .engine__note,
  .camp.reveals-armed .reveal.is-in .give__lede,
  .camp.reveals-armed .reveal.is-in .give__form,
  .camp.reveals-armed .reveal.is-in .give__reflect,
  .camp.reveals-armed .reveal.is-in .give__state,
  .camp.reveals-armed .reveal.is-in .proof__item{opacity:1; transform:none;}

  /* a light stagger so a scene arrives as a sequence, not a block */
  .camp.reveals-armed .reveal.is-in .chapter__title{transition-delay:90ms;}
  .camp.reveals-armed .reveal.is-in .chapter__lede{transition-delay:200ms;}
  .camp.reveals-armed .reveal.is-in .prose p:nth-of-type(2){transition-delay:95ms;}
  .camp.reveals-armed .reveal.is-in .prose p:nth-of-type(3){transition-delay:190ms;}
  .camp.reveals-armed .reveal.is-in .caps li:nth-child(2){transition-delay:120ms;}
  .camp.reveals-armed .reveal.is-in .caps li:nth-child(3){transition-delay:200ms;}
  .camp.reveals-armed .reveal.is-in .caps li:nth-child(4){transition-delay:280ms;}
  .camp.reveals-armed .reveal.is-in .caps li:nth-child(5){transition-delay:360ms;}
  .camp.reveals-armed .reveal.is-in .proofline__stats li:nth-child(2){transition-delay:150ms;}
  .camp.reveals-armed .reveal.is-in .proofline__stats li:nth-child(3){transition-delay:260ms;}
  .camp.reveals-armed .reveal.is-in .proof__item:nth-child(2){transition-delay:120ms;}
  .camp.reveals-armed .reveal.is-in .proof__item:nth-child(3){transition-delay:240ms;}
  .camp.reveals-armed .reveal.is-in .engine__controls{transition-delay:260ms;}
  .camp.reveals-armed .reveal.is-in .engine__note{transition-delay:360ms;}
  .camp.reveals-armed .reveal.is-in .give__reflect{transition-delay:120ms;}
  .camp.reveals-armed .reveal.is-in .give__state{transition-delay:240ms;}
  .camp.reveals-armed .reveal.is-in .matchby__mark{transition-delay:140ms;}

  /* photography settles into its frame rather than rising */
  .camp.reveals-armed .figure.reveal img{transform:scale(1.03); opacity:0.55;
    transition:opacity var(--m-story) var(--m-ease-out), transform var(--m-story) var(--m-ease-out);}
  .camp.reveals-armed .figure.reveal.is-in img{transform:none; opacity:1;}
  .camp .figure{overflow:clip;}

  /* SIGNATURE · the doubling — $1 → transformation → $2, witnessed in time */
  .camp.reveals-armed .doubling.reveal .doubling__prism{clip-path:inset(0 100% 0 0); opacity:0.35;
    transition:clip-path var(--m-story) var(--m-ease-out) 420ms, opacity var(--m-story) var(--m-ease-out) 420ms;}
  .camp.reveals-armed .doubling.reveal.is-in .doubling__prism{clip-path:inset(0 0 0 0); opacity:1;}
  .camp.reveals-armed .doubling.reveal .doubling__flow-label{transition:opacity 500ms var(--m-ease) 900ms;}
  .camp.reveals-armed .doubling.reveal.is-in .doubling__side--sum{transition-delay:1180ms;}

  @keyframes sceneRise{from{opacity:0; transform:translateY(20px);}to{opacity:1; transform:none;}}
  @keyframes copyRise{from{opacity:0; transform:translateY(12px);}to{opacity:1; transform:none;}}
  @keyframes photoSettle{from{opacity:0.55; transform:scale(1.03); clip-path:inset(0 0 6% 0);}to{opacity:1; transform:none; clip-path:inset(0 0 0 0);}}
  @keyframes prismDraw{from{clip-path:inset(0 100% 0 0); opacity:0.35;}to{clip-path:inset(0 0 0 0); opacity:1;}}
}

/* ---- REDUCED MOTION — complete, resolved composition; no motion at all ---- */
@media (prefers-reduced-motion:reduce){
  .camp *,.camp *::before,.camp *::after{animation-duration:0.001ms !important; animation-iteration-count:1 !important; animation-delay:0s !important; transition-duration:0.001ms !important; scroll-behavior:auto !important;}
  .camp .hero__kicker,.camp .hero__headline,.camp .hero__headline em,.camp .hero__sub,.camp .hero__cta,.camp .hero__equation,.camp .hero__ampule,.camp .ampule__charge,.camp .chapter__num,.camp .chapter__title,.camp .chapter__lede,.camp .prose p,.camp .caps,.camp .pullquote,.camp .split__text,.camp .proof__item,.camp .doubling__side,.camp .doubling__flow-label,.camp .doubling__prism{opacity:1 !important;}
  .camp .doubling__prism,.camp .figure img{clip-path:none !important; transform:none !important;}
  .camp .reveal &gt; *,.camp .reveal.is-in &gt; *{opacity:1 !important; transform:none !important; transition:none !important;}
  .camp .doubling__flow-label{opacity:1 !important;}
}
.camp .match-together{font-size:0.98rem; color:var(--text-muted); max-width:60ch; margin-top:0.2em;}
.camp .proofline{margin-top:clamp(44px,7vw,88px); padding-top:clamp(28px,4vw,44px); border-top:1px solid var(--rule);}
.camp .proofline__title{font-family:var(--font-display); font-weight:500; font-size:clamp(1.5rem,3vw,2.2rem); line-height:1.1; letter-spacing:-0.01em; margin:0 0 clamp(20px,3vw,32px);}
.camp .proofline__stats li{display:flex; flex-direction:column; gap:8px; padding-left:18px; border-left:2px solid var(--gold);}
.camp .proofline__stats b{font-family:var(--font-display); font-weight:500; font-size:clamp(2rem,4vw,3rem); line-height:1; color:var(--gold-text-light);}
.camp .proofline__stats span{font-size:0.96rem; line-height:1.4; color:var(--text-muted);}
.camp .builds-heading{margin-top:1.2em !important; font-weight:600;}
.camp .builds-list{list-style:none; padding:0; margin:1em 0 0; display:flex; flex-direction:column; gap:0.7em; max-width:62ch;}
.camp .builds-list li{position:relative; padding-left:1.5em; font-size:1.02rem; line-height:1.5;}
.camp .builds-list li::before{content:""; position:absolute; left:0; top:0.6em; width:8px; height:8px; border-radius:50%; background:var(--gold); box-shadow:0 0 0 3px rgba(218,165,32,0.18);}
.camp .split__text .pullquote{font-size:clamp(1.3rem,2.1vw,1.85rem);}
.camp .pullquote__cite{display:block; margin-top:0.9em; padding-left:0.75em; font-style:normal; font-size:0.92rem; letter-spacing:0.02em; color:var(--text-muted); font-family:var(--font-body);}
@media (max-width:768px){
}


/* ---- Patriot Consulting signature (Chapter: the match) ---- */
.camp .matchby{max-width:980px; margin-top:clamp(34px,5vw,60px); padding-top:clamp(24px,3vw,36px); border-top:1px solid var(--rule); display:flex; flex-direction:column; align-items:center; gap:18px; text-align:center;}
.camp .matchby__eyebrow{margin:0; font-size:0.72rem; letter-spacing:0.18em; text-transform:uppercase; font-weight:600; color:var(--text-muted);}
.camp .matchby__mark{height:clamp(72px,7vw,96px); width:auto; display:block;}

/* == JSF SECTION V COMPOSITION (managed - do not hand-edit) == */
/* ══════════════════════════════════════════════════════════════════════════
   SECTION V · EDITORIAL TWO-COLUMN COMPOSITION

   THE DESIGN IS UNCHANGED. Every approved element stays exactly as drawn: the
   numeral and gold rule, the title and lede, TOTAL CAMPAIGN IMPACT, the large
   Fraunces total, the goal/percent line, the gold match-still-available
   callout, the three-row financial breakdown, the vertical campaign vessel and
   its $200k/$150k/$100k/$50k scale with the FULL MATCH UNLOCKED marker, the
   separate MATCH REMAINING vessel and its figure, and the donor + match =
   total impact legend. Nothing is deleted, replaced or restyled.

   ONLY THE COMPOSITION MOVES. The markup already ships .engine__readout and
   .engine__instrument as siblings inside .engine__stage; that stage was a
   CENTRED WRAPPING FLEX ROW whose two children summed to 1,103px inside a
   940px column, so it always wrapped — the text stacked ABOVE the instrument
   in a 600px centred box, leaving a dead gutter either side and driving the
   section to 1,486px. It is now a grid: campaign information left, the
   existing vertical instrument right, both starting at the same top edge so
   they share vertical space instead of queueing for it.

   Every rule is scoped to #engine, so no other section can be reached.
   No child combinators anywhere: WordPress stores page custom_css with the
   child-combinator character escaped to an HTML entity, which silently
   invalidates any rule that uses one.
   ══════════════════════════════════════════════════════════════════════════ */
/* ONE LEFT EDGE. campaign.css already gives Section V its own measure - the
   --e-band system, .camp #engine [child] .container:not(.chapter__head) capped at
   calc(var(--e-band) + 48px) - but it deliberately EXCLUDES the head, which is
   why the numeral, title and lede hung 56px right of TOTAL CAMPAIGN IMPACT and
   the breakdown. That gap was invisible while the text was boxed into a 600px
   centred column and obvious the moment it was not. The head is given the same
   band, so the whole section hangs off one edge. Same variable, no magic
   number, Section V only - no other chapter head can move. */
.camp #engine .chapter__head{max-width:calc(var(--e-band) + 48px);}

.camp #engine .engine__stage{display:grid; grid-template-columns:minmax(0,1fr) minmax(0,max-content);
  gap:clamp(28px,3.2vw,56px); align-items:start; justify-content:stretch;}
.camp #engine .engine__readout{max-width:none; flex:none; min-width:0;}
.camp #engine .engine__instrument{align-self:start; height:clamp(400px,44vh,470px);}

/* The total keeps its editorial dominance and its Fraunces character; it is
   only sized to the column it now lives in, so "$44,482" cannot wrap. */
.camp #engine .engine__total{font-size:clamp(3rem,5.2vw,5rem);}
.camp #engine .engine__stats{margin-top:clamp(22px,2.4vw,30px);}

/* ---- 900 and below: two columns would cramp the breakdown, so stack ---- */
@media (max-width:900px){
  .camp #engine .engine__stage{grid-template-columns:minmax(0,1fr); gap:clamp(30px,5vw,44px);}
  .camp #engine .engine__instrument{justify-self:center; height:clamp(380px,52vh,460px);}
  .camp #engine .engine__total{font-size:clamp(3rem,9vw,5rem);}
}

/* ---- LANDSCAPE PHONE - the width is there, so the two sides stay beside
   each other. The instrument is narrowed (tick gutter + vessel) and shortened
   to the viewport, never clipped, and the scale stays mathematically intact. */
@media (min-width:640px) and (max-height:520px) and (orientation:landscape){
  /* the instrument is given a FIXED column so the legend cannot push it wider
     than the campaign information beside it - text 325px, instrument 290px. */
  .camp #engine .engine__stage{grid-template-columns:minmax(0,1fr) 290px; gap:20px;}
  .camp #engine .engine__instrument{justify-self:end; height:clamp(220px,60vh,270px); gap:12px;}
  .camp #engine .core__legend{max-width:290px; margin-top:10px;}
  /* the intro at full desktop type ate the entire 375px-tall first screen, so
     the composition below it was never on screen with it. Landscape only. */
  .camp #engine{padding-block:clamp(40px,7vw,56px);}
  .camp #engine .chapter__head{margin-bottom:16px;}
  .camp #engine .chapter__num{font-size:1.3rem; margin-bottom:0.16em; padding-bottom:0.16em;}
  .camp #engine .chapter__title{font-size:1.4rem;}
  .camp #engine .chapter__lede{font-size:0.84rem; max-width:56ch; margin-top:8px;}
  /* 62px of stacked head margin + container padding + .engine margin sat
     between the lede and the campaign state - a sixth of a 375px screen. */
  .camp #engine .container{padding-block:6px;}
  .camp #engine .engine{margin-top:8px;}
  .camp #engine .core__tube{width:84px; margin-left:66px;}
  .camp #engine .core__ticks span::before{left:52px;}
  .camp #engine .core__ticks em{font-size:0.62rem;}
  .camp #engine .core__ticks small{font-size:0.5rem;}
  .camp #engine .core__legend{font-size:0.58rem; gap:4px;}
  .camp #engine .engine__total{font-size:clamp(2.1rem,6vw,2.9rem);}
  .camp #engine .engine__stats dd{font-size:1.15rem;}
  .camp #engine .reservoir__label{font-size:0.55rem;}
}
/* == end JSF SECTION V COMPOSITION == */
/* == end JSF flagship campaign == */

/* ---- APPROVED PRISM MIGRATION (plugin v0.1.7) ----------------------------
   The prism is now built at runtime by campaign-flagship.js from the approved
   Design Lab geometry into the [data-prism] placeholder. The page's own
   data-URI background prism (pre-rewrite 720x220, no beam labels, no lens) is
   retired here, the composition takes the approved 980px measure, and the
   reveal choreography moves from .doubling__prism to .prism__svg so the
   entrance still plays on the element that now draws. */
.camp .doubling__prism{display:none;}
.camp .doubling{max-width:980px;}
.camp.reveals-armed .doubling.reveal .prism__svg{clip-path:inset(0 100% 0 0); opacity:0.35; transition:clip-path var(--m-story) var(--m-ease-out) 420ms, opacity var(--m-story) var(--m-ease-out) 420ms;}
.camp.reveals-armed .doubling.reveal.is-in .prism__svg{clip-path:inset(0 0 0 0); opacity:1;}
.camp.reveals-armed .doubling.reveal .doubling__beamlbl{opacity:0; transition:opacity 500ms var(--m-ease) 900ms;}
.camp.reveals-armed .doubling.reveal.is-in .doubling__beamlbl{opacity:1;}
@media (max-width:768px){
  .camp .doubling{align-items:center; text-align:center; gap:0;}
  .camp .doubling__side,.camp .doubling__side--sum{align-items:center; text-align:center;}
  .camp .doubling__flow{display:block; margin-inline:0;}
}
@media (prefers-reduced-motion: reduce){
  .camp .prism__svg,.camp .doubling__beamlbl{clip-path:none !important; opacity:1 !important; transition:none !important;}
}/* End custom CSS */