/* =================================================================
   NEW COMPONENTS — everything below is added for the home page.
   The design tokens above are untouched.
   ================================================================= */

/* ---- image aspect fixes: width/height attrs are set for CLS, so any rule
       that sets only one dimension must free the other ---- */
.nav .brand img,.hero .initiative img,.footer .logos img{width:auto}
.hero .logo{height:auto}

/* ---- Devanagari fallback for the language toggle and Hindi pages ---- */
:lang(hi){font-family:"Noto Sans Devanagari","Nirmala UI",var(--sans)}

/* ---- placeholder marker — OFF from launch -------------------------
   These pills were an authoring aid during the build. Two of them reached
   the public site ("needs AOL sign-off on this answer before launch" and
   "video link needed"), which is exactly the failure this rule now makes
   impossible. The markers are stripped server-side as well, in the
   templates and in FaqModel::render(); this is the second lock, so that
   anything added later cannot show up on a visitor's screen.
   Do not restore the visible style on the live site. ------------------ */
.ph{display:none !important}

/* ---- NAV: dropdowns, language toggle, callback button, mobile ---- */
.nav .wrap{gap:12px}
.nav-links{align-items:center; gap:22px}
.nav-item{position:relative}
.nav-item > a,.nav-links > a{display:inline-flex; align-items:center; gap:5px; padding:12px 0 14px;
  font-family:var(--round); font-weight:600; font-size:.95rem; color:var(--brown); text-decoration:none}
.nav-item > a:hover,.nav-links > a:hover{color:var(--magenta)}
.nav-item .caret{width:9px; height:9px; border-right:2px solid currentColor; border-bottom:2px solid currentColor;
  transform:rotate(45deg) translate(-1px,-1px); transition:transform .18s ease}
.nav-item[aria-expanded="true"] .caret{transform:rotate(-135deg) translate(-2px,-2px)}
/* The invisible bridge: without it the pointer crosses 10px of dead space
   between the link and the panel, mouseleave fires, and the menu closes. */
.submenu::before{content:""; position:absolute; top:-14px; left:0; right:0; height:14px}
.submenu{position:absolute; top:calc(100% + 10px); left:-14px; min-width:230px; background:#fff;
  border:1px solid var(--line); border-radius:18px; box-shadow:var(--shadow); padding:10px; display:none; z-index:60}
.nav-item[aria-expanded="true"] .submenu{display:block}
.submenu a{display:block; padding:10px 14px; border-radius:12px; font-family:var(--round); font-weight:600;
  font-size:.92rem; color:var(--brown); text-decoration:none}
.submenu a:hover{background:var(--green-soft); color:var(--green-deep)}
.submenu .sep{height:1px; background:var(--line); margin:6px 10px}

.nav-actions{display:flex; align-items:center; gap:10px; margin-left:6px}
.nav .lang-toggle{font-family:"Noto Sans Devanagari","Nirmala UI",var(--round); font-weight:700; font-size:.85rem; color:var(--brown);
  border:1.5px solid var(--line); background:#fff; border-radius:999px; padding:.45em 1em; cursor:pointer; text-decoration:none}
.nav .lang-toggle:hover{border-color:var(--magenta); color:var(--magenta)}
.btn-nav{font-family:var(--round); font-weight:700; font-size:.88rem; background:var(--magenta); color:#fff;
  border:0; border-radius:999px; padding:.65em 1.25em; cursor:pointer; white-space:nowrap;
  box-shadow:0 10px 20px -12px rgba(231,63,135,.8); transition:transform .18s ease, background .18s ease}
.btn-nav:hover{transform:translateY(-1px); background:#d22f78}

.hamburger{display:none; background:none; border:0; cursor:pointer; padding:8px; margin-left:auto}
.hamburger span{display:block; width:24px; height:2.5px; background:var(--brown); border-radius:2px; margin:5px 0; transition:.2s}

@media (max-width:980px){
  .nav-links{position:fixed; inset:72px 0 auto 0; flex-direction:column; align-items:stretch; gap:0;
    background:var(--cream); border-bottom:1px solid var(--line); padding:14px 24px 22px;
    box-shadow:var(--shadow); display:none; max-height:calc(100vh - 72px); overflow-y:auto}
  .nav-links.open{display:flex}
  .nav-item > a,.nav-links > a{padding:13px 0; border-bottom:1px solid var(--line); justify-content:space-between}
  .submenu{position:static; display:none; border:0; box-shadow:none; padding:4px 0 10px 14px; min-width:0}
  .nav-item[aria-expanded="true"] .submenu{display:block}
  .nav-actions{margin:16px 0 0; flex-direction:column; align-items:stretch}
  .lang-toggle,.btn-nav{text-align:center; padding:.8em 1em}
  .hamburger{display:block}
}

/* ---- HERO: three-line tagline + lead + CTAs ---- */
.hero .tagline{font-style:normal; font-size:clamp(1.5rem,4.4vw,2.5rem); color:var(--brown); max-width:none; margin-top:14px}
.hero .tagline span{display:block; font-family:var(--serif); font-weight:600; line-height:1.22}
.hero .tagline span:nth-child(1){color:var(--magenta)}
.hero .tagline span:nth-child(2){color:var(--ramayan-ink)}
.hero .tagline span:nth-child(3){color:var(--green-deep)}
.hero p.lead{font-size:1.1rem; color:var(--ink); margin-top:20px; max-width:600px}
.hero-cta{display:flex; gap:14px; justify-content:center; flex-wrap:wrap; margin-top:26px}
.btn-ghost{background:#fff; color:var(--brown); border-color:var(--line)}
.btn-ghost:hover{border-color:var(--magenta); color:var(--magenta); transform:translateY(-2px)}

/* ---- VIDEO FACADE ---- */
/* cream2 so the video reads as its own band now that the Gurudev
   gradient no longer separates it from the programs below */
.videoblock{background:var(--cream2)}
.vwrap{max-width:880px; margin:0 auto}
.vfacade{position:relative; margin:0; border-radius:var(--r-lg); overflow:hidden; border:6px solid #fff;
  box-shadow:var(--shadow); cursor:pointer; background:#2b1f15; aspect-ratio:16/9}
.vfacade img{width:100%; height:100%; object-fit:cover; opacity:.78; transition:opacity .25s ease, transform .35s ease}
.vfacade:hover img{opacity:.62; transform:scale(1.03)}
.vfacade iframe{position:absolute; inset:0; width:100%; height:100%; border:0}
.vplay{position:absolute; inset:0; display:grid; place-items:center; pointer-events:none}
.vplay i{width:82px; height:82px; border-radius:50%; background:var(--magenta); display:grid; place-items:center;
  box-shadow:0 16px 34px -12px rgba(0,0,0,.6); transition:transform .25s ease}
.vfacade:hover .vplay i{transform:scale(1.08)}
.vplay i::after{content:""; border-left:22px solid #fff; border-top:14px solid transparent;
  border-bottom:14px solid transparent; margin-left:6px}
.vcap{position:absolute; left:0; right:0; bottom:0; padding:34px 26px 18px; pointer-events:none;
  background:linear-gradient(transparent,rgba(0,0,0,.72)); color:#fff;
  font-family:var(--round); font-weight:600; font-size:1rem}

/* ---- PROGRAM CARDS: two new color variants ---- */
.ov-card.s{background:linear-gradient(135deg,#5EB4DA,#2F80A8)}
.ov-card.i{background:linear-gradient(135deg,#96C34F,#557F22)}

/* ---- HIGHLIGHTS ---- */
.highlights{background:var(--cream2)}
.hl-grid{display:grid; grid-template-columns:repeat(auto-fit,minmax(270px,1fr)); gap:22px}
.hl{background:#fff; border-radius:var(--r-lg); overflow:hidden; box-shadow:var(--shadow); display:flex; flex-direction:column}
.hl .media{position:relative; aspect-ratio:16/10; background:var(--green-soft)}
.hl .media img{width:100%; height:100%; object-fit:cover}
.hl .date{position:absolute; top:14px; left:14px; background:rgba(255,252,246,.94); color:var(--brown);
  font-family:var(--round); font-weight:700; font-size:.74rem; letter-spacing:.06em; text-transform:uppercase;
  padding:.4em .85em; border-radius:999px}
.hl .body{padding:22px 24px 24px}
.hl h3{font-size:1.22rem; color:var(--brown); margin-bottom:8px}
.hl p{margin:0; font-size:.94rem; color:var(--ink-soft)}
.hl .more{display:inline-block; margin-top:14px; font-family:var(--round); font-weight:700;
  font-size:.88rem; color:var(--magenta); text-decoration:none}
.hl .more:hover{text-decoration:underline}

/* ---- TESTIMONIALS: grid on desktop, peek-scroller on mobile ----
   Desktop keeps all four visible. Below 720px the row becomes a
   swipeable scroller with ~16% of the next card showing as the
   affordance. Negative margin bleeds it to the screen edge so the
   peek reaches the edge instead of stopping at the wrap padding. */
@media (max-width:720px){
  .voice-grid{
    grid-template-columns:none;
    grid-auto-flow:column;
    grid-auto-columns:84%;
    gap:14px;
    overflow-x:auto;
    overscroll-behavior-x:contain;
    scroll-snap-type:x mandatory;
    margin-inline:-24px;
    padding:4px 24px 18px;
    scrollbar-width:thin;
    scrollbar-color:var(--green) transparent;
  }
  .voice-grid::-webkit-scrollbar{height:6px}
  .voice-grid::-webkit-scrollbar-thumb{background:var(--green); border-radius:999px}
  .voice{scroll-snap-align:start}
  .voice-grid:focus-visible{outline:3px solid var(--yellow); outline-offset:4px; border-radius:20px}
}

/* ---- FAQ ACCORDION ---- */
.faq{background:#FFFBF0}
.faq-list{max-width:800px; margin:0 auto; display:grid; gap:12px}
.faq-item{background:#fff; border:1px solid var(--line); border-radius:20px; overflow:hidden}
.faq-item summary{list-style:none; cursor:pointer; padding:20px 56px 20px 24px; position:relative;
  font-family:var(--round); font-weight:700; font-size:1.02rem; color:var(--brown)}
.faq-item summary::-webkit-details-marker{display:none}
.faq-item summary:focus-visible{outline:3px solid var(--yellow); outline-offset:-3px}
.faq-item summary::after{content:""; position:absolute; right:24px; top:50%; width:11px; height:11px;
  border-right:2.5px solid var(--magenta); border-bottom:2.5px solid var(--magenta);
  transform:translateY(-70%) rotate(45deg); transition:transform .2s ease}
.faq-item[open] summary::after{transform:translateY(-30%) rotate(-135deg)}
.faq-item .ans{padding:0 24px 22px; color:var(--ink); font-size:.97rem}
.faq-item .ans p{margin:0 0 12px}
.faq-item .ans p:last-child{margin:0}
.faq-more{text-align:center; margin-top:30px}

/* ---- CLOSING CTA ---- */
.closing{background:linear-gradient(135deg,#FFF3DE 0%,#FDE7C8 55%,#FCE0D2 100%); text-align:center; padding:78px 0}
.closing h2{font-size:clamp(1.9rem,4.4vw,2.8rem); color:var(--brown)}
.closing h2 em{font-style:italic; color:var(--magenta)}
.closing p{max-width:560px; margin:16px auto 0; color:var(--ink-soft)}
.closing .btns{display:flex; gap:14px; justify-content:center; flex-wrap:wrap; margin-top:28px}

/* ---- FOOTER additions ---- */
.footer .fcols{display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:28px;
  text-align:left; max-width:900px; margin:0 auto 28px; padding-bottom:26px; border-bottom:1px solid var(--line)}
.footer .fcols h5{font-family:var(--round); font-weight:700; font-size:.8rem; letter-spacing:.1em;
  text-transform:uppercase; color:var(--green-deep); margin:0 0 12px}
.footer .fcols a{display:block; color:var(--ink-soft); text-decoration:none; font-size:.9rem; padding:4px 0}
.footer .fcols a:hover{color:var(--magenta)}
.social{display:flex; gap:12px; justify-content:center; margin:18px 0 6px}
.social a{width:40px; height:40px; border-radius:50%; display:grid; place-items:center;
  background:#fff; border:1px solid var(--line); color:var(--brown); transition:.18s}
.social a:hover{background:var(--magenta); border-color:var(--magenta); color:#fff; transform:translateY(-2px)}
.social svg{width:19px; height:19px; fill:currentColor}

/* ---- FLOATING CALLBACK ---- */
.float-cta{position:fixed; right:22px; bottom:22px; z-index:70; font-family:var(--round); font-weight:700;
  font-size:.95rem; background:var(--magenta); color:#fff; border:0; border-radius:999px; padding:1em 1.6em;
  cursor:pointer; box-shadow:0 18px 36px -14px rgba(231,63,135,.9); display:flex; align-items:center; gap:9px;
  transition:transform .2s ease}
.float-cta:hover{transform:translateY(-3px)}
.float-cta svg{width:17px; height:17px; fill:currentColor}
@media (max-width:640px){ .float-cta{right:14px; left:14px; bottom:14px; justify-content:center} }

/* ---- MODAL ---- */
.modal{position:fixed; inset:0; z-index:100; background:rgba(74,53,36,.55); backdrop-filter:blur(3px);
  display:none; align-items:center; justify-content:center; padding:20px}
.modal.open{display:flex}
.modal-card{background:var(--cream); border-radius:var(--r-lg); box-shadow:var(--shadow); width:min(560px,100%);
  max-height:92vh; overflow-y:auto; padding:34px 32px 30px; position:relative}
.modal-card h3{font-size:1.6rem; color:var(--brown); margin-bottom:6px}
.modal-card .sub{color:var(--ink-soft); font-size:.94rem; margin:0 0 22px}
.modal-close{position:absolute; top:16px; right:18px; background:none; border:0; font-size:1.6rem;
  line-height:1; color:var(--ink-soft); cursor:pointer}
.modal-close:hover{color:var(--magenta)}
.field{margin-bottom:16px}
.field label{display:block; font-family:var(--round); font-weight:700; font-size:.85rem; color:var(--brown); margin-bottom:6px}
.field input,.field select,.field textarea{width:100%; font-family:var(--sans); font-size:1rem; color:var(--ink);
  background:#fff; border:1.5px solid var(--line); border-radius:14px; padding:.75em .95em}
.field input:focus,.field select:focus,.field textarea:focus{outline:0; border-color:var(--magenta)}
.field textarea{min-height:84px; resize:vertical}
.field.hide{display:none}
.consent{display:flex; gap:11px; align-items:flex-start; font-size:.85rem; color:var(--ink-soft); margin:18px 0 20px}
.consent input{margin-top:3px; width:17px; height:17px; flex:0 0 auto; accent-color:var(--magenta)}
.hp{position:absolute; left:-9999px}

/* =================================================================
   FORM — progressive disclosure + audience branching
   ================================================================= */
.req{color:#E24234; font-weight:700}
/* Pull-quote: the programme team's approved one-line summary. Centred and
   set larger than body copy because it is the line people remember, not a
   caption under the lists. */
.essence{
  max-width:44rem; margin:34px auto 0; padding:0 18px;
  font-family:var(--round); font-weight:600; font-size:clamp(1.05rem,2.4vw,1.35rem);
  line-height:1.5; text-align:center; color:var(--ink); border:0; quotes:none;
}
.essence::before{content:"\201C"; opacity:.35; margin-right:2px}
.essence::after{content:"\201D"; opacity:.35; margin-left:2px}
@media (max-width:560px){ .essence{margin-top:26px} }

.field .err{margin:6px 0 0; font-size:.83rem; color:#E24234; font-family:var(--round); font-weight:600}
/* Summary line for a rejection the server sent back that has no field of
   its own on screen, and for a request that never completed. */
.formerr{margin:14px 0 0; padding:11px 14px; border-radius:10px;
  background:#FDECEA; border:1px solid #F5C6C0; color:#B3271B;
  font-family:var(--round); font-weight:600; font-size:.88rem; line-height:1.5}
.field input[aria-invalid="true"],.field select[aria-invalid="true"]{border-color:#E24234}

.disclose{display:flex; align-items:center; gap:9px; width:100%; margin:4px 0 18px; padding:12px 14px;
  background:var(--green-soft); border:1.5px dashed #C9DCA8; border-radius:14px; cursor:pointer;
  font-family:var(--round); font-weight:700; font-size:.9rem; color:var(--green-deep); text-align:left}
.disclose em{font-style:normal; font-weight:600; color:var(--ink-soft); font-size:.82rem}
.disclose:hover{background:#E1EFCC}
.disclose:focus-visible{outline:3px solid var(--yellow); outline-offset:2px}
.disclose .plus{position:relative; width:14px; height:14px; flex:0 0 auto}
.disclose .plus::before,.disclose .plus::after{content:""; position:absolute; background:var(--green-deep); border-radius:2px}
.disclose .plus::before{left:0; top:6px; width:14px; height:2.5px}
.disclose .plus::after{left:6px; top:0; width:2.5px; height:14px; transition:transform .2s ease}
.disclose[aria-expanded="true"] .plus::after{transform:scaleY(0)}
.modal-card .more{border-left:3px solid var(--line); padding-left:16px; margin-bottom:6px}

.modal-card .submit{width:100%; justify-content:center}
.formnote{margin:12px 0 0; text-align:center; font-size:.8rem; color:var(--ink-soft)}
.consent a{color:var(--magenta); font-weight:700}

/* =================================================================
   PROGRAM PAGE — header band, gallery strip, page FAQ
   ================================================================= */
.p-hero{padding:64px 0 0}
.p-hero .p-head{max-width:780px}
.p-back{display:inline-flex; align-items:center; gap:7px; font-family:var(--round); font-weight:700;
  font-size:.85rem; text-decoration:none; opacity:.85; margin-bottom:20px}
.foundation .p-back{color:var(--foundation-ink)} .ramayan .p-back{color:var(--ramayan-ink)}
.p-back:hover{opacity:1}
.p-cta{text-align:center; margin-top:36px}
.p-cta .btn{margin:0 6px 10px}

.program .section-sub{text-align:center; font-family:var(--round); font-weight:700; letter-spacing:.08em;
  text-transform:uppercase; font-size:.76rem; margin:52px 0 18px}
.foundation .section-sub{color:var(--foundation-ink)} .ramayan .section-sub{color:var(--ramayan-ink)}

.vstrip{display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:18px}
.vstrip .vfacade{aspect-ratio:16/9; border-width:4px}
.vstrip .vplay i{width:56px; height:56px}
.vstrip .vplay i::after{border-left-width:15px; border-top-width:10px; border-bottom-width:10px; margin-left:4px}
.vstrip .vcap{padding:26px 16px 12px; font-size:.88rem}

.program .faq-list{max-width:760px}
.program .faq-item{border-color:rgba(74,53,36,.12)}
.foundation .faq-item summary::after{border-color:var(--foundation)}
.ramayan .faq-item summary::after{border-color:var(--ramayan)}

.empty{text-align:center; padding:36px 24px; border:2px dashed var(--line); border-radius:var(--r-lg);
  color:var(--ink-soft); font-size:.94rem; background:rgba(255,255,255,.5)}

/* ---- program page: tinted hero band, cream body ----
   The program color announces itself once at the top, then continues
   as accents. Full-page tints stop the site reading as one site. */
.program.p-hero{padding:64px 0 56px}
.program.p-body{background:var(--cream); padding:8px 0 78px}
.program.p-body .p-cols{margin-top:0}
.p-hero .p-photo{margin-bottom:-90px; position:relative; z-index:2}
.program.p-body{padding-top:110px}
@media (max-width:640px){
  .p-hero .p-photo{margin-bottom:-50px}
  .program.p-body{padding-top:70px}
}

/* [hidden] loses to any display rule with a class selector, so restate it
   for the elements config.js can hide. */
.social a[hidden],.fcols a[hidden]{display:none !important}
.social:empty,.social.allhidden{display:none}

/* =================================================================
   FLOATING ACTIONS — dates menu + Callback

   Two controls, bottom right. The round button opens a small menu with
   the two things people arrive looking for: when the next programme
   runs, and when the next follow-up is. "Request a Callback" stays
   beside it because the brief asks for it on every page.

   Replaces the floating WhatsApp button; WhatsApp is still in the
   footer and on the contact page.
   ================================================================= */
.float-stack{position:fixed; right:22px; bottom:22px; z-index:70; display:flex;
  flex-direction:column; align-items:flex-end; gap:10px}
.float-stack .float-cta{position:static; right:auto; bottom:auto}

.fmenu{position:relative; display:flex; flex-direction:column; align-items:flex-end; gap:10px}

/* The round opener. 52px is the smallest circle that still clears the
   44px minimum touch target once the icon is centred inside it. */
.float-menu{width:52px; height:52px; border-radius:50%; border:0; cursor:pointer;
  background:var(--green-deep); color:#fff; display:flex; align-items:center;
  justify-content:center; padding:0; flex:0 0 auto;
  box-shadow:0 14px 30px -12px rgba(60,84,40,.8);
  transition:transform .2s ease, background .2s ease}
.float-menu:hover{transform:translateY(-3px)}
.float-menu:focus-visible{outline:3px solid var(--yellow); outline-offset:3px}
.float-menu svg{width:24px; height:24px; fill:currentColor}
.float-menu .i-close{display:none}
.float-menu[aria-expanded="true"] .i-open{display:none}
.float-menu[aria-expanded="true"] .i-close{display:block}
.float-menu[aria-expanded="true"]{background:var(--ink)}

/* The menu itself opens upward from the button, right-aligned, because
   there is never room below a control already sitting on the bottom edge. */
.fmenu-card{position:absolute; bottom:calc(100% + 10px); right:0; z-index:2;
  width:min(320px, calc(100vw - 44px));
  background:#fff; border:1px solid var(--line); border-radius:16px;
  box-shadow:0 26px 50px -18px rgba(74,53,36,.45); overflow:hidden;
  transform-origin:bottom right}
.fmenu-card[hidden]{display:none}
.fmenu-card:not([hidden]){animation:fmenu-in .16s ease-out}
@keyframes fmenu-in{from{opacity:0; transform:translateY(8px) scale(.97)} to{opacity:1; transform:none}}

.fmenu-item{display:flex; align-items:center; gap:12px; padding:14px 14px;
  text-decoration:none; color:var(--ink); background:#fff; transition:background .15s ease}
.fmenu-item + .fmenu-item{border-top:1px solid var(--line)}
.fmenu-item:hover{background:var(--cream)}
.fmenu-item:focus-visible{outline:3px solid var(--yellow); outline-offset:-3px}
.fmenu-ico{flex:0 0 auto; width:38px; height:38px; border-radius:11px;
  background:var(--green-soft); color:var(--green-deep);
  display:flex; align-items:center; justify-content:center}
.fmenu-ico svg{width:19px; height:19px; fill:currentColor}
.fmenu-txt{display:flex; flex-direction:column; gap:1px; min-width:0; line-height:1.3}
.fmenu-txt strong{font-family:var(--round); font-weight:700; font-size:.95rem}
.fmenu-txt em{font-style:normal; font-size:.78rem; color:var(--muted)}
.fmenu-go{flex:0 0 auto; color:var(--magenta); font-weight:700}

@media (prefers-reduced-motion:reduce){
  .fmenu-card:not([hidden]){animation:none}
  .float-menu:hover,.float-cta:hover{transform:none}
}

@media (max-width:640px){
  /* Mobile: a full-width callback bar pinned to the bottom edge, with the
     round menu button lifted out above it. Two full-width buttons would
     compete rather than rank. */
  .float-stack{
    left:0; right:0; bottom:0; flex-direction:row; align-items:center; gap:8px;
    background:var(--cream); border-top:1px solid var(--line);
    box-shadow:0 -8px 24px -18px rgba(74,53,36,.6);
    padding:8px 12px calc(8px + env(safe-area-inset-bottom, 0px));
  }
  /* line-height:1 is the fix for the height — without it the buttons
     inherit the body's 1.65 and grow ~12px taller than they need to. */
  .float-stack .float-cta{
    height:44px; padding:0 1.1em; line-height:1; font-size:.9rem;
    border-radius:999px; box-shadow:none; transform:none;
    justify-content:center; align-items:center; gap:7px;
    flex:1 1 auto; width:100%; max-width:none}
  .float-stack .float-cta:hover{transform:none}

  .fmenu{position:static}
  .float-menu{
    position:fixed; right:14px;
    bottom:calc(72px + env(safe-area-inset-bottom, 0px));
    box-shadow:0 10px 24px -8px rgba(60,84,40,.7)}
  .float-menu:hover{transform:none}

  /* Anchored to the viewport rather than the button, so a long label can
     use the full width instead of being trapped in a 52px column. */
  .fmenu-card{
    position:fixed; right:14px; left:14px; width:auto;
    bottom:calc(132px + env(safe-area-inset-bottom, 0px))}

  body{padding-bottom:64px}
}

/* footer WhatsApp row */
.fcols a.wa{display:inline-flex; align-items:center; gap:7px; color:#1EA952; font-weight:700}
.fcols a.wa:hover{color:#25D366}
.fcols a.wa svg{width:15px; height:15px; fill:currentColor}

/* =================================================================
   COMMUNITY BAND — sits above the footer on every page.
   Deliberately quieter than the page CTA above it: this is the
   catch-all for people who did not take the primary action.
   ================================================================= */
.community{background:var(--green-soft); border-top:1px solid #DCE9C6; padding:46px 0 44px}
.community .inner{max-width:820px; margin:0 auto; text-align:center}
.community h2{font-size:clamp(1.45rem,3.2vw,2rem); color:var(--green-deep)}
.community h2 em{font-style:italic; color:var(--magenta)}
.community .blurb{margin:12px auto 0; max-width:560px; color:var(--ink); font-size:1rem}

.joinform{display:flex; gap:10px; justify-content:center; flex-wrap:wrap; margin:24px auto 0; max-width:660px}
.joinform .f{flex:1 1 190px; min-width:0; text-align:left}
.joinform input{width:100%; font-family:var(--sans); font-size:1rem; color:var(--ink);
  background:#fff; border:1.5px solid #CFE0B2; border-radius:999px; padding:.85em 1.25em}
.joinform input::placeholder{color:#9AA98A}
.joinform input:focus{outline:0; border-color:var(--green-deep)}
.joinform input[aria-invalid="true"]{border-color:#E24234}
.joinform .jerr{margin:6px 0 0 14px; font-size:.78rem; color:#E24234;
  font-family:var(--round); font-weight:600}
.joinform button{flex:0 0 auto; background:var(--green-deep); color:#fff; border:0; border-radius:999px;
  font-family:var(--round); font-weight:700; font-size:1rem; padding:.85em 1.9em; cursor:pointer;
  box-shadow:0 12px 24px -12px rgba(92,140,40,.8); transition:transform .18s ease, background .18s ease}
.joinform button:hover{transform:translateY(-2px); background:#4C7620}
.joinform button:focus-visible{outline:3px solid var(--yellow); outline-offset:3px}

.community .notice{margin:16px auto 0; max-width:520px; font-size:.79rem; color:var(--ink-soft)}
.community .notice a{color:var(--green-deep); font-weight:700}
.community .done{display:none; font-family:var(--round); font-weight:700; color:var(--green-deep);
  font-size:1.05rem; margin-top:22px}
.community.joined .joinform,.community.joined .notice{display:none}
.community.joined .done{display:block}

@media (max-width:560px){
  .joinform{flex-direction:column; gap:12px}
  /* flex-basis applies to the COLUMN axis once stacked, so 1 1 190px
     would give every field a 190px height. Reset it. */
  .joinform .f{flex:0 0 auto; width:100%}
  .joinform button{width:100%; justify-content:center}
}

.sr-only{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap}

/* ---- community: WhatsApp-styled submit + success redirect ---- */
.joinform button.wa-btn{display:inline-flex; align-items:center; gap:9px;
  background:#25D366; box-shadow:0 12px 24px -12px rgba(37,211,102,.85)}
.joinform button.wa-btn:hover{background:#1EBE5A}
.joinform button.wa-btn svg{width:19px; height:19px; fill:currentColor; flex:0 0 auto}
.community .notice{margin-top:14px; font-size:.8rem}
.community .done p{margin:0 0 16px; font-family:var(--round); font-weight:700;
  color:var(--green-deep); font-size:1.1rem}
.btn-wa-go{display:inline-flex; align-items:center; gap:9px; background:#25D366; color:#fff;
  border-radius:999px; padding:.85em 1.9em; text-decoration:none; font-family:var(--round);
  font-weight:700; font-size:1rem; box-shadow:0 12px 24px -12px rgba(37,211,102,.85);
  transition:transform .18s ease, background .18s ease}
.btn-wa-go:hover{transform:translateY(-2px); background:#1EBE5A}
.btn-wa-go svg{width:19px; height:19px; fill:currentColor}

/* The testimonial scroller bleeds past the wrap padding to put its peek at
   the screen edge, which leaks ~24px of horizontal page scroll between
   ~430-500px. `clip` (not `hidden`) stops it without creating a scroll
   container, so the sticky header keeps working. */
html,body{overflow-x:clip}

/* =================================================================
   FOLLOW-UPS — next 2-3 dated sessions.
   Server rule: WHERE starts_at >= NOW() AND is_active = 1
                ORDER BY starts_at LIMIT 3
   If that returns nothing, do not render the section at all. A dated
   block showing a past date makes the whole site look abandoned.
   ================================================================= */
.followups{background:#FFF6E0; padding:64px 0}
.fu-grid{display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:18px; max-width:960px; margin:0 auto}
.fu{display:flex; gap:16px; align-items:flex-start; background:#fff; border-radius:var(--r-lg);
  padding:20px 22px; box-shadow:var(--shadow); text-decoration:none; color:inherit;
  border-left:5px solid var(--yellow); transition:transform .18s ease}
.fu:hover{transform:translateY(-3px)}

/* date chip — a tear-off calendar leaf, not a month grid */
.fu .cal{flex:0 0 auto; width:56px; border-radius:12px; overflow:hidden; text-align:center;
  box-shadow:var(--shadow-sm); background:#fff; border:1px solid var(--line)}
.fu .cal .m{display:block; background:var(--magenta); color:#fff; font-family:var(--round); font-weight:700;
  font-size:.66rem; letter-spacing:.1em; text-transform:uppercase; padding:.35em 0}
.fu .cal .d{display:block; font-family:var(--serif); font-weight:600; font-size:1.55rem; color:var(--brown);
  line-height:1.15; padding:5px 0 7px}

.fu .body{min-width:0; flex:1 1 auto; display:block}
.fu .t{display:block; font-family:var(--serif); font-weight:600; font-size:1.08rem;
  color:var(--brown); line-height:1.25; margin-bottom:5px}
.fu .when{display:block; font-family:var(--round); font-weight:600; font-size:.85rem; color:var(--green-deep)}
.fu .where{display:block; margin-top:3px; font-size:.86rem; color:var(--ink-soft)}
.fu .go{display:block; margin-top:10px; font-family:var(--round); font-weight:700;
  font-size:.85rem; color:var(--magenta)}
.fu:hover .go{text-decoration:underline}
.followups .allfu{text-align:center; margin-top:30px}

/* ---- value chips: no flower glyph, 3 per row on phones ----
   Eight chips at the desktop size wrap to four rows on a 390px
   screen. Tightening type and padding for mobile gets it to three. */
.chips span::before{content:none}
@media (max-width:560px){
  .chips{gap:8px}
  .chips span{font-size:.82rem; padding:.45em .8em; border-width:1.25px}
}

/* ---- highlights: cards are no longer links ---- */
article.hl{cursor:default}
.hl .body{padding-bottom:20px}

/* ---- languages on a program page ---- */
.lang-note{max-width:560px; margin:18px auto 0; text-align:center;
  font-size:.92rem; color:var(--ink-soft)}

/* =================================================================
   ALL PROGRAMS — format comparison
   Real table on desktop; each row becomes a labelled card on mobile,
   because a 6-column table on a 390px screen is unreadable however
   you scroll it.
   ================================================================= */
.ptop{background:linear-gradient(180deg,#FFF7EA 0%, var(--cream) 100%); padding:64px 0 10px}

.agepick{display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:16px;
  max-width:900px; margin:0 auto}
.agecard{background:#fff; border-radius:var(--r); padding:20px 22px; box-shadow:var(--shadow-sm);
  border-top:4px solid var(--line)}
.agecard b{display:block; font-family:var(--round); font-weight:700; font-size:1.05rem;
  color:var(--brown); margin-bottom:6px}
.agecard span{font-size:.92rem; color:var(--ink-soft)}
.agecard span strong{font-family:var(--round); font-weight:700; color:var(--brown)}
.agecard.a{border-color:var(--foundation)} .agecard.b{border-color:var(--yellow)}
.agecard.c{border-color:var(--ramayan)}

/* filters — two rows, multi-select. Row 1 = program, row 2 = format.
   Within a row the choices are OR; across the rows they are AND. */
.pfilter{margin:0 0 22px}
.pfilter .frow{display:flex; flex-wrap:wrap; gap:9px; justify-content:center;
  align-items:center; margin-bottom:10px}
.pfilter .flab{font-family:var(--round); font-weight:700; font-size:.68rem;
  letter-spacing:.1em; text-transform:uppercase; color:var(--ink-soft);
  flex:0 0 auto; margin-right:2px; min-width:64px; text-align:right}
.pfilter button{font-family:var(--round); font-weight:700; font-size:.86rem; cursor:pointer;
  background:#fff; color:var(--brown); border:1.5px solid var(--line); border-radius:999px;
  padding:.5em 1.15em; transition:.16s}
.pfilter button:hover{border-color:var(--magenta); color:var(--magenta)}
.pfilter .frow:nth-child(2) button[aria-pressed="true"]{background:var(--green-deep);
  border-color:var(--green-deep); color:#fff}
.pfilter button[aria-pressed="true"]{background:var(--magenta); border-color:var(--magenta); color:#fff}
.pfilter button:focus-visible{outline:3px solid var(--yellow); outline-offset:2px}
.fclear{display:none; background:none; border:0; cursor:pointer; padding:0 0 0 10px;
  font-family:var(--round); font-weight:700; font-size:.84rem; color:var(--magenta);
  text-decoration:underline}
.fclear.on{display:inline}
@media (max-width:560px){
  .pfilter .flab{flex:1 0 100%; text-align:center; margin:0 0 2px}
  .pfilter .frow{gap:7px; margin-bottom:14px}
  .pfilter button{font-size:.8rem; padding:.45em .95em}
}

/* table */
.ftable{width:100%; border-collapse:separate; border-spacing:0 10px; max-width:1000px; margin:0 auto}
.ftable th{font-family:var(--round); font-weight:700; font-size:.72rem; letter-spacing:.1em;
  text-transform:uppercase; color:var(--ink-soft); text-align:left; padding:0 16px 4px}
.ftable td{background:#fff; padding:16px; font-size:.94rem; vertical-align:middle;
  border-top:1px solid var(--line); border-bottom:1px solid var(--line)}
.ftable td:first-child{border-left:1px solid var(--line); border-radius:14px 0 0 14px; border-left-width:5px}
.ftable td:last-child{border-right:1px solid var(--line); border-radius:0 14px 14px 0}
.ftable tr[data-prog="foundation"] td:first-child{border-left-color:var(--foundation)}
.ftable tr[data-prog="ramayan"] td:first-child{border-left-color:var(--ramayan)}
.ftable tr[data-prog="shlokas"] td:first-child{border-left-color:var(--blue)}
.ftable tr[data-prog="any"] td:first-child{border-left-color:#7B4B96}
.ftable tr[hidden]{display:none}
.ftable .nm{font-family:var(--round); font-weight:700; color:var(--brown)}
.ftable .code{display:block; font-size:.7rem; letter-spacing:.08em; text-transform:uppercase; color:var(--ink-soft)}
.pill{display:inline-block; font-family:var(--round); font-weight:700; font-size:.74rem;
  padding:.3em .8em; border-radius:999px; background:var(--green-soft); color:var(--green-deep)}
.pill.on{background:#E3F1F8; color:#2F7FA3}
.pill.school{background:#F3E9F7; color:#7B4B96}
.ftable a.pick{font-family:var(--round); font-weight:700; font-size:.86rem; color:var(--magenta); text-decoration:none}
.ftable a.pick:hover{text-decoration:underline}

@media (max-width:760px){
  .ftable thead{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0)}
  .ftable, .ftable tbody, .ftable tr, .ftable td{display:block; width:100%}
  .ftable{border-spacing:0}
  .ftable tr{background:#fff; border:1px solid var(--line); border-left:5px solid var(--line);
    border-radius:16px; margin-bottom:12px; padding:4px 0}
  .ftable tr[data-prog="foundation"]{border-left-color:var(--foundation)}
  .ftable tr[data-prog="ramayan"]{border-left-color:var(--ramayan)}
  .ftable tr[data-prog="shlokas"]{border-left-color:var(--blue)}
  .ftable tr[data-prog="any"]{border-left-color:#7B4B96}
  .ftable td{border:0; padding:7px 16px; display:flex; gap:12px; align-items:baseline}
  .ftable td::before{content:attr(data-label); flex:0 0 92px; font-family:var(--round);
    font-weight:700; font-size:.68rem; letter-spacing:.08em; text-transform:uppercase; color:var(--ink-soft)}
  .ftable td:first-child,.ftable td:last-child{border-radius:0}
  .ftable td:first-child{padding-top:14px} .ftable td:last-child{padding-bottom:14px}
}


/* institutional pointer under a program page's format grid */
.inst-note{margin:18px 0 0; font-size:.9rem; color:var(--ink-soft); text-align:center;
  background:var(--green-soft); border-radius:14px; padding:14px 18px}
.inst-note a{font-family:var(--round); font-weight:700; color:var(--green-deep); white-space:nowrap}

/* registration interstitial — narrower than the callback modal */
.modal-card.compact{width:min(440px,100%); padding-top:34px}
.modal-card.compact h3{font-size:1.32rem; line-height:1.3}
.modal-card.compact .sub{font-size:.9rem; margin-bottom:18px}

/* single recurring follow-up — one panel, not a calendar grid */
.fu-one{display:flex; gap:20px; align-items:center; background:#fff; border-radius:var(--r-lg);
  padding:24px 26px; box-shadow:var(--shadow-sm); text-decoration:none; color:inherit;
  max-width:620px; margin:0 auto; transition:transform .2s ease, box-shadow .2s ease}
.fu-one:hover{transform:translateY(-3px); box-shadow:var(--shadow)}
.fu-one .cal{flex:0 0 auto; width:78px; border-radius:12px; overflow:hidden; text-align:center;
  border:1px solid var(--line)}
.fu-one .cal .m{display:block; background:var(--magenta); color:#fff; font-family:var(--round);
  font-weight:700; font-size:.72rem; letter-spacing:.1em; text-transform:uppercase; padding:5px 0}
.fu-one .cal .d{display:block; font-family:var(--serif); font-weight:600; font-size:1.15rem;
  color:var(--brown); padding:8px 0}
.fu-one .body{min-width:0; flex:1 1 auto; display:block}
.fu-one .t{display:block; font-family:var(--serif); font-weight:600; font-size:1.14rem;
  color:var(--brown); margin-bottom:4px}
.fu-one .when{display:block; font-family:var(--round); font-weight:600; font-size:.86rem; color:var(--green-deep)}
.fu-one .where{display:block; margin-top:3px; font-size:.86rem; color:var(--ink-soft)}
.fu-one .go{display:block; margin-top:12px; font-family:var(--round); font-weight:700;
  font-size:.9rem; color:var(--magenta)}
.fu-one:hover .go{text-decoration:underline}
@media (max-width:520px){
  .fu-one{flex-direction:column; align-items:flex-start; gap:14px; padding:20px}
  .fu-one .cal{width:100%; display:flex}
  .fu-one .cal .m,.fu-one .cal .d{flex:1 1 auto; padding:7px 0}
}

/* ---------------- pages added in this pass ---------------- */
.wrap.narrow{max-width:760px}

/* legal / long-form text */
.legal h3{font-family:var(--round); font-weight:700; font-size:1.05rem; color:var(--brown);
  margin:30px 0 8px}
.legal h3:first-child{margin-top:0}
.legal p{margin:0 0 12px; font-size:.96rem; color:var(--ink-soft); line-height:1.7}
.legal ul.tick{margin:0 0 14px}
.legal ul.tick li{margin-bottom:8px}
.legal .dot{color:var(--magenta)}

/* contact cards */
.cgrid{display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:18px;
  max-width:900px; margin:0 auto}
.contact-card{background:#fff; border-radius:var(--r-lg); padding:26px 24px; text-align:center;
  box-shadow:var(--shadow-sm); border-top:4px solid var(--magenta)}
.contact-card .ci{display:block; font-size:1.7rem; margin-bottom:8px}
.contact-card b{display:block; font-family:var(--round); font-weight:700; color:var(--brown); margin-bottom:10px}
.contact-card p{margin:0 0 4px; font-size:1.02rem}
/* :not(.btn) — without it this rule repaints the button label magenta on
   magenta, because .contact-card p a (0,2,1) outranks .btn-primary (0,1,0). */
.contact-card p a:not(.btn){color:var(--magenta); font-family:var(--round); font-weight:700; text-decoration:none}
.contact-card p a:not(.btn):hover{text-decoration:underline}
.contact-card .cnote{display:block; margin-top:12px; font-size:.84rem; color:var(--ink-soft)}
.contact-card .btn{margin-top:4px}

/* FAQ page: group headings between lists */
.faq-list + .section-sub{margin-top:34px}

/* a button that reads as a link, inside body copy */
.linklike{background:none; border:0; padding:0; cursor:pointer; font:inherit;
  font-family:var(--round); font-weight:700; color:var(--magenta)}
.linklike:hover{text-decoration:underline}

/* Daily Shlokas accent + "launching soon" flag */
.program.shlokas.p-hero{background:#E3F1F8}
.program.shlokas .p-kicker,.program.shlokas .panel h3{color:#2F7FA3}
.program.shlokas .tick .dot{color:#3E9CC7}
.program.shlokas .p-age{background:#3E9CC7}
.soon{display:inline-block; margin-top:14px; background:#fff; border:1.5px dashed #3E9CC7;
  color:#2F7FA3; font-family:var(--round); font-weight:700; font-size:.88rem;
  border-radius:999px; padding:.5em 1.1em}

/* ---- institution card: the loudest cell in the programs grid ---- */
.ov-note{position:relative; overflow:hidden; border-radius:var(--r-lg); padding:32px;
  display:block; text-decoration:none; color:#fff; border:0; cursor:pointer;
  background:linear-gradient(135deg,#6FA82F,#41761A);
  box-shadow:0 14px 34px rgba(65,118,26,.32); transition:transform .2s ease, box-shadow .2s ease}
.ov-note::after{content:""; position:absolute; right:-40px; top:-40px; width:170px; height:170px;
  border-radius:50%; background:rgba(255,255,255,.12)}
.ov-note:hover{transform:translateY(-4px); box-shadow:0 20px 44px rgba(65,118,26,.42)}
.ov-note .badge{position:relative; display:inline-block; background:var(--yellow); color:#4A3524;
  font-family:var(--round); font-weight:700; font-size:.72rem; letter-spacing:.1em;
  text-transform:uppercase; border-radius:999px; padding:.4em .95em; margin-bottom:12px}
.ov-note h3{position:relative; font-size:1.75rem; margin:0 0 10px; color:#fff}
.ov-note h3 em{font-style:italic; color:var(--yellow)}
.ov-note p{position:relative; margin:0; font-size:.99rem; color:#fff; opacity:.95}
.ov-note .cta-pill{position:relative; display:inline-block; margin-top:20px; background:#fff;
  color:var(--green-deep); font-family:var(--round); font-weight:700; font-size:.9rem;
  border-radius:999px; padding:.6em 1.3em}
.ov-note:hover .cta-pill{background:var(--yellow); color:#4A3524}

/* ---- highlights: cover photo + heading only, whole card is the link ---- */
.hl{display:block; text-decoration:none; color:inherit}
.hl .body h3{margin:0}
.hl .body .more{display:inline-block; margin-top:8px; font-family:var(--round); font-weight:700;
  font-size:.88rem; color:var(--magenta)}
.hl:hover .body .more{text-decoration:underline}
.highlights .cta{text-align:center; margin-top:30px}

/* age tag inside a chooser card */
.agecard .agetag{display:inline-block; background:var(--cream2); color:var(--brown);
  font-family:var(--round); font-weight:700; font-size:.72rem; letter-spacing:.06em;
  border-radius:999px; padding:.25em .7em; margin-right:6px}

/* =================================================================
   PHOTO GALLERY
   Uploads arrive in whatever shape the camera produced. Each album is a
   horizontal scroller at a fixed height; every photo keeps its own
   aspect-ratio and takes the width that follows from it. Mixed portrait,
   landscape and square sit together with no cropping and no gaps.
   ================================================================= */
.album{padding:40px 0 10px}
.album + .album{padding-top:14px}
.album:nth-child(even){background:var(--cream2)}
.album .ahead{display:flex; align-items:flex-end; justify-content:space-between;
  gap:18px; flex-wrap:wrap; margin-bottom:16px}
.album h3{font-family:var(--serif); font-weight:600; font-size:1.5rem; color:var(--brown); margin:0}
.album .ameta{font-family:var(--round); font-weight:600; font-size:.84rem; color:var(--ink-soft);
  margin:4px 0 0}
.album .ameta b{color:var(--green-deep); font-weight:700}
.album .ablurb{margin:8px 0 0; font-size:.94rem; color:var(--ink-soft); max-width:60ch}
.album .acount{flex:0 0 auto; font-family:var(--round); font-weight:700; font-size:.78rem;
  letter-spacing:.06em; text-transform:uppercase; color:var(--ink-soft);
  background:#fff; border:1px solid var(--line); border-radius:999px; padding:.45em 1em}

.strip{display:flex; gap:12px; overflow-x:auto; scroll-snap-type:x proximity;
  padding:4px 0 18px; margin-inline:-24px; padding-inline:24px;
  scrollbar-width:thin; scrollbar-color:var(--line) transparent}
.strip::-webkit-scrollbar{height:8px}
.strip::-webkit-scrollbar-thumb{background:var(--line); border-radius:99px}
.strip .shot{flex:0 0 auto; height:260px; border:0; padding:0; background:none; cursor:zoom-in;
  border-radius:14px; overflow:hidden; box-shadow:var(--shadow-sm); scroll-snap-align:start;
  position:relative; transition:transform .18s ease, box-shadow .18s ease}
.strip .shot img{display:block; height:100%; width:auto; object-fit:cover}
.strip .shot:hover{transform:translateY(-3px); box-shadow:var(--shadow)}
.strip .shot:focus-visible{outline:3px solid var(--yellow); outline-offset:3px}
.strip .more-shot{flex:0 0 auto; align-self:center; font-family:var(--round); font-weight:700;
  font-size:.9rem; color:var(--magenta); padding:0 18px; white-space:nowrap}

@media (max-width:640px){
  .strip .shot{height:200px}
  .album h3{font-size:1.25rem}
}

/* ---- lightbox ---- */
.lightbox{position:fixed; inset:0; z-index:120; background:rgba(40,28,18,.93);
  display:none; align-items:center; justify-content:center; padding:56px 16px}
.lightbox.open{display:flex}
.lb-stage{margin:0; max-width:100%; max-height:100%; display:flex; flex-direction:column;
  align-items:center; gap:12px}
.lb-stage img{max-width:min(1100px,92vw); max-height:78vh; width:auto; height:auto;
  border-radius:10px; box-shadow:0 20px 60px rgba(0,0,0,.5)}
.lb-stage figcaption{font-family:var(--round); font-weight:600; font-size:.9rem;
  color:rgba(255,255,255,.88); text-align:center}
.lb-stage figcaption #lb-count{color:rgba(255,255,255,.55); margin-left:8px}
.lb-close,.lb-nav{position:absolute; background:rgba(255,255,255,.12); border:0; color:#fff;
  cursor:pointer; border-radius:50%; display:flex; align-items:center; justify-content:center;
  transition:background .15s ease}
.lb-close{top:16px; right:16px; width:44px; height:44px; font-size:1.8rem; line-height:1}
.lb-nav{top:50%; transform:translateY(-50%); width:48px; height:48px; font-size:2rem; line-height:1}
.lb-nav.prev{left:14px} .lb-nav.next{right:14px}
.lb-close:hover,.lb-nav:hover{background:rgba(255,255,255,.26)}
.lb-close:focus-visible,.lb-nav:focus-visible{outline:3px solid var(--yellow); outline-offset:3px}
@media (max-width:560px){
  .lightbox{padding:52px 8px}
  .lb-nav{width:40px; height:40px; font-size:1.6rem}
  .lb-nav.prev{left:6px} .lb-nav.next{right:6px}
  .lb-stage img{max-height:70vh}
}
/* the floating actions are noise while a photo is open, and they glow
   faintly through the overlay — take them out of the way */
body.lb-open .float-stack,body.lb-open .float-cta,body.lb-open .float-wa{display:none}

/* confirmation shown in place of the form after a successful submit */
.cbdone{text-align:center; padding:26px 6px 10px}
.cbdone .tick{display:inline-flex; align-items:center; justify-content:center;
  width:54px; height:54px; border-radius:50%; background:var(--green-soft);
  color:var(--green-deep); font-size:1.6rem; margin-bottom:14px}
.cbdone h4{font-family:var(--serif); font-weight:600; font-size:1.25rem;
  color:var(--brown); margin:0 0 8px; line-height:1.35}
.cbdone p{margin:0; font-size:.94rem; color:var(--ink-soft)}

/* =================================================================
   FORM DENSITY
   The modal was tall enough that the submit button fell below the fold
   on a 640px-high phone. Tightened the vertical rhythm only — input
   height stays at/above 44px for tapping, and the 1rem font size is
   deliberate: anything under 16px makes iOS Safari zoom on focus.
   ================================================================= */
.modal-card{padding:28px 26px 24px}
.modal-card h3{font-size:1.42rem; margin-bottom:14px}
.field{margin-bottom:11px}
.field label{font-size:.82rem; margin-bottom:4px}
.field input,.field select{padding:.62em .9em; border-radius:12px}
.consent{margin:14px 0 14px; font-size:.83rem; line-height:1.45}
.disclose{margin:2px 0 12px; padding:10px 13px}
.modal-card .more{padding-left:14px; margin-bottom:4px}

@media (max-width:640px){
  .modal{padding:0}
  .modal-card{padding:22px 18px 20px; max-height:100vh; border-radius:0; width:100%}
  .modal-card h3{font-size:1.28rem; margin-bottom:12px}
  .field{margin-bottom:9px}
  .field label{font-size:.8rem; margin-bottom:3px}
  .field input,.field select{padding:.58em .85em}
  .consent{margin:12px 0 12px}
  .disclose{margin:2px 0 10px; padding:9px 12px}
}

/* -----------------------------------------------------------------
   MODAL SCROLLING — fix
   Previously the card had max-height + overflow-y and the overlay used
   align-items:center. A centred flex item that overflows gets CLIPPED at
   both ends and cannot be scrolled to, so on a short screen the submit
   button was unreachable. Now the OVERLAY scrolls and the card is free to
   be any height; margin:auto still centres it when there is room.
   100vh is also wrong on mobile (it ignores browser chrome) — dvh where
   supported, with vh kept as the fallback for older browsers.
   ----------------------------------------------------------------- */
.modal{align-items:flex-start; overflow-y:auto; -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain}
.modal-card{max-height:none; margin:auto}

@media (max-width:640px){
  .modal{padding:0}
  .modal-card{margin:0; min-height:100vh; min-height:100dvh; border-radius:0; width:100%}
}
/* body{overflow:hidden} alone still lets the html element scroll, so a
   swipe over a modal that has nothing to scroll moved the page behind it */
html.modal-open,html.modal-open body{overflow:hidden; touch-action:none}
html.modal-open .modal,html.modal-open .lightbox{touch-action:auto}

/* =====================================================================
   FORMAT CARDS AS LINKS
   ---------------------------------------------------------------------
   Every format card is the same call to action as the page's main
   button: name and number first, then on to the Art of Living listing.
   Making the whole card the target means the click records WHICH format
   was chosen, which a single button at the bottom of the page cannot.

   Written as a.fmt, not .fmt, so it outranks the prototype's own .fmt
   rule in style.css — that file is left untouched.
   ===================================================================== */
a.fmt{
  /* column + height:100% so the prompt line sits on the same baseline in
     every card, however long the title above it runs */
  display:flex; flex-direction:column; height:100%;
  color:inherit; text-decoration:none;
  transition:transform .16s ease, box-shadow .16s ease;
}
a.fmt:hover,a.fmt:focus-visible{
  transform:translateY(-3px); box-shadow:var(--shadow-md,0 10px 28px rgba(0,0,0,.10));
}
a.fmt:focus-visible{ outline:2px solid var(--magenta); outline-offset:3px }
a.fmt strong{ color:var(--ink) }

/* The prompt line. .fmt span is already styled by the prototype, so this
   has to be more specific than that, not just different. */
a.fmt .go{
  display:block; margin-top:auto; padding-top:12px;
  font-family:var(--round); font-weight:700; font-size:.82rem;
  color:var(--magenta);
}
a.fmt .go i{ font-style:normal; display:inline-block; transition:transform .16s ease }
a.fmt:hover .go i,a.fmt:focus-visible .go i{ transform:translateX(4px) }

/* follow the program's own colour */
.program.foundation a.fmt .go{ color:var(--foundation-ink) }
.program.ramayan    a.fmt .go{ color:var(--ramayan-ink) }
.program.shlokas    a.fmt .go{ color:#2F7FA3 }
.program.foundation a.fmt:focus-visible{ outline-color:var(--foundation) }
.program.ramayan    a.fmt:focus-visible{ outline-color:var(--ramayan) }
.program.shlokas    a.fmt:focus-visible{ outline-color:#3E9CC7 }

/* =====================================================================
   REGISTRATION GATE ON MOBILE
   ---------------------------------------------------------------------
   The full-height sheet above exists for the callback form, which really
   does fill a phone screen. The gate is two fields and a button, so the
   same rule left a name box floating in a sea of cream.

   It becomes a bottom sheet instead: sized to its own content, anchored
   to the bottom edge where the thumb is, rounded at the top so it reads
   as a panel over the page rather than a new screen. margin-top:auto
   does the anchoring — the overlay is a flex row, so an auto margin on
   the cross axis pushes the card down.
   ===================================================================== */
@media (max-width:640px){
  .modal-card.compact{
    min-height:0;
    margin:auto 0 0;
    width:100%;
    border-radius:22px 22px 0 0;
    padding:24px 20px calc(20px + env(safe-area-inset-bottom, 0px));
    box-shadow:0 -12px 40px rgba(74,53,36,.22);
  }
  .modal-card.compact h3{font-size:1.18rem; margin-bottom:14px; padding-right:34px}
  .modal-card.compact .modal-close{top:12px; right:12px}

  /* the little grab bar that tells people this is a sheet */
  .modal-card.compact::before{
    content:""; display:block; width:38px; height:4px; border-radius:999px;
    background:var(--line); margin:-8px auto 14px;
  }
}

/* =================================================================
   "KNOW MORE" PILLS                                      Oct 2026
   Two shapes, because the two card types work differently.

   .ov-card / .ov-note are already one big <a>. A link inside a link is
   invalid HTML and browsers unnest it, so the pill there is a SPAN —
   it looks like a button and clicking it clicks the card, which is
   exactly where the card already goes.

   .agecard is a plain div with no link of its own, so its pill is a
   real <a> carrying its own destination.

   Both sit top-right, and the heading beside them gets right padding so
   a long title wraps instead of running underneath.
   ================================================================= */
.ov-card, .ov-note, .agecard{ position:relative }

.ov-card .know, .ov-note .know{
  position:absolute; top:18px; right:18px; z-index:2;
  display:inline-flex; align-items:center; gap:.35em;
  background:rgba(255,255,255,.22); color:#fff;
  font-family:var(--round); font-weight:700; font-size:.78rem;
  padding:.42em .9em; border-radius:999px; white-space:nowrap;
  border:1px solid rgba(255,255,255,.45); transition:background .2s ease, color .2s ease;
}
.ov-card:hover .know, .ov-note:hover .know{ background:#fff; color:var(--brown) }
.ov-card .tag{ padding-right:118px }
.ov-note .badge{ margin-right:118px }

/* The Programs comparison cards are now whole-card links (6 Oct), so the
   pill sits at the BOTTOM where the eye finishes reading and looks like a
   real button rather than a label. It is a span, not a link — the card is
   the link, and a link inside a link is invalid HTML.

   The card is a flex column so the button lines up across all three cards
   whatever the length of the text above it. */
.agecard{
  display:flex; flex-direction:column; text-decoration:none; color:inherit;
  transition:transform .2s ease, box-shadow .2s ease;
}
.agecard:hover{ transform:translateY(-3px); box-shadow:var(--shadow) }
.agecard > span:not(.know){ flex:1 }

.agecard .know{
  align-self:flex-start; margin-top:16px;
  display:inline-flex; align-items:center; gap:.4em;
  background:var(--brown); color:#fff;
  font-family:var(--round); font-weight:700; font-size:.84rem;
  padding:.6em 1.25em; border-radius:999px; white-space:nowrap;
  box-shadow:0 4px 12px rgba(74,53,36,.2);
  transition:background .2s ease, transform .2s ease;
}
.agecard:hover .know{ background:var(--ramayan); transform:translateX(2px) }
.agecard .know .arrow{ transition:transform .2s ease }
.agecard:hover .know .arrow{ transform:translateX(3px) }

/* Narrow phones: the pill would eat the title, so it drops to its own
   line under the heading and the right padding comes back off. */
@media (max-width:420px){
  .ov-card .know, .ov-note .know, .agecard .know{
    position:static; margin:0 0 12px; display:inline-flex;
  }
  .ov-card .tag{ padding-right:0 }
  .ov-note .badge{ margin-right:0 }
}

/* =================================================================
   PAGE JUMPS IN THE HEADER                              6 Oct 2026
   Two links on the three programme pages: Follow-ups (an anchor on
   the same page) and Programs (the Art of Living listing).

   They sit in the header rather than in a second sticky bar of their
   own, so there is still only one fixed strip and nothing overlaps
   the logo. On a phone the logo shrinks a little to make room — the
   stacked lockup is 46px tall and wide with it, and that width was
   the actual reason nothing else fitted on the row.
   ================================================================= */
.pgjump{display:flex; align-items:center; gap:7px}
.pgjump a{
  font-family:var(--round); font-weight:700; font-size:.82rem;
  text-decoration:none; white-space:nowrap;
  padding:.5em 1em; border-radius:999px;
  transition:background .15s ease, color .15s ease;
}
.pgjump a.fu{ background:var(--cream2); color:var(--brown) }
.pgjump a.fu:hover{ background:#E8DBC9 }
.pgjump a.up{ background:var(--magenta); color:#fff }
.pgjump a.up:hover{ background:#D12F75 }
.pgjump a:focus-visible{ outline:3px solid var(--yellow); outline-offset:2px }

/* `order` places this block, because one piece of markup has to work in
   two very different rows. In the HTML it sits right after the burger;
   on a desktop it belongs at the far right, after the menu, and on a
   phone it belongs between the logo and the burger. */
@media (min-width:981px){
  .nav-links{ order:2 }
  .pgjump{ order:3; margin-left:4px }
}

/* Phone: logo smaller, links centred between it and the menu button. */
@media (max-width:980px){
  .nav .brand img{ height:38px }
  .nav .wrap{ gap:10px }
  .pgjump{ order:2; margin:0 auto }
  .hamburger{ order:3; margin-left:0 }
  .pgjump a{ font-size:.78rem; padding:.45em .85em }
}
@media (max-width:380px){
  .nav .brand img{ height:34px }
  .pgjump{ gap:5px }
  .pgjump a{ font-size:.73rem; padding:.42em .7em }
}

/* Programme-page photo strip. Reuses .strip/.shot from the gallery; these
   pictures are not clickable, so drop the zoom cursor and the hover lift
   that together imply a lightbox the programme pages do not have. */
/* figure carries a default 1em/40px margin that a <button> does not,
   which is why this needs saying at all */
figure.shot{margin:0}
.strip .shot.static{cursor:default}
.strip .shot.static:hover{transform:none; box-shadow:var(--shadow-sm)}

/* =================================================================
   COMBINED FOLLOW-UPS PAGE
   Reuses .fu-grid / .fu from the programme-page band; only the
   per-programme grouping around them is new.
   ================================================================= */
.fu-block + .fu-block{margin-top:38px}
.fu-head{display:flex; align-items:baseline; justify-content:space-between;
  gap:16px; flex-wrap:wrap; margin-bottom:4px}
.fu-head .section-sub{margin:0}
.fu-about{font-family:var(--round); font-weight:700; font-size:.88rem;
  color:var(--magenta); text-decoration:none; white-space:nowrap}
.fu-about:hover{text-decoration:underline}
.fu-about i{font-style:normal}

/* =================================================================
   STATE-WISE CONTACT LIST
   27 regions and 70-odd people. A flat list is a wall, so each
   region is a closed accordion and the filter opens the ones that
   match — typing "Guj" should show Gujarat's people, not just
   highlight a collapsed heading.
   ================================================================= */
.vh{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap}

.clfind{margin:0 0 18px}
.clfind input{width:100%; font:inherit; font-size:1rem; padding:.85em 1.1em;
  border:1px solid var(--line); border-radius:999px; background:#fff; color:var(--ink)}
.clfind input:focus-visible{outline:3px solid var(--yellow); outline-offset:2px; border-color:var(--magenta)}
.clcount{margin:8px 2px 0; font-size:.85rem; color:var(--muted); min-height:1.2em}

.clregion{border:1px solid var(--line); border-radius:14px; background:#fff; margin:0 0 10px;
  overflow:hidden}
.clregion[hidden]{display:none}
.clregion > summary{display:flex; align-items:center; justify-content:space-between; gap:12px;
  cursor:pointer; padding:14px 18px; font-family:var(--round); font-weight:700; list-style:none}
.clregion > summary::-webkit-details-marker{display:none}
.clregion > summary:hover{background:var(--cream)}
.clregion > summary:focus-visible{outline:3px solid var(--yellow); outline-offset:-3px}
.clname{min-width:0}
.clnum{flex:0 0 auto; font-size:.78rem; font-weight:700; color:var(--green-deep);
  background:var(--green-soft); border-radius:999px; padding:.25em .7em}

.cllist{list-style:none; margin:0; padding:0 18px 8px; border-top:1px solid var(--line)}
.cllist li{display:flex; align-items:center; justify-content:space-between; gap:14px;
  flex-wrap:wrap; padding:12px 0}
.cllist li + li{border-top:1px solid var(--line)}
.cllist li[hidden]{display:none}
.clwho{min-width:0; display:flex; flex-direction:column; gap:1px}
.clwho small{color:var(--muted); font-size:.8rem}
.clact{display:flex; align-items:center; gap:10px; flex-wrap:wrap}
.cltel{font-family:var(--round); font-weight:700; color:var(--magenta); text-decoration:none;
  white-space:nowrap; border:1px solid var(--line); border-radius:999px; padding:.4em .95em}
.cltel:hover{background:var(--cream)}
.clmail{font-size:.85rem; color:var(--muted)}

@media (max-width:480px){
  .cllist li{flex-direction:column; align-items:flex-start; gap:8px}
}

/* =================================================================
   INSTITUTIONAL PAGE
   Two short lists side by side, and a tick list for outcomes.
   Collapses to one column well before the text gets cramped.
   ================================================================= */
.two-col{display:grid; grid-template-columns:repeat(auto-fit, minmax(260px, 1fr)); gap:10px 34px}
.colh{font-family:var(--round); font-weight:700; font-size:1rem; color:var(--magenta);
  margin:0 0 6px}

.ticks{list-style:none; margin:0 0 6px; padding:0}
.ticks li{position:relative; padding:0 0 0 26px; margin:0 0 8px; line-height:1.6}
.ticks li::before{content:""; position:absolute; left:2px; top:.55em;
  width:9px; height:5px; border-left:2px solid var(--green-deep);
  border-bottom:2px solid var(--green-deep); transform:rotate(-45deg)}
.ticks li b{font-weight:700}
.ticks.wide li{margin-bottom:12px}

/* The institutional cards are plain divs, not links, so they miss a.fmt's
   column layout — and style.css leaves .fmt span inline, which runs the
   duration and the format together on one line. */
.format-grid div.fmt span{display:block}

/* =================================================================
   SECTION SUB-HEADINGS OUTSIDE THE PROGRAMME PAGES

   .section-sub was only ever styled under `.program`, so on the pages
   added later — institutional, follow-ups — the four or five section
   headings rendered as plain body text and the page read as one
   undifferentiated wall. Same treatment as the programme pages, but
   left-aligned, because these pages are read as documents rather than
   as centred marketing sections.
   ================================================================= */
.section-sub{
  font-family:var(--round); font-weight:700; letter-spacing:.08em;
  text-transform:uppercase; font-size:.76rem; color:var(--magenta);
  margin:44px 0 16px;
}
/* The programme pages keep their own centred, programme-coloured version. */
.program .section-sub{text-align:center; margin:52px 0 18px}

/* First one on a page should not push a huge gap under the intro. */
.pad > .wrap > .reveal:first-child > .section-sub:first-child,
.pad > .wrap > .section-sub:first-child{margin-top:8px}

/* .fmt draws a 4px top border whose colour comes from a .foundation or
   .ramayan ancestor. The institutional page has neither, so the border fell
   back to currentColor and read as dark brown. Name the programme on the card
   instead — it also tells the reader at a glance which is which. */
.fmt-foundation{border-top-color:var(--foundation)}
.fmt-ramayan{border-top-color:var(--ramayan)}

/* Attribution under a pull-quote. */
.essence-by{margin:10px 0 0; text-align:center; font-family:var(--round);
  font-weight:600; font-size:.9rem; color:var(--muted)}
/* The Art of Living's own one-line statement, set apart from the paragraphs. */
.aol-line{font-family:var(--round); font-weight:700; font-size:1.05rem; color:var(--green-deep)}

/* Social row on the contact page — bigger than the footer's, since here it
   is the section rather than a footnote to it. */
.csocial{display:flex; justify-content:center; gap:16px; margin-top:8px}
.csocial a{width:48px; height:48px}
.csocial a svg{width:22px; height:22px}

/* The institutional page's section headings sit above wide blocks rather
   than beside body copy, so they are centred and a size up — asked for on
   "What a session contains", applied to all four so they match. */
.p-inst .section-sub{text-align:center; font-size:.95rem; letter-spacing:.06em}
/* Tick lists inside an accordion answer are already indented by the panel. */
.faq-item .ans .ticks{margin-top:6px}
.faq-item .ans .ticks li{margin-bottom:6px}

/* ---- TESTIMONIALS: wider cards, tighter gaps ----
   Asked for by the stakeholders: bigger cards, less space between them, and
   on a phone exactly one card plus about a fifth of the next, so it is
   obvious the row scrolls.

   The mobile block has to come AFTER the desktop rule, not before it: both
   set grid-template-columns at the same specificity, so whichever is written
   last wins and a desktop rule appended later silently turns the phone
   scroller back into a wrapping grid.

   86% is not arbitrary. Percentages resolve against the grid's content box,
   which is the viewport less 24px of padding each side, while the peek runs
   out over the right-hand padding to the screen edge:
   viewport = card + gap + 0.2*card solves to about 92% of that box. */
.voice-grid{grid-template-columns:repeat(auto-fit,minmax(380px,1fr)); gap:14px; max-width:1120px}

@media (max-width:720px){
  .voice-grid{
    grid-template-columns:none;
    grid-auto-flow:column;
    grid-auto-columns:92%;
    gap:10px;
    overflow-x:auto;
    overscroll-behavior-x:contain;
    scroll-snap-type:x mandatory;
    margin-inline:-24px;
    padding:4px 24px 18px;
  }
  .voice{scroll-snap-align:start}
}

/* THE actual reason the testimonials looked narrow with wide gaps: .voice is
   a <figure>, and a figure's default margin is 1em 40px. Each card sat 80px
   narrower than its grid column, and that margin read as the gap. Zeroing it
   is what makes the cards wide and the gaps the size the gap property says. */
figure.voice{margin:0}

/* ---- "Know More" moves to the bottom of the card on mobile ----
   On a phone the pill sat top-right, overlapping the eye-line of the title
   and reading as a label rather than a button. At the bottom it is where
   the eye finishes reading, the same place the comparison cards put it.

   .know is the FIRST element in the markup (it has to be, so it is not
   trapped inside a paragraph), so `order` moves it rather than the DOM. */
@media (max-width:720px){
  .ov-card, .ov-note{display:flex; flex-direction:column}
  .ov-card .know, .ov-note .know{
    position:static; order:99; align-self:flex-start; margin-top:16px;
    background:#fff; color:var(--brown); border-color:#fff;
    font-size:.84rem; padding:.6em 1.25em;
    box-shadow:0 4px 12px rgba(74,53,36,.18);
  }
  /* the right padding only existed to clear the absolute pill */
  .ov-card .tag{padding-right:0}
  .ov-note .badge{margin-right:0}
}

/* A programme with a single format stretched its one card across the whole
   row, which read as a broken full-width band rather than a card. Cap the
   track so one card sits at a card's width and the row stays left-aligned. */
.format-grid{justify-content:start}
.format-grid > *{max-width:420px}

/* Daily Shlokas has no closing band of its own, and the Ramayan one lost its
   heading, leaving a tall empty strip with a button floating in it. Tighten
   the band when it holds nothing but the button. */
.closing:not(:has(h2)){padding-top:38px; padding-bottom:38px}
