/* ===== BEGIN assets/css/tap-frontend.css ===== */
:root{--tap-purple:#6109be; --tap-purple-deep:#4a0090; --tap-purple-pale:#f0e8fd;
  --tap-marigold:#f99000; --tap-marigold-deep:#db8400;
  --tap-terracotta:#d75c27; --tap-chocolate:#5e3023;
  --tap-saffron:#FF8C00; --tap-sindoor:#E03B3B;
  --tap-lotus:#F4A0B5; --tap-ganga:#4A9EBF;
  --tap-turmeric:#F5C842; --tap-gold-light:#FFF8E7;
  /* Multi-stop metallic gold tokens */
  --tap-gold-stop-1:#BF953F; --tap-gold-stop-2:#FCF6BA; --tap-gold-stop-3:#B38728; --tap-gold-stop-4:#FBF5B7; --tap-gold-stop-5:#AA771C;
  --grad-gold-multistop:linear-gradient(135deg, #BF953F 0%, #FCF6BA 25%, #B38728 50%, #FBF5B7 75%, #AA771C 100%);
  --grad-gold-metallic:linear-gradient(90deg, #d4af37 0%, #fff3a8 30%, #f99000 70%, #aa771c 100%);
  --tap-ink:#1e0a2e; --tap-muted:#6b5b78;
  --tap-line:#ece6f2; --tap-bg:#faf7fd; --tap-card:#fff;
  --tap-ok:#1a7d3c; --tap-ok-pale:#e8f8ee; --tap-gold-dark:#3a2400; --tap-warn-bg:#fff4e7; --tap-warn-fg:#854f0b; --tap-warn:#c9851b; --tap-err:#c0392b;
  --grad-sacred:linear-gradient(135deg,var(--tap-purple, #6109be) 0%,var(--tap-terracotta, #d75c27) 100%);
  --grad-gold:linear-gradient(135deg,var(--tap-marigold, #f99000) 0%,#f5c842 100%);
  --grad-dawn:linear-gradient(135deg,var(--tap-saffron, #FF8C00) 0%,var(--tap-purple, #6109be) 100%);
  --grad-night:linear-gradient(180deg,#0D0820 0%,#1A0A40 100%);
  /* 3-Tier Elevation Shadows */
  --tap-shadow-sm:0 2px 8px rgba(30,10,46,.06), 0 1px 3px rgba(97,9,190,.04);
  --tap-shadow-md:0 6px 20px rgba(30,10,46,.10), 0 2px 6px rgba(97,9,190,.06);
  --tap-shadow-lg:0 16px 48px rgba(30,10,46,.16), 0 4px 12px rgba(97,9,190,.10);
  --tap-shadow:var(--tap-shadow-md);
  --tap-shadow-xl:var(--tap-shadow-lg);
  --tap-shadow-gold:0 6px 24px rgba(249,144,0,.28), 0 2px 8px rgba(176,119,28,.15);
  --tap-glow:0 0 0 3px rgba(97,9,190,.15);
  --tap-radius:18px; --tap-radius-sm:10px; --tap-radius-xl:28px;
  --tap-radius-full:999px;
  --ease-spring:cubic-bezier(.34,1.56,.64,1);
  --ease-out:cubic-bezier(.4,0,.2,1);
  --dur-fast:150ms; --dur-std:250ms; --dur-slow:400ms;
  --zi-base:1; --zi-nav:100; --zi-sticky:500; --zi-overlay:1000; --zi-modal:5000; --zi-toast:10000;
  --nav-h:64px;
  /* ══ P6c: formalized design-token system (white-label) ═══════════════════
     Every token below defaults to the CURRENT look, so nothing changes until a
     token is overridden — via Layout Studio / Brand Customizer (which print an
     inline :root{} on the tap-layout / tap-premium handles), or a client's own
     child CSS. This is the two-layer model: primitives above, roles below. */
  /* Spacing scale */
  --tap-space-1:4px;  --tap-space-2:8px;  --tap-space-3:12px; --tap-space-4:16px;
  --tap-space-5:20px; --tap-space-6:24px; --tap-space-8:32px; --tap-space-10:40px;
  /* Type scale — --tap-fs-scale is the knob Layout Studio → Text size drives. */
  --tap-fs-scale:1;
  --tap-fs-xs:calc(11px * var(--tap-fs-scale));
  --tap-fs-sm:calc(13px * var(--tap-fs-scale));
  --tap-fs-md:calc(15px * var(--tap-fs-scale));
  --tap-fs-base:calc(16px * var(--tap-fs-scale));
  --tap-fs-lg:calc(18px * var(--tap-fs-scale));
  --tap-fs-xl:calc(22px * var(--tap-fs-scale));
  /* Button — Layout Studio → Button style drives --tap-btn-radius. */
  --tap-btn-radius:var(--tap-radius-full); --tap-btn-pad-y:12px; --tap-btn-pad-x:22px; --tap-btn-weight:700;
  /* Card / surface roles */
  --tap-surface:var(--tap-card); --tap-card-shadow:var(--tap-shadow);
  --tap-border:var(--tap-line); --tap-text:var(--tap-ink); --tap-text-muted:var(--tap-muted);}
/* Midnight Temple Dark Mode (OS preference & explicit dark/midnight class) */
@media (prefers-color-scheme: dark) {
  :root {
    --tap-bg: #0B0614;
    --tap-card: #150A24;
    --tap-surface: #150A24;
    --tap-ink: #F5EFFC;
    --tap-text: #F5EFFC;
    --tap-muted: #A694B8;
    --tap-text-muted: #A694B8;
    --tap-line: #2C1647;
    --tap-border: #2C1647;
    --tap-gold-light: #2E1E05;
    --tap-purple-pale: #230E38;
    --tap-shadow-sm: 0 2px 10px rgba(0,0,0,.45);
    --tap-shadow-md: 0 8px 28px rgba(0,0,0,.55);
    --tap-shadow-lg: 0 16px 56px rgba(0,0,0,.70);
  }
}
.tap-dark, [data-theme="dark"], body.tap-theme-midnight {
  --tap-bg: #0B0614; --tap-card: #150A24; --tap-surface: #150A24;
  --tap-ink: #F5EFFC; --tap-text: #F5EFFC; --tap-muted: #A694B8;
  --tap-line: #2C1647; --tap-border: #2C1647; --tap-purple-pale: #230E38;
}
.tap-root{font-family:"Plus Jakarta Sans",system-ui,-apple-system,sans-serif;
  font-size:var(--tap-fs-base); line-height:1.6; color:var(--tap-ink);
  background:var(--tap-bg); -webkit-font-smoothing:antialiased;
  overflow-x:hidden;}
.tap-root *{box-sizing:border-box; margin:0; padding:0}
.tap-root h1, .tap-root h2, .tap-root h3, .tap-root .tap-serif{font-family:"Fraunces",Georgia,serif; font-weight:700;
  letter-spacing:-.02em; line-height:1.25;}
.tap-root .tap-devanagari{font-family:"Yatra One","Noto Serif Devanagari",serif}
/* v6.6.4: scoped — --nav-h is DIVSA's bottom nav, so this padding was
   shifting anchor scrolling on theme and WooCommerce pages too. */
body.tap-app{scroll-padding-bottom:calc(var(--nav-h) + 16px)}
@media(min-width:768px){.tap-bottom-nav{display:none}}
@media(max-width:767px){.tap-root{padding-bottom:var(--nav-h)}}
.tap-container{max-width:1120px; margin:0 auto; padding:0 16px}
.tap-section-head{display:flex; align-items:center; justify-content:space-between; margin-bottom:20px}
.tap-section-head h2{font-size:clamp(20px,3vw,26px)}
.tap-view-all{color:var(--tap-purple); font-weight:700; font-size:calc(0.875 * var(--tap-fs)); text-decoration:none}
.tap-display{font-size:clamp(28px,5vw,52px); font-family:"Fraunces",serif; font-weight:900; line-height:1.1}
.tap-title{font-size:clamp(16px,2.5vw,22px); font-weight:700}
.tap-small{font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted)}
.tap-caption{font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted); letter-spacing:.05em; text-transform:uppercase; font-weight:700}
.tap-btn:active{transform:scale(.97)}
.tap-btn[disabled]{opacity:.5; cursor:not-allowed; pointer-events:none}
.tap-btn-primary{background:var(--tap-purple); color:#fff; box-shadow:0 4px 16px rgba(97,9,190,.30)}
.tap-btn-primary:hover{background:var(--tap-purple-deep)}
.tap-btn-gold{background:var(--grad-gold); color:#3a2400; box-shadow:var(--tap-shadow-gold)}
.tap-btn-sacred{background:var(--grad-sacred); color:#fff}
.tap-btn-ghost{background:transparent; color:var(--tap-purple); border:2px solid var(--tap-line)}
.tap-btn-ghost:hover{border-color:var(--tap-purple); background:var(--tap-purple-pale)}
.tap-btn-sm{padding:8px 16px; font-size:calc(0.8125 * var(--tap-fs))}
.tap-ticker{background:var(--tap-ink); color:#fff; overflow:hidden; height:36px; display:flex; align-items:center}
.tap-ticker-track{display:flex; gap:64px; white-space:nowrap; animation:tapTicker 40s linear infinite}
.tap-ticker-track:hover{animation-play-state:paused}
.tap-ticker-item{font-size:calc(0.8125 * var(--tap-fs)); font-weight:500; flex-shrink:0; padding:0 8px}
.tap-ticker-dot{display:inline-block; width:6px; height:6px; background:var(--tap-saffron); border-radius:50%; margin-right:8px; animation:tapPulse 1.5s ease-in-out infinite}
@keyframes tapTicker{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@keyframes tapPulse{0%,100%{opacity:1}50%{opacity:.4}}
.tap-tithi-bar{background:linear-gradient(90deg,#fff8e7,#fff); border-bottom:1px solid #f5e8c0; padding:10px 16px; display:flex; align-items:center; gap:12px; flex-wrap:wrap}
.tap-tithi-tag{display:inline-flex; align-items:center; gap:6px; background:#fff; border:1px solid #f5e8c0; border-radius:var(--tap-r-full); padding:4px 12px; font-size:calc(0.8125 * var(--tap-fs)); font-weight:600; color:var(--tap-chocolate)}
.tap-festival-chip{display:inline-flex; align-items:center; gap:6px; background:var(--grad-gold); color:#3a2400; border-radius:var(--tap-r-full); padding:4px 12px; font-size:calc(0.75 * var(--tap-fs)); font-weight:700; text-decoration:none; animation:tapGlow 2s ease-in-out infinite}
@keyframes tapGlow{0%,100%{box-shadow:0 0 0 0 rgba(249,144,0,0)}50%{box-shadow:0 0 12px rgba(249,144,0,.5)}}
.tap-problem-search{padding:48px 0; background:var(--tap-bg)}
.tap-search-box{background:#fff; border:2px solid var(--tap-line); border-radius:var(--tap-radius-xl); padding:8px 8px 8px 24px; display:flex; align-items:center; gap:12px; box-shadow:var(--tap-shadow); transition:border-color var(--dur-std),box-shadow var(--dur-std); max-width:680px; margin:0 auto}
.tap-search-box:focus-within{border-color:var(--tap-purple); box-shadow:0 0 0 4px rgba(97,9,190,.10),var(--tap-shadow)}
.tap-search-box input{flex:1; border:none; outline:none; font:inherit; font-size:calc(1.0625 * var(--tap-fs)); color:var(--tap-ink); background:transparent}
.tap-search-box input::placeholder{color:var(--tap-muted)}
.tap-search-submit{flex-shrink:0; background:var(--tap-purple); color:#fff; border:none; border-radius:var(--tap-radius); padding:12px 20px; font:inherit; font-weight:700; font-size:calc(0.9375 * var(--tap-fs)); cursor:pointer; display:flex; align-items:center; gap:8px; transition:background var(--dur-fast)}
.tap-search-submit:hover{background:var(--tap-purple-deep)}
.tap-deity-grid{display:flex; gap:16px; overflow-x:auto; padding:4px 16px 8px; scrollbar-width:none; justify-content:center; flex-wrap:wrap}
.tap-deity-grid::-webkit-scrollbar{display:none}
.tap-deity-icon{width:64px; height:64px; border-radius:50%; background:var(--grad-gold); display:flex; align-items:center; justify-content:center; font-size:calc(1.75 * var(--tap-fs)); box-shadow:0 4px 16px rgba(249,144,0,.30); transition:transform var(--dur-std) var(--ease-spring),box-shadow var(--dur-std); border:3px solid #fff}
.tap-deity-item:hover .tap-deity-icon, .tap-deity-item.active .tap-deity-icon{transform:translateY(-4px) scale(1.08); box-shadow:0 8px 24px rgba(249,144,0,.45)}
.tap-deity-item.active .tap-deity-icon{background:var(--grad-sacred)}
.tap-deity-name{font-size:calc(0.75 * var(--tap-fs)); font-weight:700; color:var(--tap-chocolate); text-align:center; line-height:1.3; font-family:"Yatra One",serif}
.tap-hscroll{display:flex; gap:16px; overflow-x:auto; padding:4px 16px 8px; scrollbar-width:none}
.tap-hscroll::-webkit-scrollbar{display:none}
.tap-hscroll .tap-pcard{width:260px; flex-shrink:0}
.tap-slot-urgent{position:absolute; bottom:10px; right:10px; background:rgba(224,59,59,.85); color:#fff; backdrop-filter:blur(8px); border-radius:var(--tap-r-full); padding:3px 9px; font-size:calc(0.625 * var(--tap-fs)); font-weight:800}
.tap-pcard h3{font-size:calc(1 * var(--tap-fs)); font-weight:700; color:var(--tap-ink); line-height:1.3}
.tap-price-strike{font-size:calc(0.8125 * var(--tap-fs)); text-decoration:line-through; color:var(--tap-muted)}
.tap-filter-bar{display:flex; gap:8px; overflow-x:auto; padding:0 16px 4px; scrollbar-width:none; margin-bottom:16px}
.tap-filter-bar::-webkit-scrollbar{display:none}
.tap-chip{flex-shrink:0; padding:8px 16px; border-radius:var(--tap-r-full); border:1.5px solid var(--tap-line); background:#fff; color:var(--tap-muted); font:inherit; font-size:calc(0.8125 * var(--tap-fs)); font-weight:600; cursor:pointer; transition:all var(--dur-fast); white-space:nowrap}
.tap-chip.is-active, .tap-chip:hover{background:var(--tap-purple); border-color:var(--tap-purple); color:#fff}
.tap-filters{display:flex; gap:8px; flex-wrap:wrap; margin-bottom:12px}
.tap-detail-hero video, .tap-detail-hero img{width:100%; height:100%; object-fit:cover; opacity:.7}
@media(max-width:900px){.tap-detail-layout{grid-template-columns:1fr}}
.tap-trust-card .tap-price-from{font-size:calc(1.625 * var(--tap-fs))}
.tap-trust-signals li:last-child{border-bottom:none}
.tap-trust-signals li b{color:var(--tap-ok)}
.tap-live-watchers{display:inline-flex; align-items:center; gap:6px; background:#fff0f0; border-radius:var(--tap-r-full); padding:4px 12px; font-size:calc(0.75 * var(--tap-fs)); font-weight:700; color:var(--tap-sindoor); margin-bottom:14px}
.tap-detail-tabs{display:flex; gap:0; border-bottom:2px solid var(--tap-line); margin-bottom:20px; overflow-x:auto; scrollbar-width:none}
.tap-detail-tabs::-webkit-scrollbar{display:none}
.tap-dtab{padding:10px 18px; border:none; background:none; font:inherit; font-size:calc(0.875 * var(--tap-fs)); font-weight:700; color:var(--tap-muted); cursor:pointer; border-bottom:3px solid transparent; margin-bottom:-2px; white-space:nowrap; transition:all var(--dur-fast)}
.tap-dtab.active{color:var(--tap-purple); border-bottom-color:var(--tap-purple)}
.tap-watch-btn{display:inline-flex; align-items:center; gap:8px; background:rgba(255,255,255,.2); backdrop-filter:blur(10px); border:1px solid rgba(255,255,255,.3); border-radius:var(--tap-r-full); padding:8px 16px; color:#fff; font-size:calc(0.8125 * var(--tap-fs)); font-weight:700; cursor:pointer; transition:all var(--dur-fast)}
.tap-watch-btn:hover{background:rgba(255,255,255,.35)}
.tap-video-intro{display:inline-flex; align-items:center; gap:6px; margin-top:10px; color:var(--tap-purple); font-size:calc(0.8125 * var(--tap-fs)); font-weight:700; cursor:pointer}
.tap-muhurat-cal{border-radius:var(--tap-radius); overflow:hidden; border:1px solid var(--tap-line)}
.tap-muhurat-header{background:var(--tap-ink); color:#fff; padding:12px 16px; display:flex; align-items:center; justify-content:space-between}
.tap-muhurat-header h3{font-size:calc(0.9375 * var(--tap-fs)); font-weight:700; color:#fff}
.tap-muhurat-legend{display:flex; gap:12px; padding:10px 16px; background:#fff; border-bottom:1px solid var(--tap-line); flex-wrap:wrap}
.tap-muhurat-leg-item{display:flex; align-items:center; gap:5px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:700; color:var(--tap-muted)}
.tap-muhurat-dot{width:10px; height:10px; border-radius:50%}
.tap-cal-grid{display:grid; grid-template-columns:repeat(7,1fr); background:#fff; padding:4px}
.tap-cal-day:hover{background:var(--tap-purple-pale); color:var(--tap-purple)}
.tap-cal-day.selected{background:var(--tap-purple); color:#fff}
.tap-cal-day.auspicious{color:var(--tap-marigold-deep)}
.tap-cal-day.auspicious::after{content:""; position:absolute; bottom:2px; left:50%; transform:translateX(-50%); width:4px; height:4px; background:var(--tap-marigold); border-radius:50%}
.tap-cal-day.ekadashi{font-weight:900; color:var(--tap-saffron)}
.tap-cal-day.disabled{opacity:.3; cursor:not-allowed; pointer-events:none}
.tap-cal-day-hdr{aspect-ratio:1; display:flex; align-items:center; justify-content:center; font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; color:var(--tap-muted); letter-spacing:.05em}
.tap-step-bar{display:flex; align-items:center; margin-bottom:28px; overflow-x:auto; scrollbar-width:none; padding:4px 0}
.tap-step-bar::-webkit-scrollbar{display:none}
.tap-step{display:flex; flex-direction:column; align-items:center; gap:4px; flex:1; min-width:60px}
.tap-step-circle{width:36px; height:36px; border-radius:50%; border:2px solid var(--tap-line); background:#fff; display:flex; align-items:center; justify-content:center; font-size:calc(0.8125 * var(--tap-fs)); font-weight:800; color:var(--tap-muted); transition:all var(--dur-std); position:relative; z-index:1}
.tap-step.done .tap-step-circle{background:var(--tap-ok); border-color:var(--tap-ok); color:#fff}
.tap-step.active .tap-step-circle{background:var(--tap-purple); border-color:var(--tap-purple); color:#fff; box-shadow:0 0 0 4px rgba(97,9,190,.2)}
.tap-step-label{font-size:calc(0.6875 * var(--tap-fs)); font-weight:700; color:var(--tap-muted); white-space:nowrap}
.tap-step.active .tap-step-label{color:var(--tap-purple)}
.tap-step-line{flex:1; height:2px; background:var(--tap-line); margin:0 -4px; margin-bottom:18px; transition:background var(--dur-std)}
.tap-step.done + .tap-step-line{background:var(--tap-ok)}
.tap-sankalp-sacred{background:linear-gradient(135deg,#fff8e7 0%,#faf6ff 100%); border:1.5px solid #f5e8c0; border-radius:var(--tap-radius); padding:20px; position:relative}
/* v6.9.13: the hardcoded 🙏 badge over the Sankalp box was removed at the owner's request. */
.tap-sankalp-sacred textarea{width:100%; border:none; background:transparent; outline:none; font:inherit; font-size:calc(0.9375 * var(--tap-fs)); resize:none; min-height:80px; color:var(--tap-ink); line-height:1.7}
.tap-sankalp-sacred textarea::placeholder{color:var(--tap-muted); font-style:italic}
.tap-review{display:flex; gap:12px; padding:14px 0; border-bottom:1px solid var(--tap-line)}
.tap-review:last-child{border-bottom:none}
.tap-review-avatar{width:44px; height:44px; border-radius:50%; flex-shrink:0; background:var(--grad-dawn); display:flex; align-items:center; justify-content:center; font-size:calc(1.125 * var(--tap-fs)); font-weight:700; color:#fff}
.tap-review-bubble{background:#e7f4e7; border-radius:0 14px 14px 14px; padding:10px 14px; flex:1}
.tap-review-meta{font-size:calc(0.75 * var(--tap-fs)); font-weight:700; color:var(--tap-ok, #1a7d3c); margin-bottom:4px}
.tap-review-text{font-size:calc(0.875 * var(--tap-fs)); line-height:1.6; color:var(--tap-ink)}
.tap-review-time{font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted); margin-top:4px; text-align:right}
.tap-spiritual-header{background:var(--grad-night); border-radius:var(--tap-radius-xl); padding:24px 20px; color:#fff; margin-bottom:20px; position:relative; overflow:hidden}
.tap-spiritual-header::before{content:""; position:absolute; top:-40px; right:-40px; width:200px; height:200px; border-radius:50%; background:radial-gradient(circle,rgba(249,144,0,.2) 0%,transparent 70%)}
.tap-spiritual-uid{font-size:calc(0.8125 * var(--tap-fs)); opacity:.7; margin-bottom:4px; font-weight:600}
.tap-spiritual-name{font-size:calc(1.5 * var(--tap-fs)); font-weight:900; font-family:"Fraunces",serif; margin-bottom:8px}
.tap-spiritual-stats{display:flex; gap:16px; flex-wrap:wrap; margin-bottom:14px}
.tap-spiritual-stat{font-size:calc(0.8125 * var(--tap-fs)); opacity:.85}
.tap-spiritual-stat strong{font-size:calc(1.125 * var(--tap-fs)); display:block; font-weight:800; font-family:"Fraunces",serif}
.tap-level-bar{background:rgba(255,255,255,.2); border-radius:var(--tap-r-full); height:6px; margin-top:6px; overflow:hidden}
.tap-level-fill{height:100%; background:var(--grad-gold); border-radius:var(--tap-r-full); transition:width 1s var(--ease-out)}
.tap-level-label{font-size:calc(0.6875 * var(--tap-fs)); opacity:.7; margin-top:4px}
.tap-level-badge{display:inline-flex; align-items:center; gap:6px; background:var(--grad-gold); color:#3a2400; border-radius:var(--tap-r-full); padding:4px 12px; font-size:calc(0.75 * var(--tap-fs)); font-weight:800}
.tap-timeline{padding:4px 0}
.tap-timeline-item{display:flex; gap:16px; padding:16px 0; border-bottom:1px solid var(--tap-line); position:relative}
.tap-timeline-item:last-child{border-bottom:none}
.tap-tl-left{display:flex; flex-direction:column; align-items:center; gap:4px; width:48px; flex-shrink:0}
.tap-tl-date{font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; color:var(--tap-muted); text-align:center; line-height:1.2}
.tap-tl-icon{width:44px; height:44px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:calc(1.25 * var(--tap-fs)); flex-shrink:0}
.tap-tl-icon.completed{background:#e8f8ee}
.tap-tl-icon.upcoming{background:#fff4e7}
.tap-tl-icon.cancelled{background:#f5f5f5}
.tap-tl-content{flex:1}
.tap-tl-title{font-weight:700; font-size:calc(0.9375 * var(--tap-fs)); margin-bottom:2px}
.tap-tl-meta{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted)}
.tap-tl-thumb{width:56px; height:56px; border-radius:var(--tap-r-sm); object-fit:cover; flex-shrink:0; background:var(--tap-line)}
.tap-tl-status{display:inline-flex; align-items:center; gap:4px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; border-radius:var(--tap-r-full); padding:2px 10px; margin-top:6px}
.tap-tl-status.completed{background:#e8f8ee; color:var(--tap-ok)}
.tap-tl-status.upcoming{background:#fff4e7; color:var(--tap-saffron)}
.tap-tl-status.cancelled{background:#f5f5f5; color:var(--tap-muted)}
.tap-mem-card-v2{border-radius:var(--tap-radius-xl); padding:24px 22px; color:#fff; position:relative; overflow:hidden; background:linear-gradient(135deg,var(--tap-purple, #6109be) 0%,#4a0090 100%)}
.tap-mem-card-v2.gold{background:linear-gradient(135deg,#c8860a 0%,#f5c842 100%); color:#3a2400}
.tap-mem-card-v2.saffron{background:linear-gradient(135deg,var(--tap-terracotta, #d75c27) 0%,var(--tap-marigold, #f99000) 100%); color:#3a2400}
.tap-mem-card-v2::after{
  content:""; position:absolute; bottom:-15px; right:-5px; width:120px; height:120px;
  opacity:.12; pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' fill='%23ffffff'%3E%3Cpath d='M50 5 C55 25 75 35 95 35 C75 50 80 75 50 95 C20 75 25 50 5 35 C25 35 45 25 50 5 Z M50 20 C40 35 30 45 50 75 C70 45 60 35 50 20 Z'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:contain;
}
.tap-mem-card-chip{font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; text-transform:uppercase; letter-spacing:.1em; opacity:.75; margin-bottom:6px}
.tap-mem-plan-name{font-size:calc(1.625 * var(--tap-fs)); font-weight:900; font-family:"Fraunces",serif; margin-bottom:12px}
.tap-mem-uid{font-size:calc(1 * var(--tap-fs)); font-weight:700; letter-spacing:.08em; font-family:monospace; margin-bottom:4px}
.tap-mem-expiry{font-size:calc(0.75 * var(--tap-fs)); opacity:.7}
.tap-mem-benefits-row{display:flex; gap:12px; margin-top:16px; flex-wrap:wrap}
.tap-mem-benefit-chip{background:rgba(255,255,255,.2); border-radius:var(--tap-r-full); padding:4px 12px; font-size:calc(0.75 * var(--tap-fs)); font-weight:700}
.tap-gallery-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:4px; border-radius:var(--tap-radius); overflow:hidden}
.tap-gallery-item{aspect-ratio:1; position:relative; cursor:pointer; overflow:hidden; background:var(--tap-line)}
.tap-gallery-item img{width:100%; height:100%; object-fit:cover; transition:transform var(--dur-slow)}
.tap-gallery-item:hover img{transform:scale(1.08)}
.tap-pandit-strip{display:flex; gap:16px; overflow-x:auto; padding:4px 16px 8px; scrollbar-width:none}
.tap-pandit-strip::-webkit-scrollbar{display:none}
.tap-pandit-mini{flex-shrink:0; width:140px; text-align:center; cursor:pointer}
.tap-pandit-mini-avatar{width:80px; height:80px; border-radius:50%; border:3px solid var(--tap-marigold); margin:0 auto 8px; background:var(--grad-gold); display:flex; align-items:center; justify-content:center; font-size:calc(2 * var(--tap-fs)); transition:transform var(--dur-std) var(--ease-spring)}
.tap-pandit-mini-name{font-size:calc(0.8125 * var(--tap-fs)); font-weight:700; color:var(--tap-ink)}
.tap-pandit-mini-spec{font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted)}
.tap-pandit-mini-rating{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-marigold-deep); font-weight:700; margin-top:2px}
.tap-testimonials{display:flex; gap:14px; overflow-x:auto; padding:4px 16px 8px; scrollbar-width:none}
.tap-testimonials::-webkit-scrollbar{display:none}
.tap-testi-card{flex-shrink:0; width:280px; background:#fff; border-radius:var(--tap-radius); padding:16px; box-shadow:var(--tap-shadow)}
.tap-testi-head{display:flex; align-items:center; gap:10px; margin-bottom:10px}
.tap-testi-avatar{width:40px; height:40px; border-radius:50%; background:var(--grad-dawn); display:flex; align-items:center; justify-content:center; font-size:calc(1 * var(--tap-fs)); font-weight:700; color:#fff; flex-shrink:0}
.tap-testi-name{font-weight:700; font-size:calc(0.875 * var(--tap-fs))}
.tap-testi-loc{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted)}
.tap-testi-bubble{background:#e7f4e7; border-radius:0 12px 12px 12px; padding:10px 12px; font-size:calc(0.875 * var(--tap-fs)); line-height:1.6; color:var(--tap-ink)}
.tap-family-grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:12px; margin-bottom:18px}
.tap-family-card{background:#fff; border:1.5px solid var(--tap-line); border-radius:var(--tap-radius); padding:14px 16px; position:relative; transition:border-color var(--dur-fast),box-shadow var(--dur-fast)}
.tap-family-card:hover{border-color:var(--tap-purple); box-shadow:var(--tap-glow)}
.tap-family-card.primary{border-color:var(--tap-marigold)}
.tap-family-icon{font-size:calc(1.75 * var(--tap-fs)); margin-bottom:8px}
.tap-family-name{font-weight:700; font-size:calc(0.9375 * var(--tap-fs)); color:var(--tap-ink); margin-bottom:2px}
.tap-family-rel{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-purple); font-weight:700}
.tap-family-meta{font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted); margin-top:3px}
.tap-family-card .tap-rm{position:absolute; top:8px; right:10px; background:none; border:none; font-size:calc(1 * var(--tap-fs)); color:#ddd; cursor:pointer; transition:color var(--dur-fast)}
.tap-family-card .tap-rm:hover{color:var(--tap-err)}
.tap-family-form{background:var(--tap-purple-pale); border-radius:var(--tap-radius); padding:16px; max-width:480px}
.tap-plans-grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:16px}
.tap-plan-card{border:2px solid var(--tap-line); border-radius:var(--tap-radius); overflow:hidden; background:#fff; transition:transform var(--dur-std),box-shadow var(--dur-std)}
.tap-plan-card:hover{transform:translateY(-4px); box-shadow:var(--tap-shadow-xl)}
.tap-plan-card.current{border-color:var(--tap-purple); box-shadow:0 0 0 3px rgba(97,9,190,.15)}
.tap-plan-name-bar{font-weight:800; font-size:calc(1 * var(--tap-fs)); color:#fff; padding:14px 18px}
.tap-plan-price{font-size:calc(1.75 * var(--tap-fs)); font-weight:900; padding:12px 18px 4px; color:var(--tap-ink); font-family:"Fraunces",serif}
.tap-plan-period{font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted); padding:0 18px 12px}
.tap-plan-benefits{list-style:none; padding:0 18px 14px; font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted)}
.tap-plan-benefits li{padding:4px 0; border-top:1px solid var(--tap-line); display:flex; align-items:center; gap:7px}
.tap-plan-benefits li:first-child{border-top:none}
.tap-plan-benefits li::before{content:"✓"; color:var(--tap-ok); font-weight:800}
.tap-plan-card .tap-btn{margin:0 18px 18px; width:calc(100% - 36px); box-sizing:border-box; min-height:44px; height:auto; white-space:normal; line-height:1.25; padding:11px 14px}
.tap-plan-current-tag{text-align:center; padding:10px; color:var(--tap-purple); font-weight:700; font-size:calc(0.875 * var(--tap-fs))}
/* v6.9.14: the plan cards must be equal-height so the Subscribe button sits at the
   same baseline and never looks cut. Benefits push down; the CTA stays put. */
.tap-plan-card{display:flex; flex-direction:column}
.tap-plan-benefits{flex:1 1 auto}
/* v6.9.14 (#5): the family "Add another member" and "Save" buttons were touching. */
.tap-family-form .tap-addmember{display:block; width:100%; margin:6px 0 14px}
.tap-family-form > .tap-btn-primary{margin-top:6px}
.tap-spinner-om{font-size:calc(2 * var(--tap-fs)); animation:tapOmSpin 1.5s ease-in-out infinite; display:flex; align-items:center; justify-content:center; padding:32px}
@keyframes tapOmSpin{0%{transform:rotate(0) scale(1);opacity:1}50%{transform:rotate(180deg) scale(.8);opacity:.6}100%{transform:rotate(360deg) scale(1);opacity:1}}
.tap-loading{display:flex; flex-direction:column; align-items:center; gap:12px; padding:40px 20px; color:var(--tap-muted)}
@keyframes tapShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
.tap-skel-text.w40{width:40%}
@keyframes tapDiyaFlicker{from{transform:scale(1) rotate(-2deg)}to{transform:scale(1.15) rotate(2deg) translateY(-4px)}}
.tap-toast.err{background:var(--tap-err)}
.tap-toast.ok{background:var(--tap-ok)}
@keyframes tapToastIn{from{transform:translateX(-50%) translateY(12px);opacity:0}to{transform:translateX(-50%) translateY(0);opacity:1}}
.tap-modal-wrap{position:fixed; inset:0; z-index:9000; background:rgba(13,8,32,.65); backdrop-filter:blur(6px); display:flex; align-items:flex-end; justify-content:center; padding:16px; animation:tapModalBg var(--dur-std)}
@media(min-width:600px){.tap-modal-wrap{align-items:center}}
@keyframes tapModalBg{from{opacity:0}to{opacity:1}}
@media(min-width:600px){.tap-modal{border-radius:var(--tap-radius-xl)}}
@keyframes tapModalSlide{from{transform:translateY(60px);opacity:0}to{transform:translateY(0);opacity:1}}
.tap-modal-inner{padding:28px 24px}
.tap-modal-inner h3{font-size:calc(1.375 * var(--tap-fs)); margin-bottom:6px}
.tap-modal-inner p{color:var(--tap-muted); font-size:calc(0.875 * var(--tap-fs)); margin-bottom:18px}
.tap-x{position:absolute; top:14px; right:16px; background:var(--tap-line); border:none; border-radius:50%; width:32px; height:32px; font-size:calc(1.125 * var(--tap-fs)); cursor:pointer; display:flex; align-items:center; justify-content:center; color:var(--tap-muted); transition:background var(--dur-fast)}
.tap-x:hover{background:var(--tap-err); color:#fff}
.tap-auth-tabs{display:flex; gap:8px; margin-bottom:20px}
.tap-auth-tab{flex:1; padding:10px; border:2px solid var(--tap-line); background:#fff; border-radius:var(--tap-radius-sm); font:inherit; font-weight:700; color:var(--tap-muted); cursor:pointer; transition:all var(--dur-fast); font-size:calc(0.875 * var(--tap-fs))}
.tap-auth-tab.active{background:var(--tap-purple); color:#fff; border-color:var(--tap-purple)}
.tap-auth-hint{color:var(--tap-muted); font-size:calc(0.875 * var(--tap-fs)); margin-bottom:14px}
.tap-input{width:100%; padding:12px 16px; border-radius:var(--tap-radius-sm); border:1.5px solid var(--tap-line); font:inherit; font-size:calc(0.9375 * var(--tap-fs)); color:var(--tap-ink); background:#fff; outline:none; transition:border-color var(--dur-fast),box-shadow var(--dur-fast); margin-bottom:12px; display:block}
.tap-input::placeholder{color:var(--tap-muted)}
.tap-label{font-size:calc(0.8125 * var(--tap-fs)); font-weight:700; color:var(--tap-muted); display:block; margin-bottom:4px}
.tap-field-label{font-size:calc(0.8125 * var(--tap-fs)); font-weight:600; color:var(--tap-muted); margin:8px 0 4px}
.tap-otp-boxes{display:flex; gap:10px; justify-content:center; margin-bottom:16px}
.tap-otp-boxes input{width:48px; height:56px; text-align:center; font-size:calc(1.375 * var(--tap-fs)); font-weight:800; border:2px solid var(--tap-line); border-radius:var(--tap-radius-sm); outline:none; transition:border-color var(--dur-fast); background:#fff; color:var(--tap-ink)}
.tap-otp-boxes input:focus{border-color:var(--tap-purple); box-shadow:0 0 0 3px rgba(97,9,190,.10)}
.tap-uid-badge{background:var(--grad-sacred); color:#fff; border-radius:var(--tap-r-lg); padding:12px 16px; text-align:center}
.tap-uid-label{font-size:calc(0.625 * var(--tap-fs)); text-transform:uppercase; letter-spacing:.1em; opacity:.8; margin-bottom:4px}
.tap-uid-value{font-size:calc(1.375 * var(--tap-fs)); font-weight:900; letter-spacing:.06em; font-family:monospace}
.tap-uid-segment{font-size:calc(0.6875 * var(--tap-fs)); background:rgba(255,255,255,.2); border-radius:var(--tap-r-3xl); padding:3px 10px; display:inline-block; margin-top:4px}
.tap-profile{display:flex; gap:14px; align-items:center; flex-wrap:wrap; margin-bottom:20px; padding:18px; background:#fff; border-radius:var(--tap-radius); box-shadow:var(--tap-shadow)}
.tap-avatar{width:52px; height:52px; border-radius:50%; background:var(--grad-dawn); color:#fff; display:flex; align-items:center; justify-content:center; font-size:calc(1.375 * var(--tap-fs)); font-weight:800; flex-shrink:0; font-family:"Fraunces",serif; border:3px solid var(--tap-marigold)}
.tap-pname{font-size:calc(1.125 * var(--tap-fs)); font-weight:800; color:var(--tap-ink)}
.tap-pmeta{font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted); margin-top:2px}
.tap-logout{font-size:calc(0.8125 * var(--tap-fs)); padding:8px 14px; margin-left:auto}
.tap-tabs::-webkit-scrollbar{display:none}
.tap-tab:hover{color:var(--tap-purple)}
.tap-ticket-new{background:var(--tap-purple-pale); border-radius:var(--tap-radius); padding:18px; margin-bottom:20px}
.tap-ticket-new h3{margin:0 0 12px; color:var(--tap-chocolate)}
.tap-ticket-card{background:#fff; border:1.5px solid var(--tap-line); border-radius:var(--tap-radius); padding:14px 16px; cursor:pointer; margin-bottom:10px; transition:box-shadow var(--dur-fast),border-color var(--dur-fast)}
.tap-ticket-card:hover{box-shadow:var(--tap-shadow); border-color:var(--tap-purple)}
.tap-ticket-top{display:flex; justify-content:space-between; align-items:center; margin-bottom:4px}
.tap-ticket-code{font-family:monospace; font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-purple); font-weight:700}
.tap-ticket-status{font-size:calc(0.6875 * var(--tap-fs)); text-transform:capitalize; font-weight:800; padding:3px 11px; border-radius:var(--tap-r-full); letter-spacing:.02em; white-space:nowrap}
.tap-ticket-sub{font-weight:700; font-size:calc(0.9375 * var(--tap-fs)); color:var(--tap-ink)}
.tap-ticket-meta{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted); margin-top:4px; text-transform:capitalize}
.tap-ticket-thread{padding-top:8px}
.tap-ticket-msg{background:#f7f2fd; border-radius:var(--tap-r-sm); padding:10px 14px; margin-bottom:8px}
.tap-ticket-msg.admin{background:var(--tap-purple-pale)}
.tap-msg-sender{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted); margin-bottom:4px; font-weight:700}
.tap-msg-body{font-size:calc(0.875 * var(--tap-fs)); white-space:pre-wrap; line-height:1.6}
.tap-celebrate{position:fixed; inset:0; z-index:10000; pointer-events:none; display:flex; flex-direction:column; align-items:center; justify-content:center}
/* v6.9.13: bloom THEN fade out (was holding opacity:1 until JS removed it at 2.5s,
   so the 🙏 sat opaque over the confirmation text — the reported overlap). */
.tap-celebrate-mandala{font-size:calc(5 * var(--tap-fs)); animation:tapMandalaBloom 2.2s var(--ease-spring) forwards}
@keyframes tapMandalaBloom{0%{transform:scale(0) rotate(-45deg);opacity:0}25%{transform:scale(1.2) rotate(10deg);opacity:1}45%{transform:scale(1) rotate(0);opacity:1}75%{opacity:1}100%{transform:scale(1) rotate(0);opacity:0}}
.tap-confetti-particle{position:fixed; width:8px; height:8px; border-radius:2px; animation:tapConfettiFall 2s ease-out forwards; pointer-events:none}
@keyframes tapConfettiFall{0%{transform:translateY(-20px) rotate(0);opacity:1}100%{transform:translateY(100vh) rotate(720deg);opacity:0}}
.tap-lotus-bloom{font-size:calc(3 * var(--tap-fs)); animation:tapLotusBloom 0.8s var(--ease-spring); display:inline-block}
@keyframes tapLotusBloom{0%{transform:scale(.2);opacity:0}100%{transform:scale(1);opacity:1}}
.tap-reveal.visible{opacity:1; transform:translateY(0)}
.tap-view-enter{animation:tapViewIn var(--dur-std) var(--ease-out)}
@keyframes tapViewIn{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}
@keyframes tapTickPop{0%{transform:scale(0)}80%{transform:scale(1.15)}100%{transform:scale(1)}}
.tap-err-inline{background:#fff0f0; border:1px solid #f5c6cb; border-radius:var(--tap-radius-sm); padding:10px 14px; font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-err); margin-bottom:10px}
.tap-notice-ok{color:var(--tap-ok); font-size:calc(0.875 * var(--tap-fs)); padding:8px 0; font-weight:700}
.tap-empty{text-align:center; padding:40px 20px; color:var(--tap-muted); font-size:calc(0.9375 * var(--tap-fs)); line-height:1.8}
.tap-home-section:nth-child(even){background:#fff}
.tap-occasion-bar{background:linear-gradient(90deg,var(--tap-chocolate) 0%,var(--tap-terracotta) 100%); padding:16px; text-align:center; color:#fff}
.tap-occasion-bar h3{font-size:calc(1.125 * var(--tap-fs)); margin-bottom:4px}
.tap-occasion-bar p{font-size:calc(0.875 * var(--tap-fs)); opacity:.85; margin-bottom:12px}
.tap-divider {
  display: flex; align-items: center; justify-content: center;
  height: 24px; margin: 28px 0; background: transparent; position: relative; border: none;
}
.tap-divider::before {
  content: ""; position: absolute; left: 0; right: 0; top: 50%; height: 1px;
  background: linear-gradient(90deg, transparent 0%, var(--tap-marigold, #f99000) 25%, var(--tap-purple, #6109be) 50%, var(--tap-marigold, #f99000) 75%, transparent 100%);
}
.tap-divider::after {
  content: ""; position: relative; z-index: 1; width: 32px; height: 24px;
  background-color: var(--tap-bg, #faf7fd);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23f99000'%3E%3Cpath d='M12 2C12 2 10 7 6 9C2 11 2 15 6 15C10 15 12 22 12 22C12 22 14 15 18 15C22 15 22 11 18 9C14 7 12 2 12 2Z'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: center; background-size: 20px 20px;
  padding: 0 8px;
}
.tap-badge-alt{background:var(--tap-purple-pale); color:var(--tap-purple); font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; padding:3px 10px; border-radius:var(--tap-r-full)}
.tap-devhint{background:#fffbe6; border:1px solid #f5c842; border-radius:var(--tap-r-xs); padding:8px 12px; font-size:calc(0.8125 * var(--tap-fs)); margin-bottom:12px; color:#6b5b00}
.tap-resend{background:none; border:none; color:var(--tap-purple); font:inherit; font-size:calc(0.875 * var(--tap-fs)); cursor:pointer; font-weight:700; text-decoration:underline}
.tap-optin{display:flex; align-items:center; gap:10px; padding:12px 0; font-size:calc(0.875 * var(--tap-fs)); cursor:pointer}
.tap-blist{display:flex; flex-direction:column; gap:12px}
.tap-bcard{background:#fff; border-radius:var(--tap-radius); border:1.5px solid var(--tap-line); padding:16px; transition:box-shadow var(--dur-fast)}
.tap-bcard:hover{box-shadow:var(--tap-shadow)}
.tap-bcard-title{font-weight:700; font-size:calc(0.9375 * var(--tap-fs)); margin-bottom:2px}
.tap-bcard-meta{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted)}
.tap-bcard-amount{font-size:calc(1 * var(--tap-fs)); font-weight:800; color:var(--tap-purple); font-family:"Fraunces",serif}
.tap-bactions{display:flex; gap:8px; margin-top:10px; flex-wrap:wrap}
@media(min-width:768px){.tap-wa-fab{bottom:20px}}
.tap-ref-card{background:linear-gradient(135deg,var(--tap-purple-pale),#fff); border:1px solid var(--tap-line); border-radius:var(--tap-radius-xl); padding:22px}
.tap-ref-title{font-weight:800; font-size:calc(1.125 * var(--tap-fs)); color:var(--tap-chocolate); margin-bottom:6px}
.tap-ref-desc{font-size:calc(0.875 * var(--tap-fs)); color:var(--tap-muted); margin-bottom:14px}
.tap-ref-code-row{display:flex; gap:8px; align-items:center; margin-bottom:16px; flex-wrap:wrap}
.tap-ref-code{font-family:monospace; font-size:calc(1.5 * var(--tap-fs)); font-weight:900; color:var(--tap-purple); background:var(--tap-purple-pale); border-radius:var(--tap-radius-sm); padding:10px 18px; flex:1; text-align:center; letter-spacing:.1em}
.tap-ref-stats{display:flex; gap:20px}
.tap-ref-stat{text-align:center; font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted)}
.tap-ref-num{font-size:calc(1.625 * var(--tap-fs)); font-weight:800; color:var(--tap-purple); font-family:"Fraunces",serif}
.tap-push-card{background:#f8f5ff; border-radius:var(--tap-radius); padding:14px 18px; margin-top:16px; display:flex; gap:12px; align-items:center; flex-wrap:wrap}
.tap-push-card p{margin:0; flex:1; font-size:calc(0.875 * var(--tap-fs))}
.tap-suggestion .tap-btn{margin-top:10px; width:100%}
.tap-sec-lead{color:var(--tap-muted); font-size:calc(0.875 * var(--tap-fs)); margin-bottom:14px}
.tap-profile-form{max-width:480px}
/* ── v6.9.15: modern Profile tab — grouped cards + floating-label fields ── */
.tap-prof{max-width:480px; margin:0 auto}
.tap-prof-intro{display:flex; align-items:center; gap:14px; margin:2px 0 20px}
.tap-prof-av{width:56px; height:56px; flex-shrink:0; border-radius:var(--tap-r-2xl); background:var(--grad-sacred); color:#fff; display:grid; place-items:center; font-size:calc(1.5 * var(--tap-fs)); font-weight:800; font-family:'Fraunces',Georgia,serif; box-shadow:0 6px 18px rgba(97,9,190,.28)}
.tap-prof-intro-h{font-size:calc(1.1875 * var(--tap-fs)); font-weight:800; color:var(--tap-ink); font-family:'Fraunces',Georgia,serif; line-height:1.2}
.tap-prof-intro-s{font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted); margin-top:2px}
/* v7.6.4: the .tap-prof-card box moved to the shared CONTENT primitive in
   tap-premium.css so the profile groups, booking cards and listing cards
   agree on one radius, border and shadow. Only its inner parts live here. */
.tap-prof-card-hd{display:flex; align-items:center; gap:11px; margin:0 0 16px}
.tap-prof-card-ic{width:36px; height:36px; flex-shrink:0; border-radius:11px; background:var(--tap-purple-pale); display:grid; place-items:center; font-size:calc(1.125 * var(--tap-fs))}
.tap-prof-card-tt{font-size:calc(0.9375 * var(--tap-fs)); font-weight:800; color:var(--tap-ink); line-height:1.2}
.tap-prof-card-sub{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted); margin-top:2px}
/* Floating-label field: input carries placeholder=" " so :placeholder-shown drives the label. */
.tap-fld{position:relative; margin-bottom:12px}
.tap-fld-in{width:100%; box-sizing:border-box; padding:22px 15px 8px; border:1.5px solid var(--tap-line); border-radius:var(--tap-r-lg); font:inherit; font-size:calc(0.9375 * var(--tap-fs)); color:var(--tap-ink); background:#fff; outline:none; transition:border-color .15s ease, box-shadow .15s ease}
.tap-fld-lb{position:absolute; left:15px; top:16px; font-size:calc(0.9375 * var(--tap-fs)); color:var(--tap-muted); pointer-events:none; transform-origin:left top; transition:transform .15s ease, color .15s ease}
.tap-fld-in:focus{border-color:var(--tap-purple); box-shadow:0 0 0 3px rgba(97,9,190,.10)}
.tap-fld-in:focus + .tap-fld-lb,
.tap-fld-in:not(:placeholder-shown) + .tap-fld-lb{transform:translateY(-11px) scale(.72); font-weight:700; letter-spacing:.02em; color:var(--tap-purple)}
.tap-prof-save{margin-top:4px}
.tap-prof-logout{display:flex; align-items:center; justify-content:center; gap:8px; width:100%; margin-top:12px; padding:13px; border-radius:var(--tap-r-lg); border:1.5px solid #f3d6d2; background:#fff; color:var(--tap-err); font:inherit; font-weight:700; font-size:calc(0.875 * var(--tap-fs)); cursor:pointer; transition:background .15s ease, border-color .15s ease}
.tap-prof-logout:hover{background:#fdf1f0; border-color:#e9b8b1}
.tap-sum-row{display:flex; justify-content:space-between; padding:6px 0; font-size:calc(0.875 * var(--tap-fs)); border-bottom:1px solid var(--tap-line)}
.tap-sum-row:last-child{border-bottom:none; font-weight:800; font-size:calc(1 * var(--tap-fs)); color:var(--tap-purple)}
.tap-member-row{display:flex; gap:8px; margin-bottom:8px}
.tap-addmember{background:none; border:1.5px dashed var(--tap-line); border-radius:var(--tap-radius-sm); padding:8px; width:100%; color:var(--tap-purple); font:inherit; font-weight:700; cursor:pointer; transition:all var(--dur-fast)}
.tap-addmember:hover{border-color:var(--tap-purple); background:var(--tap-purple-pale)}
.tap-rm{background:#f7f2fd; border:none; border-radius:50%; width:30px; height:30px; font-size:calc(1 * var(--tap-fs)); cursor:pointer; display:flex; align-items:center; justify-content:center; color:var(--tap-muted); flex-shrink:0; transition:all var(--dur-fast)}
.tap-rm:hover{background:var(--tap-err); color:#fff}
.tap-hero .tap-hero-img{aspect-ratio:4/3; border-radius:var(--tap-radius); background:linear-gradient(135deg,#efe3ff,#ffe8cc); background-size:cover; background-position:center; box-shadow:var(--tap-shadow)}
.tap-hero .tap-sub{color:var(--tap-muted); margin:0 0 10px}
.tap-opt.is-sel{border-color:var(--tap-purple); background:#faf5ff; box-shadow:0 0 0 3px rgba(97,9,190,.08)}
.tap-addon{display:flex; gap:12px; align-items:flex-start; border:1.5px solid var(--tap-line); border-radius:var(--tap-r-lg); padding:13px; cursor:pointer; background:#fff}
.tap-addon.is-on{border-color:var(--tap-marigold); background:#fffaf1}
.tap-addon .tap-addon-name .tap-tag{font-size:calc(0.625 * var(--tap-fs)); font-weight:800; color:#3a2400; background:var(--tap-marigold); padding:2px 7px; border-radius:var(--tap-r-full); margin-left:6px; vertical-align:middle}
.tap-summary{background:#fff; border:1px solid var(--tap-line); border-radius:var(--tap-radius); padding:16px; box-shadow:var(--tap-shadow)}
.tap-addon-name{font-weight:700; font-size:calc(0.875 * var(--tap-fs))}
.tap-addon-price{font-size:calc(0.875 * var(--tap-fs)); font-weight:700; color:var(--tap-purple); white-space:nowrap}
@media(max-width:600px){.tap-detail-layout{grid-template-columns:1fr}
.tap-grid{grid-template-columns:1fr 1fr}
.tap-plans-grid{grid-template-columns:1fr}
.tap-ref-code-row{flex-direction:column}
.tap-hero{grid-template-columns:1fr}}
@media(max-width:400px){.tap-grid{grid-template-columns:1fr}
.tap-otp-boxes input{width:40px; height:48px; font-size:calc(1.125 * var(--tap-fs))}
.tap-otp-boxes{gap:6px}
.tap-step-circle{width:30px; height:30px; font-size:calc(0.6875 * var(--tap-fs))}}
.tap-grid .tap-reveal:nth-child(1){transition-delay:.05s}
.tap-grid .tap-reveal:nth-child(2){transition-delay:.10s}
.tap-grid .tap-reveal:nth-child(3){transition-delay:.15s}
.tap-grid .tap-reveal:nth-child(4){transition-delay:.20s}
.tap-grid .tap-reveal:nth-child(5){transition-delay:.25s}
.tap-grid .tap-reveal:nth-child(6){transition-delay:.30s}
.tap-hscroll .tap-reveal:nth-child(1){transition-delay:.06s}
.tap-hscroll .tap-reveal:nth-child(2){transition-delay:.12s}
.tap-hscroll .tap-reveal:nth-child(3){transition-delay:.18s}
.tap-btn::before{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background:rgba(255,255,255,0);
  transition:background var(--dur-fast);}
.tap-btn:active::before{background:rgba(255,255,255,.15)}
.tap-pandit-mini:hover .tap-pandit-mini-avatar{transform:scale(1.08); box-shadow:0 0 0 4px rgba(249,144,0,.4)}
.tap-deity-item{display:flex; flex-direction:column; align-items:center; gap:8px; cursor:pointer; flex-shrink:0; width:72px; -webkit-tap-highlight-color:transparent; transition:transform var(--dur-std) var(--ease-spring)}
.tap-deity-item:active{transform:scale(.92)}
.tap-home-section{padding:48px 0; animation:tapSectionIn .6s var(--ease-out) both}
@keyframes tapSectionIn{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}
.tap-input:focus{border-color:var(--tap-purple); box-shadow:0 0 0 3px rgba(97,9,190,.10); animation:tapFocusPop .2s var(--ease-spring)}
@keyframes tapFocusPop{0%{transform:scale(1)}40%{transform:scale(1.01)}100%{transform:scale(1)}}
.tap-otp-boxes input:not(:placeholder-shown){border-color:var(--tap-purple);
  background:var(--tap-purple-pale);
  animation:tapOtpFill .15s var(--ease-spring);}
@keyframes tapOtpFill{0%{transform:scale(.9)}70%{transform:scale(1.05)}100%{transform:scale(1)}}
.tap-cal-day{aspect-ratio:1; display:flex; align-items:center; justify-content:center; font-size:calc(0.8125 * var(--tap-fs)); font-weight:600; border-radius:50%; cursor:pointer; transition:all var(--dur-fast); margin:2px; position:relative}
.tap-cal-day::before{content:'';position:absolute;inset:0;border-radius:50%;
  background:var(--tap-purple-pale);transform:scale(0);
  transition:transform var(--dur-fast) var(--ease-spring);}
.tap-cal-day:hover::before{transform:scale(1)}
.tap-cal-day span{position:relative;z-index:1}
.tap-modal{background:#fff; border-radius:var(--tap-radius-xl) var(--tap-radius-xl) 0 0; width:100%; max-width:480px; max-height:90vh; overflow-y:auto; overscroll-behavior:contain; position:relative; animation:tapSheetUp var(--dur-slow) var(--ease-spring)}
@keyframes tapSheetUp{
  from{transform:translateY(100%);opacity:0}
  to{transform:translateY(0);opacity:1}
}
.tap-timeline-item.tap-reveal{transition:opacity .5s var(--ease-out),transform .5s var(--ease-out);
  transform:translateX(-16px);}
.tap-timeline-item.tap-reveal.visible{transform:translateX(0)}
.tap-trust-card:hover{border-color:var(--tap-purple);
  box-shadow:var(--tap-glow);
  transition:all var(--dur-std);}
.tap-mem-card-v2::before{content:'';position:absolute;top:0;left:-100%;width:60%;height:100%;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.15),transparent);
  transform:skewX(-20deg);
  animation:tapShine 3s ease-in-out infinite;}
@keyframes tapShine{0%,100%{left:-100%}50%{left:150%}}
@keyframes tapLivePulse{
  0%{box-shadow:0 0 0 0 rgba(224,59,59,.4)}
  70%{box-shadow:0 0 0 8px rgba(224,59,59,0)}
  100%{box-shadow:0 0 0 0 rgba(224,59,59,0)}
}
.tap-wa-fab{position:fixed; z-index:900; border-radius:50%; background:#25d366; color:#fff; display:flex; align-items:center; justify-content:center; text-decoration:none; width:50px; height:50px; font-size:calc(1.375 * var(--tap-fs)); bottom:calc(var(--nav-h) + 12px); right:16px; transition:transform var(--dur-std) var(--ease-spring),box-shadow var(--dur-std); box-shadow:0 4px 16px rgba(37,211,102,.35)}
.tap-wa-fab:hover{transform:scale(1.12) rotate(-5deg); box-shadow:0 8px 28px rgba(37,211,102,.50)}
.tap-wa-fab::after{content:'Support';
  position:absolute;
  right:calc(100% + 8px);
  top:50%;transform:translateY(-50%);
  background:var(--tap-ink, #1e0a2e);color:#fff;
  font-size:calc(0.6875 * var(--tap-fs));font-weight:700;white-space:nowrap;
  padding:4px 10px;border-radius:var(--tap-r-full);
  opacity:0;transition:opacity var(--dur-fast);
  pointer-events:none;}
.tap-wa-fab:hover::after{opacity:1}
@media(min-width:768px){.tap-wa-fab{bottom:16px;right:20px}}
.tap-bottom-nav{position:fixed; bottom:0; left:0; right:0; z-index:900; height:var(--nav-h); backdrop-filter:blur(20px); border-top:1px solid var(--tap-line); display:flex; align-items:center; justify-content:space-around; box-shadow:0 -4px 20px rgba(97,9,190,.08); padding:0 4px; background:rgba(255,255,255,.95)}
.tap-bnav-item{display:flex; flex-direction:column; align-items:center; gap:3px; flex:1; background:none; border:none; color:var(--tap-muted); font:inherit; font-size:calc(0.625 * var(--tap-fs)); font-weight:600; cursor:pointer; text-decoration:none; -webkit-tap-highlight-color:transparent; border-radius:var(--tap-r-lg); margin:4px 2px; padding:6px 8px; transition:background var(--dur-fast),color var(--dur-fast)}
.tap-bnav-item.active{background:var(--tap-purple-pale); color:var(--tap-purple)}
.tap-bnav-item:hover:not(.active){background:#f8f5ff;}
.tap-bnav-icon{line-height:1; font-size:calc(1.25 * var(--tap-fs)); transition:transform var(--dur-std) var(--ease-spring)}
.tap-bnav-item.active .tap-bnav-icon{transform:translateY(-2px) scale(1.1)}
.tap-slot:hover:not(.is-full){border-color:var(--tap-purple);
  background:var(--tap-purple-pale);
  transform:translateY(-2px);
  box-shadow:0 4px 12px rgba(97,9,190,.15);}
.tap-slot.is-full{opacity:.45;cursor:not-allowed}
.tap-level-bar .tap-level-fill{animation:tapBarFill 1.2s var(--ease-out) both .3s;}
@keyframes tapBarFill{from{width:0!important}to{}}
.tap-filter-bar, .tap-tabs, .tap-ptabs, .tap-hscroll{-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 16px,#000 calc(100% - 16px),transparent 100%);
  mask-image:linear-gradient(90deg,transparent 0,#000 16px,#000 calc(100% - 16px),transparent 100%);}
.tap-tick{width:64px; height:64px; background:var(--tap-ok); color:#fff; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:calc(1.75 * var(--tap-fs)); margin:0 auto 16px; animation:tapTickPop var(--dur-slow) var(--ease-spring); position:relative}
.tap-tick::after{content:'';
  position:absolute;
  inset:0;border-radius:50%;
  background:rgba(26,125,60,.2);
  animation:tapTickRing .6s var(--ease-spring) .3s both;
  transform:scale(0);}
@keyframes tapTickRing{to{transform:scale(2);opacity:0}}
.tap-dtab, .tap-tab, .tap-ptab{position:relative;
  overflow:hidden;}
.tap-dtab.active::after, .tap-tab.active::after, .tap-ptab.active::after{content:'';position:absolute;bottom:0;left:0;right:0;height:3px;
  background:var(--tap-purple);
  animation:tapTabSlide .2s var(--ease-spring);}
@keyframes tapTabSlide{from{transform:scaleX(0)}to{transform:scaleX(1)}}
.tap-thumb, .tap-thumb img{transition:transform var(--dur-slow) var(--ease-out);}
/* v7.6.0: removed .tap-spiritual-header::after — a 60px Om emoji painted
   through CSS `content:`. Dead code (the class is referenced by no template,
   shortcode or JS), and the last emoji able to reach a devotee without any
   source file mentioning it: the gate reads .js and .php, so a glyph living in
   a stylesheet was invisible to it. The gate scans .css now too. */
.tap-booking-root, .tap-dashboard-root{min-height:400px; overflow:visible!important;}
.tap-catalogue-skeleton{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;padding:4px}
.tap-skel-card-wrap{background:#fff;border-radius:var(--tap-radius);overflow:hidden;box-shadow:var(--tap-shadow)}
.tap-skel-img{height:140px;background:linear-gradient(90deg,#f0e8fd 25%,#e8d8fc 50%,#f0e8fd 75%);background-size:200% 100%;animation:tapShimmer 1.5s ease-in-out infinite}
.tap-skel-body{padding:14px}
.tap-skel-line{height:14px;border-radius:var(--tap-r-2xs);margin-bottom:8px;background:linear-gradient(90deg,#f0e8fd 25%,#e8d8fc 50%,#f0e8fd 75%);background-size:200% 100%;animation:tapShimmer 1.5s ease-in-out infinite}
.tap-skel-line.s{width:60%}
.tap-skel-line.xs{width:40%}
.tap-sticky .tap-btn-gold{flex-shrink:0; font-size:calc(1 * var(--tap-fs)); padding:14px 24px;
  box-shadow:0 4px 18px rgba(249,144,0,.4);}
.tap-login-required-note{background:var(--tap-warn-bg, #fff4e7); border:1px solid var(--tap-marigold, #f99000);
  border-radius:var(--tap-r-sm); padding:10px 16px;
  font-size:calc(0.875 * var(--tap-fs)); font-weight:600; color:var(--tap-warn-fg, #854f0b);
  text-align:center; margin-bottom:10px;
  animation:tapViewIn .25s var(--ease-spring);}
.tap-test-mode-badge{background:#f5c842; color:var(--tap-gold-dark, #3a2400);
  font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; padding:3px 10px;
  border-radius:var(--tap-r-full); letter-spacing:.05em;
  display:inline-flex; align-items:center; gap:5px;}
.tap-verified-badge::before{content:'✓ '}
.tap-unverified-badge{display:inline-flex;align-items:center;gap:5px;
  background:#f5f5f5;color:#52566b;
  font-size:calc(0.6875 * var(--tap-fs));font-weight:700;padding:3px 10px;border-radius:var(--tap-r-full);
  border:1px solid #ddd;}
.tap-diya-loader{font-size:calc(2.25 * var(--tap-fs)); animation:tapDiyaFlicker 0.8s ease-in-out infinite alternate; display:none}
.tap-loading-spinner{width:32px;height:32px;border:3px solid var(--tap-line);
  border-top-color:var(--tap-purple);border-radius:50%;
  animation:tapSpinSimple .8s linear infinite;}
@keyframes tapSpinSimple{to{transform:rotate(360deg)}}
.tap-verified-admin{display:inline-flex;align-items:center;gap:4px;background:var(--tap-ok-pale, #e8f8ee);color:var(--tap-ok, #1a7d3c);padding:2px 8px;border-radius:var(--tap-r-full);font-size:calc(0.75 * var(--tap-fs));font-weight:800;border:1px solid #b8e6c8}
.tap-unverified-admin{display:inline-flex;align-items:center;gap:4px;background:#f5f5f5;color:#52566b;padding:2px 8px;border-radius:var(--tap-r-full);font-size:calc(0.75 * var(--tap-fs));font-weight:700;border:1px solid #ddd}
.tap-opt{border:1.5px solid var(--tap-line); border-radius:var(--tap-r-lg); cursor:pointer; background: var(--tap-card, #fff); transition:border-color .15s,background .15s; display:flex; flex-direction:column; align-items:center; gap:8px; padding:14px 10px}
.tap-opt-body{text-align:center;}
.tap-opt-name{font-weight:700; font-size:calc(0.875 * var(--tap-fs));}
.tap-opt-who{font-size:calc(0.6875 * var(--tap-fs)); color:#888; margin-top:2px;}
.tap-opt-price{font-size:calc(1 * var(--tap-fs)); font-weight:800; color:var(--tap-purple, #6109be); margin-top:4px;}
.tap-opt.is-sel .tap-opt-price{color:var(--tap-marigold, #f99000);}
@media (max-width: 500px){.tap-member-grid{grid-template-columns: 1fr 1fr; gap:6px;}
.tap-member-grid .tap-inp:nth-child(3), .tap-member-grid .tap-inp:nth-child(4){grid-column: span 1;}
.tap-member-rm{grid-column: span 2; width:100%;}}
.tap-progress-bar{display:flex; align-items:center; justify-content:center;
  padding:16px 20px 12px; gap:0;
  background:#fff; border-bottom:1px solid var(--tap-line);
  position:sticky; top: var(--tap-topstrip-h, 52px); z-index:200;}
.tap-progress-step{display:flex; flex-direction:column; align-items:center; gap:4px;
  min-width:64px;}
.tap-ps-num{width:28px; height:28px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  font-size:calc(0.75 * var(--tap-fs)); font-weight:800;
  background:var(--tap-line); color:var(--tap-muted);
  transition:all var(--dur-std) var(--ease-spring);}
.tap-ps-lbl{font-size:calc(0.625 * var(--tap-fs)); font-weight:700; color:var(--tap-muted); letter-spacing:.04em; text-transform:uppercase; transition:color var(--dur-std);}
.tap-progress-step.active .tap-ps-num{background:var(--tap-purple); color:#fff; box-shadow:0 0 0 3px var(--tap-purple-pale);}
.tap-progress-step.active .tap-ps-lbl{color:var(--tap-purple);}
.tap-progress-step.done .tap-ps-num{background:var(--tap-ok); color:#fff;}
.tap-progress-line{flex:1; height:2px; max-width:40px;
  background:var(--tap-line);
  transition:background var(--dur-slow);}
.tap-progress-step.done + .tap-progress-line{background:var(--tap-ok);}
.tap-tiers{display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
  gap:12px; margin-top:12px;}
.tap-tier-card{position:relative;
  border:2px solid var(--tap-line); border-radius:var(--tap-r-xl);
  padding:16px 14px 14px; cursor:pointer;
  transition:all var(--dur-std) var(--ease-spring);
  background: var(--tap-card, #fff); overflow:hidden;
  display:flex; flex-direction:column; gap:10px;}
.tap-tier-card::before{content:''; position:absolute; inset:0;
  border-radius:var(--tap-r-lg); opacity:0;
  background:var(--grad-sacred);
  transition:opacity var(--dur-std);
  z-index:0;}
.tap-tier-card:hover{border-color:var(--tap-purple); transform:translateY(-2px); box-shadow:var(--tap-shadow);}
.tap-tier-card.is-sel{border-color:var(--tap-purple);
  background:var(--tap-purple-pale);
  box-shadow:var(--tap-glow), var(--tap-shadow);
  transform:translateY(-1px);}
.tap-tier-card.is-popular{border-color:var(--tap-marigold);
  box-shadow:var(--tap-shadow-gold); padding-top:26px;}
.tap-tier-badge{position:absolute; top:-1px; left:50%; transform:translateX(-50%);
  background:var(--grad-gold); color:#3a2400;
  font-size:calc(0.625 * var(--tap-fs)); font-weight:800; padding:3px 10px;
  border-radius:0 0 8px 8px; white-space:nowrap;
  letter-spacing:.03em; max-width:calc(100% - 12px);}
.tap-tier-head{display:flex; align-items:center; gap:10px; position:relative; z-index:1;
  margin-top:8px;}
.tap-tier-icon{display:flex; align-items:center; justify-content:center; width:40px; height:32px; flex-shrink:0}
.tap-tier-icon svg{width:100%; height:100%}
.tap-tier-meta{flex:1;}
.tap-tier-name{font-size:calc(0.875 * var(--tap-fs)); font-weight:800; color:var(--tap-ink); line-height:1.3;}
.tap-tier-desc{font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted); margin-top:2px; line-height:1.4;}
.tap-tier-price-block{display:flex; align-items:baseline; flex-wrap:wrap; gap:4px; position:relative; z-index:1;}
.tap-tier-price{font-size:calc(1.125 * var(--tap-fs)); font-weight:900; color:var(--tap-purple); font-family:"Fraunces",serif;}
.tap-tier-card.is-sel .tap-tier-price{color:var(--tap-purple-deep);}
.tap-tier-orig{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted); text-decoration:line-through;}
.tap-tier-save{font-size:calc(0.625 * var(--tap-fs)); font-weight:800; color:var(--tap-ok);
  background:#e8f8ee; border-radius:var(--tap-r-full); padding:2px 6px;}
.tap-tier-check{position:absolute; top:10px; right:10px;
  width:20px; height:20px; border-radius:50%;
  background:var(--tap-purple); color:#fff;
  font-size:calc(0.6875 * var(--tap-fs)); font-weight:900;
  display:flex; align-items:center; justify-content:center;
  opacity:0; transform:scale(0);
  transition:all var(--dur-std) var(--ease-spring);
  z-index:2;}
.tap-tier-card.is-sel .tap-tier-check{opacity:1; transform:scale(1);}
.tap-live-price{text-align:center; font-size:calc(1.375 * var(--tap-fs)); font-weight:900;
  color:var(--tap-purple); font-family:"Fraunces",serif;
  padding:10px 0 4px; letter-spacing:-.02em;}
.tap-slots{display:flex; flex-direction:column; gap:10px; margin-top:12px;}
.tap-slot{font-size:calc(0.8125 * var(--tap-fs)); text-align:center; display:flex; flex-direction:column; align-items:center; min-width:100px; margin:0 0 10px; border:2px solid var(--tap-line); border-radius:var(--tap-r-lg); padding:14px 16px; cursor:pointer; transition:all var(--dur-std) var(--ease-out); background:#fff; position:relative; overflow:hidden}
.tap-slot::after{content:''; position:absolute; left:0; top:0; bottom:0;
  width:3px; background:var(--tap-purple); opacity:0;
  transition:opacity var(--dur-std);}
.tap-slot:hover:not(.is-disabled){border-color:var(--tap-purple); background:#fdf4ff}
.tap-slot:hover:not(.is-disabled)::after{opacity:1;}
.tap-slot.is-sel{color:#fff; transform:translateY(-2px) scale(1.04); border-color:var(--tap-purple); background:var(--tap-purple-pale); box-shadow:var(--tap-glow)}
.tap-slot.is-sel::after{opacity:1;}
.tap-slot.is-full, .tap-slot.is-disabled{opacity:.55; cursor:not-allowed}
.tap-slot.is-upcoming{border-color:var(--tap-marigold); background:#fffaf0}
.tap-slot-date-row{display:flex; justify-content:space-between; align-items:center; margin-bottom:6px}
.tap-slot-date-row b{font-size:calc(1 * var(--tap-fs)); font-weight:800}
.tap-slot-time{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-purple); font-weight:700}
.tap-slot-avail{font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-ok); font-weight:700; margin-top:4px}
.tap-slot-state{display:inline-block; font-size:calc(0.6875 * var(--tap-fs)); font-weight:700; padding:2px 8px; border-radius:var(--tap-r-3xl); margin-top:4px}
.tap-slot-state.upcoming{background:#fff3cd; color:#856404}
.tap-slot-state.full{background:#fde8e8; color:var(--tap-err)}
.tap-countdown-live{font-variant-numeric:tabular-nums; letter-spacing:.02em; display:inline-block; font-family:monospace; font-size:calc(0.75 * var(--tap-fs)); font-weight:700; color:var(--tap-warn); background:#fff8e8; border-radius:var(--tap-r-3xs); padding:3px 8px; margin:4px 0}
.tap-countdown-live.closed{color:var(--tap-err); background:#fff0f0}
.tap-countdown-live.urgent{color:var(--tap-err); animation:tapPulse 1s infinite;}
.tap-addons-grid{display:grid; grid-template-columns:1fr 1fr;
  gap:10px; margin-top:12px;}
@media(max-width:400px){.tap-addons-grid{grid-template-columns:1fr;}}
.tap-addon-card{border:2px solid var(--tap-line); border-radius:var(--tap-r-lg);
  padding:14px 12px; cursor:pointer;
  transition:all var(--dur-std) var(--ease-out);
  background:#fff; display:flex; flex-direction:column; gap:6px;
  position:relative;}
.tap-addon-card:hover{border-color:var(--tap-purple); background:#fdf4ff; transform:translateY(-1px);}
.tap-addon-card.is-on{border-color:var(--tap-ok); background:#f0fbf4;}
.tap-addon-emoji{font-size:calc(1.5 * var(--tap-fs)); line-height:1;}
.tap-addon-name-txt{font-size:calc(0.8125 * var(--tap-fs)); font-weight:800; color:var(--tap-ink); display:flex; align-items:center; gap:6px; flex-wrap:wrap;}
.tap-rec-tag{font-size:calc(0.625 * var(--tap-fs)); color:var(--tap-marigold-deep); background:var(--tap-gold-light); border-radius:var(--tap-r-3xl); padding:1px 7px; font-weight:800;}
.tap-addon-desc{margin-top:2px; font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted); line-height:1.5}
.tap-addon-bottom{display:flex; align-items:center; justify-content:space-between; margin-top:auto;}
.tap-addon-price-tag{font-size:calc(0.8125 * var(--tap-fs)); font-weight:900; color:var(--tap-purple); font-family:"Fraunces",serif; flex-shrink:0;}
/* v6.9.15: inline-flex + gap + nowrap so the "+ Add" / "✓ Added" glyph and
   label never overlap or clip; flex-shrink:0 keeps the pill its full width. */
.tap-addon-togbtn{display:inline-flex; align-items:center; justify-content:center; gap:4px; white-space:nowrap; flex-shrink:0; line-height:1; font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; padding:6px 12px;
  border-radius:var(--tap-r-3xl); background:var(--tap-purple-pale);
  color:var(--tap-purple); transition:all var(--dur-fast);}
.tap-addon-togbtn.on{background:var(--tap-ok); color:#fff;}
.tap-sticky{margin-top:20px; display:flex; align-items:center; gap:14px; position:fixed; bottom:0; left:0; right:0; z-index:500; background:rgba(255,255,255,.96); backdrop-filter:blur(20px) saturate(180%); border-top:1px solid var(--tap-line); box-shadow:0 -8px 32px rgba(97,9,190,.12); padding:10px 16px 12px}
@media(max-width:767px){.tap-sticky{padding-bottom:calc(12px + env(safe-area-inset-bottom,0px));}}
.tap-sticky-inner{display:flex; align-items:center; gap:12px;}
.tap-sticky-price{font-size:calc(1.25 * var(--tap-fs)); font-weight:800; color:var(--tap-purple); font-family:"Fraunces",serif; display:flex; flex-direction:column; gap:2px; flex:1}
.tap-sticky-total{font-size:calc(1.375 * var(--tap-fs)); font-weight:900; color:var(--tap-purple); font-family:"Fraunces",serif; display:block;}
.tap-sticky-incl{font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted); font-weight:600;}
.tap-sticky-trust{display:flex; gap:12px; justify-content:center;
  font-size:calc(0.625 * var(--tap-fs)); color:var(--tap-muted); font-weight:700;
  padding:6px 0 0; letter-spacing:.03em;}
.tap-btn-cta{background:var(--grad-sacred); color:#fff;
  font-size:calc(1 * var(--tap-fs)); font-weight:900; letter-spacing:.01em;
  padding:14px 24px; border-radius:var(--tap-radius-full);
  box-shadow:0 6px 24px rgba(97,9,190,.35);
  transition:all var(--dur-std) var(--ease-spring);
  min-width:160px; white-space:nowrap;
  border:none; cursor:pointer; font-family:inherit;}
.tap-btn-cta:hover{transform:translateY(-2px); box-shadow:0 10px 32px rgba(97,9,190,.45);}
.tap-btn-cta:active{transform:scale(.97);}
.tap-btn-cta[disabled]{opacity:.5; cursor:not-allowed;}
.tap-cta-lock{font-size:calc(0.8125 * var(--tap-fs));}
.tap-cta-txt{font-size:calc(0.9375 * var(--tap-fs));}
.tap-cta-amt{font-size:calc(0.875 * var(--tap-fs)); opacity:.9;}
.tap-coupon{display:flex; gap:8px; align-items:center;}
.tap-coupon-inp{flex:1; border:2px solid var(--tap-line); border-radius:var(--tap-r-sm);
  padding:10px 14px; font-size:calc(0.875 * var(--tap-fs)); font-weight:700;
  font-family:monospace; letter-spacing:.08em; text-transform:uppercase;
  transition:border-color var(--dur-std); background:#fff;
  outline:none;}
.tap-coupon-inp:focus{border-color:var(--tap-purple); box-shadow:var(--tap-glow);}
.tap-coupon-msg{font-size:calc(0.8125 * var(--tap-fs)); margin-top:6px; min-height:20px;}
.tap-section-coupon{background:var(--tap-gold-light); border-radius:var(--tap-radius); padding:20px; margin:0;}
.tap-trust-strip{display:flex; flex-wrap:wrap; gap:8px 16px;
  padding:12px 0; border-top:1px solid var(--tap-line);
  border-bottom:1px solid var(--tap-line); margin:12px 0;}
.tap-trust-item{display:flex; align-items:center; gap:5px; font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted); font-weight:700;}
.tap-section{padding:16px 0}
.tap-section h2{font-size:calc(1.0625 * var(--tap-fs)); font-weight:800; color:var(--tap-ink); margin-bottom:12px;}
.tap-section + .tap-section{border-top:1px solid var(--tap-line);}
.tap-family-panel{background:linear-gradient(135deg,#fdf6ff 0%,#fff8f0 100%); border:2px solid var(--tap-purple-pale); border-radius:var(--tap-r-xl); padding:18px; margin:0 0 8px}
.tap-family-hdr h3{margin:0 0 6px; font-size:calc(1 * var(--tap-fs)); color:var(--tap-ink); margin-bottom:4px}
.tap-fam-note{margin:0 0 14px; font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted); margin-bottom:14px}
.tap-member-list{display:flex; flex-direction:column; gap:10px; margin-bottom:12px}
.tap-member-card{background:#fff; border:1px solid var(--tap-line); border-radius:var(--tap-r-sm); padding:12px}
.tap-member-grid{display:grid; grid-template-columns:2fr 1.5fr 1.5fr 70px 32px; gap:8px; align-items:center}
@media(max-width:480px){.tap-member-grid{grid-template-columns:1fr 1fr;}}
.tap-member-grid .tap-inp{border:1px solid var(--tap-line); border-radius:var(--tap-r-xs); padding:7px 10px; font-size:calc(0.8125 * var(--tap-fs)); width:100%; outline:none}
.tap-member-grid .tap-inp:focus{border-color:var(--tap-purple);}
.tap-member-rm{background:#fff0f0; border:1px solid #f5c6c6; border-radius:var(--tap-r-xs); width:30px; height:30px; color:var(--tap-err); cursor:pointer; display:flex; align-items:center; justify-content:center; font-size:calc(1 * var(--tap-fs))}
.tap-add-member{font-size:calc(0.8125 * var(--tap-fs)); margin:6px 0}
.tap-extra-total{font-size:calc(0.875 * var(--tap-fs)); font-weight:700; color:var(--tap-purple); background:var(--tap-purple-pale); border-radius:var(--tap-r-xs); padding:8px 12px; margin-top:10px}
.tap-hero{grid-template-columns:1.1fr 1fr; gap:20px; align-items:start; padding:4px; position:relative; border-radius:var(--tap-radius); overflow:hidden; margin-bottom:0; min-height:220px; display:flex; flex-direction:column; justify-content:flex-end; background:var(--grad-sacred)}
.tap-hero-img{position:absolute; inset:0; background-size:cover; background-position:center;}
.tap-hero-img::after{content:''; position:absolute; inset:0;
  background:linear-gradient(0deg, rgba(30,10,46,.85) 0%, rgba(30,10,46,.3) 60%, transparent 100%);}
.tap-hero > *:not(.tap-hero-img){position:relative; z-index:1; padding:20px;}
.tap-hero h1{font-size:clamp(22px,4vw,32px); color:#fff; text-shadow:0 2px 8px rgba(0,0,0,.3); margin-bottom:6px}
.tap-sub{font-size:calc(0.875 * var(--tap-fs)); color:rgba(255,255,255,.85); margin-bottom:10px;}
.tap-pills{display:flex; flex-wrap:wrap; gap:6px;}
.tap-pill{background:rgba(255,255,255,.18); color:#fff; backdrop-filter:blur(8px); border-radius:var(--tap-r-3xl); padding:4px 10px; font-size:calc(0.75 * var(--tap-fs)); font-weight:700; border:1px solid rgba(255,255,255,.25)}
.tap-pill.gold{color:var(--tap-marigold-deep); background:rgba(249,144,0,.3); border-color:var(--tap-marigold)}
.tap-back{font:inherit; transition:gap var(--dur-fast),color var(--dur-fast); display:inline-flex; align-items:center; gap:6px; color:var(--tap-purple); font-weight:700; font-size:calc(0.875 * var(--tap-fs)); background:none; border:none; cursor:pointer; padding:12px 0 8px}
.tap-back:hover{color:var(--tap-purple-deep); gap:10px; text-decoration:underline}
.tap-notice-warn{background:#fff8e8; border:2px solid var(--tap-marigold);
  border-radius:var(--tap-r-md); padding:14px 16px; font-size:calc(0.875 * var(--tap-fs));
  display:flex; align-items:flex-start; gap:10px;}
.tap-empty-state{text-align:center; padding:40px 20px;
  background:var(--tap-purple-pale); border-radius:var(--tap-radius);}
.tap-empty-icon{font-size:calc(2.5 * var(--tap-fs)); margin-bottom:12px;}
/* v6.9.15 FIX: was white-space:nowrap — a long error ("Online payment is
   temporarily unavailable…") could not wrap, so it spilled out both sides of
   the fixed-width pill (half the text outside the box). Let it wrap. */
/* v6.9.15 FIX2: the success overlay is a transformed ancestor, so the fixed
   toast's `width:calc(100% - 32px)` resolved against it and collapsed to a
   sliver — then `word-break:break-word` stacked every letter vertically
   ("S a n k a l p"). Size to content (max-content), cap with viewport units
   (vw, not %, so a transformed ancestor can't shrink it), and drop the
   per-character break. */
.tap-toast{white-space:normal; overflow-wrap:break-word; word-break:normal; line-height:1.45; pointer-events:none; min-width:0; text-align:center; position:fixed; bottom:calc(var(--nav-h) + 12px); left:50%; transform:translateX(-50%) translateY(8px); z-index:9999; width:max-content; max-width:min(340px, calc(100vw - 32px)); background:var(--tap-ink, #1e0a2e); color:#fff; border-radius:var(--tap-r-lg); padding:14px 20px; font-size:calc(0.875 * var(--tap-fs)); font-weight:600; box-shadow:0 8px 32px rgba(0,0,0,.3); animation:tapSlideUp .25s var(--ease-spring) forwards}
.tap-toast.tap-toast-err{background:var(--tap-err);}
@keyframes tapSlideUp{ from{opacity:0;transform:translateX(-50%) translateY(16px)} to{opacity:1;transform:translateX(-50%) translateY(0)} }
.tap-skeleton{background:linear-gradient(90deg,#f0e8fd 0%,#e8e8f0 50%,#f0e8fd 100%); background-size:200% 100%; animation:tapShimmer 1.4s ease infinite; border-radius:var(--tap-r-xs)}
@keyframes tapShimmer{ 0%{background-position:200% 0} 100%{background-position:-200% 0} }
.tap-skel-card{height:200px; border-radius:var(--tap-radius); margin-bottom:12px}
.tap-skel-text{margin-bottom:8px; height:14px; border-radius:var(--tap-r-2xs); margin:6px 0}
.tap-skel-text.w60{width:60%}
.tap-skel-text.w80{width:80%;}
.tap-grid{padding:4px; display:grid; grid-template-columns:repeat(auto-fill,minmax(var(--tap-card-gridmin,280px),1fr)); gap:16px}
@media(max-width:600px){.tap-grid{grid-template-columns:repeat(2,1fr); gap:10px;}}
.tap-pcard{display:flex; flex-direction:column; border-radius:var(--tap-radius); overflow:hidden; cursor:pointer; background:var(--tap-card); box-shadow:0 2px 12px rgba(97,9,190,.06); transition:all var(--dur-std) var(--ease-out); border:1px solid var(--tap-line)}
.tap-pcard:hover{transform:translateY(-4px); box-shadow:var(--tap-shadow-xl); border-color:var(--tap-purple)}
/* v6.9.83 — the ratio must GOVERN, so height is auto.
   This rule used to declare aspect-ratio:16/10 AND an explicit height. An
   explicit height wins, so the ratio was inert: measured 112x112 (1.000:1)
   against the declared 1.600:1. Card thumbnails were therefore cropped to
   whatever height the size preset imposed, and the crop changed with the
   layout mode — inconsistent image proportions are the most visible "cheap"
   signal in a catalogue.
   The banner variant in tap-adaptive.css already did this correctly
   (aspect-ratio + height:auto); the base rule now matches it.
   --tap-card-aspect is emitted per-request from the admin Card image ratio
   setting; --tap-card-thumb is kept ONLY as the min-height floor so a very
   narrow column cannot collapse the image to nothing. */
.tap-thumb{aspect-ratio:var(--tap-card-aspect,16/10); background-size:cover; background-position:center; height:auto; min-height:0; background:var(--grad-sacred) center/cover; position:relative; overflow:hidden}
/* List rows are a different component: a fixed square thumb beside text is
   deliberate there, so it opts out of the ratio. */
body.tap-listview-list .tap-root .tap-pcard .tap-thumb{aspect-ratio:1; height:auto}
.tap-thumb-overlay{position:absolute; inset:0; background:linear-gradient(0deg,rgba(30,10,46,.6) 0%,transparent 60%)}
.tap-badge{position:absolute; top:8px; left:8px; background:rgba(30,10,46,.7); color:#fff; backdrop-filter:blur(8px); border-radius:var(--tap-r-3xl); padding:3px 10px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; border:1px solid rgba(255,255,255,.2)}
.tap-badge-verified{position:absolute; top:8px; right:8px; background:var(--tap-ok, #1a7d3c); color:#fff; border-radius:var(--tap-r-3xl); padding:3px 8px; font-size:calc(0.625 * var(--tap-fs)); font-weight:800}
.tap-live-count{letter-spacing:.02em; position:absolute; bottom:8px; left:8px; display:flex; align-items:center; gap:5px; background:rgba(255,255,255,.15); backdrop-filter:blur(8px); border-radius:var(--tap-r-3xl); padding:3px 8px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:700; color:#fff}
.tap-live-dot{box-shadow:0 0 0 0 rgba(224,59,59,.4); width:6px; height:6px; background:#ff3838; border-radius:50%; animation:tapPulse 1s infinite}
.tap-body{flex:1; display:flex; flex-direction:column; gap:6px; padding:12px}
.tap-body h3{font-size:calc(0.875 * var(--tap-fs)); font-weight:800; margin-bottom:4px; line-height:1.3;}
.tap-temple-tag{display:inline-flex; align-items:center; gap:4px; font-weight:600; font-size:calc(0.6875 * var(--tap-fs)); color:var(--tap-muted); margin-bottom:4px}
.tap-rating{display:inline-flex; align-items:center; gap:4px; font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-marigold-deep); font-weight:700; margin-bottom:6px}
.tap-price-row{margin-top:4px; display:flex; align-items:baseline; gap:6px; margin-bottom:8px}
.tap-price-from small{font-size:calc(0.6875 * var(--tap-fs)); font-weight:600; color:var(--tap-muted); font-family:inherit;}
.tap-book-btn-sm{margin-top:10px; font:inherit; width:100%; padding:8px; border-radius:var(--tap-r-sm); background:var(--tap-purple); color:#fff; font-size:calc(0.8125 * var(--tap-fs)); font-weight:800; border:none; cursor:pointer; transition:all var(--dur-fast)}
.tap-book-btn-sm:hover{color:#fff; background:var(--tap-purple-deep)}
.tap-gallery{display:grid; grid-template-columns:repeat(auto-fill,minmax(80px,1fr)); gap:8px; margin-top:10px;}
.tap-gthumb{border-radius:var(--tap-r-sm); overflow:hidden; aspect-ratio:1; display:block;}
.tap-gthumb img{width:100%; height:100%; object-fit:cover; transition:transform var(--dur-std);}
.tap-gthumb:hover img{transform:scale(1.08);}
.tap-temple-info{display:flex; gap:14px; align-items:flex-start;
  background:var(--tap-gold-light); border-radius:var(--tap-r-lg);
  padding:14px; border:1px solid rgba(249,144,0,.25);}
.tap-temple-thumb{width:56px; height:56px; border-radius:var(--tap-r-sm); background-size:cover; background-position:center; flex-shrink:0;}
.tap-temple-meta{flex:1;}
.tap-temple-name{font-size:calc(0.9375 * var(--tap-fs)); font-weight:800; margin-bottom:4px;}
.tap-temple-loc{font-size:calc(0.8125 * var(--tap-fs)); color:var(--tap-muted); margin-bottom:4px;}
.tap-success{text-align:center; padding:32px 20px}
.tap-success-icon{font-size:calc(3.5 * var(--tap-fs)); margin-bottom:16px; animation:tapBounce .6s var(--ease-spring);}
@keyframes tapBounce{ 0%{transform:scale(0)} 60%{transform:scale(1.2)} 100%{transform:scale(1)} }
.tap-success h2{font-size:calc(1.5 * var(--tap-fs)); margin-bottom:8px; color:var(--tap-ink);}
.tap-success-id{display:inline-block; background:var(--tap-purple-pale); color:var(--tap-purple);
  border-radius:var(--tap-r-sm); padding:8px 18px; font-family:monospace;
  font-size:calc(0.875 * var(--tap-fs)); font-weight:800; letter-spacing:.06em; margin:12px 0;}
.tap-success-actions{display:flex; flex-direction:column; gap:10px; margin-top:20px;}
.tap-pandit-card{display:flex; gap:12px; align-items:center; background:#fff; border-radius:var(--tap-r-lg); padding:14px; border:1px solid var(--tap-line); margin-bottom:0}
.tap-pandit-avatar{border:3px solid var(--tap-marigold); width:52px; height:52px; border-radius:50%; background:var(--grad-sacred); display:flex; align-items:center; justify-content:center; font-size:calc(1.25 * var(--tap-fs)); flex-shrink:0; object-fit:cover}
.tap-pandit-name{color:var(--tap-ink); margin-bottom:2px; font-weight:800; font-size:calc(0.9375 * var(--tap-fs))}
.tap-pandit-exp{margin-bottom:6px; font-size:calc(0.75 * var(--tap-fs)); color:var(--tap-muted); margin-top:2px}
.tap-pandit-tags{display:flex; flex-wrap:wrap; gap:4px; margin-top:6px}
.tap-pandit-tag{border:1px solid var(--tap-line); background:var(--tap-purple-pale); color:var(--tap-purple); border-radius:var(--tap-r-3xl); padding:2px 8px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:700}
.tap-qty{display:flex; align-items:center; gap:0; border:2px solid var(--tap-line); border-radius:var(--tap-r-md); overflow:hidden; display:inline-flex;}
.tap-qty button{width:40px; height:40px; border:none; background:var(--tap-purple-pale); color:var(--tap-purple); font-size:calc(1.25 * var(--tap-fs)); font-weight:900; cursor:pointer; transition:background var(--dur-fast)}
.tap-qty button:hover{background:var(--tap-purple); color:#fff;}
.tap-qty input{width:48px; text-align:center; border:none; border-left:2px solid var(--tap-line); border-right:2px solid var(--tap-line); font-size:calc(1 * var(--tap-fs)); font-weight:800; background:#fff; padding:0; height:40px;}
.tap-search{position:relative; margin-bottom:12px;}
.tap-search input{width:100%; padding:14px 16px 14px 44px;
  border:2px solid var(--tap-line); border-radius:var(--tap-r-lg);
  font-size:calc(0.9375 * var(--tap-fs)); background:#fff; outline:none;
  transition:border-color var(--dur-std), box-shadow var(--dur-std);}
.tap-search input:focus{border-color:var(--tap-purple); box-shadow:var(--tap-glow);}
.tap-search-icon{position:absolute; left:14px; top:50%; transform:translateY(-50%); font-size:calc(1.125 * var(--tap-fs)); pointer-events:none;}
.tap-search-suggestions{margin-top:14px; justify-content:center; display:flex; flex-wrap:wrap; gap:6px; margin-bottom:12px}
.tap-search-sug{display:inline-block; text-decoration:none; background:#fff; border:1.5px solid var(--tap-line); border-radius:var(--tap-r-3xl); padding:6px 12px; font-size:calc(0.75 * var(--tap-fs)); font-weight:700; cursor:pointer; color:var(--tap-purple); transition:all var(--dur-fast)}
.tap-search-sug:hover{background:var(--tap-purple); color:#fff; border-color:var(--tap-purple)}
.tap-ptabs{border-bottom:2px solid var(--tap-line); display:flex; gap:6px; overflow-x:auto; padding-bottom:4px; margin-bottom:16px; scrollbar-width:none}
.tap-ptabs::-webkit-scrollbar{display:none}
.tap-ptab{font:inherit; border-bottom:2px solid transparent; margin-bottom:-2px; flex-shrink:0; padding:7px 16px; border-radius:var(--tap-r-3xl); border:2px solid var(--tap-line); background:#fff; font-size:calc(0.8125 * var(--tap-fs)); font-weight:700; cursor:pointer; color:var(--tap-muted); transition:all var(--dur-fast); white-space:nowrap}
.tap-ptab.active{border-bottom-color:var(--tap-purple); background:var(--tap-purple); color:#fff; border-color:var(--tap-purple)}
@keyframes tapPulse{ 0%,100%{opacity:1;transform:scale(1)} 50%{opacity:.7;transform:scale(1.1)} }
@keyframes tapViewIn{ from{opacity:0;transform:translateY(12px)} to{opacity:1;transform:none} }
@keyframes tapReveal{ from{opacity:0;transform:scale(.97)} to{opacity:1;transform:none} }
.tap-reveal{opacity:0; transform:translateY(24px); transition:opacity .6s var(--ease-out),transform .6s var(--ease-out); animation:tapReveal .3s var(--ease-spring) both}
.tap-reveal:nth-child(2){animation-delay:.05s}
.tap-reveal:nth-child(3){animation-delay:.10s}
.tap-reveal:nth-child(4){animation-delay:.15s}
/* v6.9.15: dropped overflow:hidden — it clipped labels on any width-constrained
   button (e.g. the "Add" pill in Enhance Your Puja). The only thing that needed
   it was the ::before press overlay, which now clips itself via border-radius. */
.tap-btn{display:inline-flex; align-items:center; justify-content:center; gap:8px; padding:var(--tap-btn-pad-y) var(--tap-btn-pad-x); border-radius:var(--tap-btn-radius); border:none; font:inherit; font-size:var(--tap-fs-md); font-weight:var(--tap-btn-weight); cursor:pointer; transition:all var(--dur-std) var(--ease-out); text-decoration:none; white-space:nowrap; -webkit-tap-highlight-color:transparent; position:relative}
.tap-ripple{position:absolute;border-radius:50%;
  background:rgba(255,255,255,.4);
  transform:scale(0);animation:tapRipple .5s linear;
  pointer-events:none;}
@keyframes tapRipple{to{transform:scale(4);opacity:0}}
@supports(padding:env(safe-area-inset-bottom)){.tap-sticky{padding-bottom:calc(12px + env(safe-area-inset-bottom));}
@media(max-width:767px){.tap-root{padding-bottom:calc(var(--nav-h) + env(safe-area-inset-bottom));}}}
.tap-tier-card:focus-visible, .tap-slot:focus-visible, .tap-addon-card:focus-visible{outline:3px solid var(--tap-purple); outline-offset:2px;}
.tap-btn:focus-visible{outline:3px solid var(--tap-purple); outline-offset:3px;}
@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms !important; transition-duration:.01ms !important;}}
@media(max-width:480px){.tap-section h2{font-size:calc(0.9375 * var(--tap-fs));}
.tap-tiers{grid-template-columns:1fr;}
.tap-tier-card{flex-direction:row; align-items:center; padding:12px;}
.tap-tier-head{flex:1;}
.tap-tier-price-block{margin-left:auto; text-align:right;}
.tap-tier-badge{font-size:calc(0.5625 * var(--tap-fs));}
.tap-btn-cta{min-width:140px; font-size:calc(0.875 * var(--tap-fs)); padding:12px 16px;}
.tap-sticky-total{font-size:calc(1.25 * var(--tap-fs));}}
@media(min-width:768px){.tap-tiers{grid-template-columns:repeat(3,1fr);}
.tap-addons-grid{grid-template-columns:repeat(3,1fr);}
.tap-sticky{max-width:480px; left:50%; right:auto; transform:translateX(-50%); border-radius:var(--tap-radius) var(--tap-radius) 0 0;}}
.tap-verified-badge{border:1px solid #b8e6c8; letter-spacing:.03em; display:inline-flex; align-items:center; gap:4px; background:#e8f8ee; color:var(--tap-ok); border-radius:var(--tap-r-3xl); padding:3px 10px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:800}
.tap-trust-card{box-shadow:var(--tap-shadow); margin-bottom:16px; background:var(--tap-gold-light); border-radius:var(--tap-r-lg); padding:14px; border:1px solid rgba(249,144,0,.25)}
.tap-trust-signals{margin:12px 0; list-style:none; display:flex; flex-direction:column; gap:6px; font-size:calc(0.8125 * var(--tap-fs)); margin-top:10px}
.tap-trust-signals li{font-size:calc(0.8125 * var(--tap-fs)); padding:5px 0; border-bottom:1px solid var(--tap-line); display:flex; align-items:center; gap:8px; color:var(--tap-muted)}
.tap-auth-overlay{position:fixed; inset:0; background:rgba(30,10,46,.5);
  z-index:var(--zi-modal, 5000); display:flex; align-items:flex-end;
  backdrop-filter:blur(8px);}
.tap-auth-sheet{background:#fff; border-radius:24px 24px 0 0;
  width:100%; max-width:480px; margin:0 auto;
  padding:24px 20px 32px;
  animation:tapSlideUp .3s var(--ease-spring);}
.tap-auth-handle{width:36px; height:4px; background:var(--tap-line); border-radius:var(--tap-r-2xs); margin:0 auto 20px;}
.tap-tabs{scrollbar-width:none; display:flex; gap:0; border-bottom:2px solid var(--tap-line); margin-bottom:20px; overflow-x:auto}
.tap-tab{padding:10px 20px; border:none; background:none; font:inherit; font-size:calc(0.875 * var(--tap-fs)); font-weight:700; color:var(--tap-muted); cursor:pointer; border-bottom:3px solid transparent; margin-bottom:-2px; white-space:nowrap; transition:all var(--dur-fast)}
.tap-tab.active{color:var(--tap-purple); border-bottom-color:var(--tap-purple)}
.tap-booking-card{border:1.5px solid var(--tap-line); border-radius:var(--tap-r-lg);
  padding:14px; margin-bottom:10px; cursor:pointer;
  transition:all var(--dur-fast);}
.tap-booking-card:hover{border-color:var(--tap-purple);}
.tap-status-badge{display:inline-block; border-radius:var(--tap-r-3xl);
  padding:3px 10px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:800;}
.tap-desc{font-size:calc(0.9375 * var(--tap-fs)); line-height:1.8; color:var(--tap-ink);}
.tap-desc h2, .tap-desc h3{margin:16px 0 8px;}
.tap-desc ul{padding-left:18px;}
.tap-desc li{padding:3px 0;}
.tap-tag{background:var(--tap-purple-pale); color:var(--tap-purple);
  border-radius:var(--tap-r-3xl); padding:2px 8px; font-size:calc(0.6875 * var(--tap-fs));
  font-weight:700; display:inline-block;}
.tap-tag-gold{background:var(--tap-gold-light); color:var(--tap-chocolate);
  border-radius:var(--tap-r-3xl); padding:2px 8px; font-size:calc(0.6875 * var(--tap-fs)); font-weight:700;}
.tap-stars{color:var(--tap-marigold); font-size:calc(0.875 * var(--tap-fs)); letter-spacing:1px}
.tap-detail-hero{aspect-ratio:21/9; min-height:240px; margin-bottom:20px; position:relative; border-radius:var(--tap-radius); overflow:hidden; background:var(--grad-sacred); display:flex; flex-direction:column; justify-content:flex-end; padding:24px}
@media(max-width:600px){.tap-detail-hero{min-height:200px; aspect-ratio:16/9;}}
.tap-detail-hero-overlay{position:absolute; inset:0; background:linear-gradient(0deg,rgba(30,10,46,.85) 0%,rgba(30,10,46,.1) 70%)}
.tap-detail-hero-info{bottom:20px; left:20px; right:20px; color:#fff; position:relative; z-index:1}
.tap-detail-hero img, .tap-detail-hero video{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; opacity:.85;}
.tap-detail-layout{align-items:start; display:grid; grid-template-columns:1fr; gap:20px; margin-top:20px}
@media(min-width:900px){.tap-detail-layout{grid-template-columns:1fr 360px;}}
.tap-sticky-box{position:sticky; top:80px; align-self:start}
.tap-price-from{font-size:calc(1.75 * var(--tap-fs)); font-weight:900; color:var(--tap-purple); font-family:"Fraunces",serif}
.tap-btn-block{width:100%; justify-content:center}
.tap-btn-xl{padding:16px 24px; font-size:calc(1.0625 * var(--tap-fs))}
.tap-root :focus-visible, .tap-slot:focus-visible, .tap-btn:focus-visible, .tap-addon-card:focus-visible, .tap-tier:focus-visible, .tap-chip:focus-visible, .tap-dtab:focus-visible, .tap-bnav-item:focus-visible{outline: 3px solid var(--tap-purple, #6109be);
	outline-offset: 2px;
	border-radius: var(--tap-r-xs, 6px);}
.tap-slot[aria-disabled="true"]{cursor: not-allowed;
	opacity: .55;}
.tap-slot[aria-pressed="true"]{border-color: var(--tap-purple, #6109be);
	box-shadow: 0 0 0 2px rgba(97, 9, 190, .25);}
@media (prefers-reduced-motion: reduce){.tap-root *, .tap-root *::before, .tap-root *::after{animation-duration: .001ms !important;
		transition-duration: .001ms !important;}}
.tap-delivery-chips{display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 4px 0 10px;}
.tap-delivery-chip{border: 1.5px solid #e7d9f5; background: #fff; color: #3a2a4a;
	border-radius: var(--tap-r-sm); padding: 10px 8px; font-size:calc(0.8125 * var(--tap-fs)); font-weight: 600;
	cursor: pointer; transition: border-color .12s ease, background .12s ease;}
.tap-delivery-chip:hover{border-color: #b98be6;}
.tap-delivery-chip.is-on{border-color: var(--tap-purple, #6109be); background: #f3e9fd; color: #4e0a98;}
.tap-delivery-chip:focus-visible{outline: 3px solid var(--tap-purple, #6109be); outline-offset: 2px;}
.tap-gotra-help{display: inline-block; margin: -4px 0 8px; padding: 0;
	background: none; border: none; cursor: pointer;
	color: var(--tap-purple, #6109be); font-size:calc(0.7813 * var(--tap-fs)); font-weight: 600; text-decoration: underline;}
.tap-gotra-help:hover{color: #4e0a98;}
@media (prefers-reduced-motion: reduce){.tap-delivery-chip{transition: none;}}
.tap-sec-head2{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin:26px 0 14px}
.tap-sec-eyebrow{font-size:calc(0.6875 * var(--tap-fs));font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--tap-marigold, #F99000);margin-bottom:3px}
.tap-sec-title{font-family:"Fraunces",Georgia,serif;font-size:clamp(19px,3vw,24px);font-weight:600;color:#241832;margin:0;line-height:1.3}
.tap-sec-action{font-size:calc(0.8125 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE);text-decoration:none;white-space:nowrap;padding-bottom:2px}
.tap-sec-action:hover{color:var(--tap-ink-accent,var(--tap-purple,#6109be))}
.tap-hscroll-snap{display:flex;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;padding:2px 2px 8px;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.tap-hscroll-snap::-webkit-scrollbar{display:none}
.tap-hscroll-snap>*{scroll-snap-align:start;flex-shrink:0}
.tap-mkb{margin:18px 0 4px}
.tap-mkb-item{position:relative;display:flex;flex-direction:column;justify-content:center;min-width:88%;aspect-ratio:3/1;border-radius:var(--tap-r-4xl);overflow:hidden;padding:0 20px;text-decoration:none;color:#fff}
@media(min-width:720px){.tap-mkb-item{min-width:560px}}
.tap-mkb-glyph{position:absolute;right:-8px;bottom:-18px;font-size:calc(5.5 * var(--tap-fs));opacity:.16;line-height:1;pointer-events:none}
.tap-mkb-body{position:relative;display:flex;flex-direction:column;align-items:flex-start;max-width:82%}
.tap-mkb-tag{font-size:calc(0.6563 * var(--tap-fs));font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.85);margin-bottom:4px}
.tap-mkb-title{font-family:"Fraunces",Georgia,serif;font-size:clamp(16px,4vw,20px);font-weight:700;line-height:1.15;margin-bottom:9px;text-shadow:0 1px 6px rgba(0,0,0,.18)}
.tap-mkb-cta{display:inline-flex;align-items:center;gap:5px;background:#fff;font-size:calc(0.75 * var(--tap-fs));font-weight:700;padding:6px 14px;border-radius:var(--tap-r-full)}
.tap-resume-slot:empty{display:none}
.tap-resume-card{display:flex;align-items:center;gap:13px;background:#fff;border:1px solid #EDE6DA;border-left:3px solid var(--tap-marigold, #F99000);border-radius:var(--tap-r-xl);padding:14px 16px;margin:16px 0 4px;box-shadow:0 2px 12px rgba(66,7,127,.06);cursor:pointer;text-decoration:none}
.tap-resume-ic{width:44px;height:44px;border-radius:var(--tap-r-md);background:#FFF1DC;display:grid;place-items:center;font-size:calc(1.25 * var(--tap-fs));flex-shrink:0}
.tap-resume-mid{flex:1;min-width:0}
.tap-resume-ey{font-size:calc(0.7188 * var(--tap-fs));font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--tap-marigold, #F99000)}
.tap-resume-name{font-size:calc(0.9063 * var(--tap-fs));font-weight:700;color:#241832;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tap-resume-meta{font-size:calc(0.7813 * var(--tap-fs));color:var(--tap-muted, #6B5B78);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tap-resume-go{font-size:calc(0.7813 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE);flex-shrink:0}
.tap-fav-rail{margin:0 0 6px}
.tap-fav-card{position:relative;width:210px;background:#fff;border:1px solid #EDE6DA;border-radius:var(--tap-r-xl);overflow:hidden;box-shadow:0 2px 12px rgba(66,7,127,.06);text-decoration:none;display:block}
.tap-fav-art{height:104px;display:grid;place-items:center;background-size:cover;background-position:center;font-size:calc(2.125 * var(--tap-fs));color:#fff}
.tap-fav-kind{position:absolute;top:10px;left:10px;background:rgba(0,0,0,.32);color:#fff;font-size:calc(0.625 * var(--tap-fs));font-weight:700;padding:3px 9px;border-radius:var(--tap-r-full)}
.tap-fav-un{position:absolute;top:10px;right:10px;width:32px;height:32px;border-radius:var(--tap-r-full);background:rgba(255,255,255,.95);border:none;display:grid;place-items:center;box-shadow:0 2px 12px rgba(66,7,127,.10);cursor:pointer;font-size:calc(1 * var(--tap-fs));color:var(--tap-marigold, #F99000);line-height:1}
.tap-fav-body{padding:12px}
.tap-fav-name{font-family:"Fraunces",Georgia,serif;font-size:calc(0.9063 * var(--tap-fs));font-weight:600;color:#241832;line-height:1.2;display:block}
.tap-fav-temple{font-size:calc(0.7188 * var(--tap-fs));color:var(--tap-muted, #6B5B78);margin-top:4px;display:block}
.tap-fav-price{font-family:"Fraunces",Georgia,serif;font-size:calc(0.9375 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE);margin-top:8px;display:block}
.tap-fcard-rail{gap:14px}
.tap-fcard{position:relative;width:230px;background:#fff;border:1px solid #EDE6DA;border-radius:var(--tap-r-xl);overflow:hidden;box-shadow:0 2px 12px rgba(66,7,127,.06);transition:transform var(--dur-std) var(--ease-out),box-shadow var(--dur-std) var(--ease-out)}
.tap-fcard:hover{transform:translateY(-3px);box-shadow:0 8px 28px rgba(66,7,127,.12)}
.tap-fcard-art{display:grid;place-items:center;height:130px;background-size:cover;background-position:center;text-decoration:none;position:relative}
.tap-fcard-glyph{font-size:calc(2.5 * var(--tap-fs));color:#fff;opacity:.9}
.tap-fcard-badge{position:absolute;bottom:10px;left:10px;background:#E7F5EC;color:var(--tap-ok, #1A7D3C);font-size:calc(0.6563 * var(--tap-fs));font-weight:700;padding:3px 9px;border-radius:var(--tap-r-full)}
.tap-fcard-heart{position:absolute;top:10px;right:10px;width:34px;height:34px;border-radius:var(--tap-r-full);background:rgba(255,255,255,.95);border:none;display:grid;place-items:center;box-shadow:0 2px 12px rgba(66,7,127,.10);cursor:pointer;font-size:calc(1.0625 * var(--tap-fs));line-height:1;color:#9C8FA8;z-index:2;transition:transform var(--dur-fast) var(--ease-spring)}
.tap-fcard-heart:active{transform:scale(1.15)}
.tap-fcard-heart.is-on{color:var(--tap-marigold, #F99000)}
.tap-fcard-body{display:block;padding:14px;text-decoration:none}
.tap-fcard-name{font-family:"Fraunces",Georgia,serif;font-size:calc(1 * var(--tap-fs));font-weight:600;color:#241832;line-height:1.2;display:block}
.tap-fcard-temple{font-size:calc(0.75 * var(--tap-fs));color:var(--tap-muted, #6B5B78);margin-top:6px;display:block}
.tap-fcard-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:12px}
.tap-fcard-price{font-size:calc(0.7813 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE)}
.tap-fcard-price em{font-style:normal;font-weight:600;color:var(--tap-muted, #6B5B78);font-size:calc(0.6875 * var(--tap-fs))}
.tap-fcard-rating{font-size:calc(0.75 * var(--tap-fs));font-weight:700;color:#C8952A;white-space:nowrap}
.tap-hl-tile{position:relative;display:flex;align-items:flex-end;height:128px;border-radius:var(--tap-r-4xl);overflow:hidden;background:linear-gradient(135deg,var(--tap-marigold, #F99000),#D4A017);padding:16px 18px;margin:22px 0 4px;text-decoration:none}
.tap-hl-glyph{position:absolute;right:6px;top:6px;font-size:calc(4 * var(--tap-fs));opacity:.22;line-height:1}
.tap-hl-label{position:relative;font-family:"Fraunces",Georgia,serif;font-size:clamp(15px,3.6vw,18px);font-weight:600;color:#fff;line-height:1.25;text-shadow:0 1px 6px rgba(0,0,0,.16);max-width:86%}
.tap-hl-vip{display:block;background:#fff;border:1px solid #EDE6DA;border-radius:var(--tap-r-xl);overflow:hidden;box-shadow:0 2px 12px rgba(66,7,127,.06);margin:0 0 10px;text-decoration:none}
/* v7.5.30: same fix as the hero. The gold second stop is kept deliberately —
   VIP is a tier badge and gold is what signals it — but the base is now the
   operator's brand rather than a hardcoded purple. */
.tap-hl-vip-art{display:grid;place-items:center;height:112px;background:linear-gradient(135deg,color-mix(in srgb,var(--tap-purple,#6109be) 58%,#000),#C8952A)}
.tap-hl-vip-glyph{font-size:calc(2.375 * var(--tap-fs))}
.tap-hl-vip-body{display:block;padding:14px 16px}
.tap-hl-vip-pill{display:inline-flex;align-items:center;gap:5px;background:#F3ECFD;color:var(--tap-purple, #6109BE);font-size:calc(0.6875 * var(--tap-fs));font-weight:700;padding:3px 10px;border-radius:var(--tap-r-full);margin-bottom:8px;letter-spacing:.02em}
.tap-hl-vip-title{display:block;font-family:"Fraunces",Georgia,serif;font-size:calc(1.0625 * var(--tap-fs));font-weight:600;color:#241832;line-height:1.25}
.tap-hl-vip-sub{display:block;font-size:calc(0.7813 * var(--tap-fs));color:var(--tap-muted, #6B5B78);margin-top:4px}
.tap-trust3{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:22px 0 6px}
.tap-trust3-item{text-align:center;background:#fff;border:1px solid #EDE6DA;border-radius:var(--tap-r-xl);padding:16px 8px}
.tap-trust3-num{font-family:"Fraunces",Georgia,serif;font-size:calc(1.375 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE);line-height:1.1}
.tap-trust3-label{font-size:calc(0.7188 * var(--tap-fs));color:var(--tap-muted, #6B5B78);margin-top:3px}
.tap-testi2-grid{display:grid;gap:12px;grid-template-columns:1fr}
@media(min-width:720px){.tap-testi2-grid{grid-template-columns:1fr 1fr}}
.tap-testi2{background:#fff;border:1px solid #EDE6DA;border-radius:var(--tap-r-xl);padding:16px;box-shadow:0 2px 12px rgba(66,7,127,.06)}
.tap-testi2-stars{color:var(--tap-marigold, #F99000);font-size:calc(0.875 * var(--tap-fs));letter-spacing:2px;margin-bottom:8px}
.tap-testi2-quote{font-family:"Fraunces",Georgia,serif;font-size:calc(0.9375 * var(--tap-fs));font-style:italic;color:#241832;margin:0 0 10px;line-height:1.5}
.tap-testi2-by{font-size:calc(0.7813 * var(--tap-fs));font-weight:600;color:var(--tap-muted, #6B5B78)}
.tap-admin-note{display:flex;align-items:flex-start;gap:10px;background:#F3ECFD;border-radius:var(--tap-r-4xl);padding:14px 16px;margin-top:18px;font-size:calc(0.75 * var(--tap-fs));color:var(--tap-muted, #6B5B78);line-height:1.45}
.tap-admin-note strong{font-size:calc(0.8125 * var(--tap-fs));font-weight:700;color:var(--tap-ink-accent,var(--tap-purple,#6109be))}
.tap-admin-note-ic{width:34px;height:34px;border-radius:var(--tap-r-sm);background:#fff;display:grid;place-items:center;flex-shrink:0;color:var(--tap-purple, #6109BE);font-size:calc(1 * var(--tap-fs))}
@media (prefers-reduced-motion: reduce){.tap-fcard, .tap-fcard-heart{transition:none}
.tap-fcard:hover{transform:none}}

/* ============================================================
   v4.9.27 — Brand bar + JSX compact hero (replaces legacy hero-v2)
   ============================================================ */
.tap-brandbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 0 12px}
.tap-brandbar-link{display:inline-flex;align-items:center;gap:8px;text-decoration:none}
.tap-brandbar-logo{height:34px;max-width:180px;width:auto;object-fit:contain;display:block}
.tap-brandbar-om{font-size:calc(1.375 * var(--tap-fs));color:var(--tap-purple);line-height:1}
.tap-brandbar-name{font-family:Fraunces,Georgia,serif;font-size:calc(1.1875 * var(--tap-fs));font-weight:700;color:var(--tap-ink);letter-spacing:-.01em}
.tap-brandbar-eyebrow{font-size:calc(0.6875 * var(--tap-fs));font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--tap-marigold-deep);white-space:nowrap}
@media (max-width:400px){.tap-brandbar-eyebrow{display:none}}

/* v7.5.30 — the home hero is the largest brand surface in the product, and two
   of its three gradient stops were hardcoded purples (#42077F, #8E3FD0) left
   over from when DIVSA's own brand was purple. Only the middle stop honoured
   --tap-purple, so on this tenant (#e24e12 orange) the hero rendered
   purple → orange → violet: the operator's colour appeared as a band in the
   middle of somebody else's palette, on the first screen a devotee sees. Same
   white-label breach as the gold "Pay" button and the nav FAB.
   All three stops are now derived from the operator's colour, so the ramp keeps
   its depth (dark top-left → brand → lighter bottom-right) in any brand hue. */
.tap-hero-compact{position:relative;overflow:hidden;border-radius:var(--tap-radius-xl);background:linear-gradient(150deg,color-mix(in srgb,var(--tap-purple,#6109be) 58%,#000) 0%,var(--tap-purple,#6109be) 55%,color-mix(in srgb,var(--tap-purple,#6109be) 82%,#fff) 100%);padding:22px 20px 24px;margin:0 0 20px}
.tap-hero-compact-media{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center;opacity:.9}
.tap-hero-compact.has-media::before{content:"";position:absolute;inset:0;background:linear-gradient(150deg,rgba(66,7,127,.78),rgba(97,9,190,.55));z-index:1}
.tap-hero-compact-glyph{position:absolute;right:-24px;top:-18px;font-size:calc(7.5 * var(--tap-fs));color:#fff;opacity:.12;line-height:1;pointer-events:none;z-index:1}
.tap-hero-compact-body{position:relative;z-index:2}
.tap-hero-compact-pill{display:inline-flex;align-items:center;gap:6px;background:rgba(255,255,255,.16);border-radius:var(--tap-r-full);padding:5px 12px;font-size:calc(0.75 * var(--tap-fs));font-weight:600;color:#fff;margin-bottom:14px}
.tap-hero-compact-title{font-family:Fraunces,Georgia,serif;font-size:clamp(24px,5.5vw,30px);font-weight:600;color:#fff;line-height:1.18;margin:0 0 8px}
.tap-hero-compact-sub{font-size:calc(0.875 * var(--tap-fs));color:rgba(255,255,255,.86);line-height:1.5;margin:0 0 18px;max-width:520px}
.tap-hero-compact-search{display:flex;align-items:center;gap:10px;background:#fff;padding:6px 6px 6px 16px;border-radius:var(--tap-r-full);box-shadow:0 6px 18px rgba(0,0,0,.14);max-width:560px}
.tap-hero-compact-search span{font-size:calc(1.0625 * var(--tap-fs))}
.tap-hero-compact-search input{flex:1;border:none;outline:none;font:inherit;font-size:calc(0.875 * var(--tap-fs));color:var(--tap-ink);background:transparent;min-width:0;min-height:40px}
.tap-hero-compact-search input::placeholder{color:var(--tap-muted)}
.tap-hero-compact-search button{flex-shrink:0;background:var(--tap-marigold);color:#3a2400;border:none;border-radius:var(--tap-r-full);padding:10px 20px;font:inherit;font-size:calc(0.875 * var(--tap-fs));font-weight:800;cursor:pointer;min-height:40px}
.tap-hero-compact-search button:hover{filter:brightness(1.05)}
@media (min-width:768px){.tap-hero-compact{padding:34px 32px 36px}}

/* ══════════════════════════════════════════════════════════════════════
   v4.9.33 — Demo parity additions
   Splash · Onboarding · Wishlist tab · Notifications tab
   Tokens follow the JSX demo: Cosmic Violet var(--tap-purple, #6109BE) / deep #42077F,
   Saffron var(--tap-marigold, #F99000), ivory ground #FBF7F0, Fraunces heads / Jakarta body.
   ══════════════════════════════════════════════════════════════════════ */

html.tap-noscroll, html.tap-noscroll body { overflow: hidden; }

/* ---- Splash (2s brand intro) ---- */
.tap-splash {
	position: fixed; inset: 0; z-index: 99999;
	display: grid; place-items: center;
	/* v7.5.35 — the outer stop was a hardcoded #42077f, so the splash faded from
	   the operator's brand into a fixed deep purple. Because the stop lands at
	   70%, that purple covered most of the screen: the FIRST thing a devotee
	   ever sees was predominantly a colour belonging to no tenant. Same breach
	   as the home hero, the bottom-nav FAB and the card-art palette; this was
	   the last one. Both stops are now derived from the brand, so the vignette
	   keeps its depth in any palette. */
	background: radial-gradient(circle at 50% 40%, var(--tap-purple, #6109be), color-mix(in srgb, var(--tap-purple, #6109be) 42%, #000) 70%);
	opacity: 1; transition: opacity .32s ease;
}
.tap-splash.is-out { opacity: 0; pointer-events: none; }
.tap-splash-inner { text-align: center; animation: tapSplashFade .6s ease; }
.tap-splash-logo {
	width: 92px; height: 92px; margin: 0 auto 18px; border-radius: var(--tap-r-5xl);
	background: rgba(255,255,255,.14); display: grid; place-items: center;
	font-size:calc(2.875 * var(--tap-fs)); animation: tapSplashGlow 2s infinite ease-in-out;
}
.tap-splash-brand { font-family: 'Fraunces', Georgia, serif; font-size:calc(1.875 * var(--tap-fs)); font-weight: 700; color: #fff; letter-spacing: -.01em; }
.tap-splash-tag { font-family: 'Plus Jakarta Sans', sans-serif; font-size:calc(0.8438 * var(--tap-fs)); color: rgba(255,255,255,.78); margin-top: 6px; }
@keyframes tapSplashFade { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes tapSplashGlow { 0%,100% { transform: scale(1); opacity: .85; } 50% { transform: scale(1.06); opacity: 1; } }

/* ---- Onboarding (one-time welcome) ---- */
.tap-onboard {
	position: fixed; inset: 0; z-index: 99998; background: #fbf7f0;
	display: flex; flex-direction: column; overflow-y: auto;
	opacity: 1; transition: opacity .28s ease;
}
.tap-onboard.is-out { opacity: 0; pointer-events: none; }
.tap-ob-hero { padding: 26px 22px 24px; background: linear-gradient(160deg, #f6e9cf, #ebd9b4); }
.tap-ob-brand { font-family: 'Fraunces', Georgia, serif; font-size:calc(1.125 * var(--tap-fs)); font-weight: 700; color: var(--tap-purple, #6109be); margin-bottom: 16px; }
.tap-ob-brand span { display: block; font-family: 'Plus Jakarta Sans', sans-serif; font-size:calc(0.5938 * var(--tap-fs)); font-weight: 600; color: #c8952a; letter-spacing: .12em; }
.tap-ob-hero h1 { font-family: 'Fraunces', Georgia, serif; font-size:calc(1.625 * var(--tap-fs)); font-weight: 700; color: #241832; margin: 0 0 8px; line-height: 1.2; }
.tap-ob-hero h1 em { font-style: normal; color: var(--tap-marigold, #f99000); }
.tap-ob-hero p { font-family: 'Plus Jakarta Sans', sans-serif; font-size:calc(0.8125 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin: 0; line-height: 1.5; max-width: 320px; }
.tap-ob-body { flex: 1; padding: 20px 20px 28px; max-width: 480px; margin: 0 auto; width: 100%; }
.tap-ob-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; }
.tap-ob-card {
	background: #fff; border: 1px solid #ede6da; border-radius: var(--tap-r-4xl);
	padding: 18px 12px; text-align: center; cursor: pointer;
	box-shadow: 0 2px 12px rgba(66,7,127,.06); transition: transform .15s ease, box-shadow .15s ease;
}
.tap-ob-card:hover, .tap-ob-card:focus-visible { transform: translateY(-2px); box-shadow: 0 8px 28px rgba(66,7,127,.12); }
.tap-ob-card-ic {
	display: grid; place-items: center; width: 56px; height: 56px; margin: 0 auto 12px;
	border-radius: var(--tap-r-full); font-size:calc(1.625 * var(--tap-fs)); color: #fff;
}
/* v7.5.36 — the four onboarding icon circles were a hardcoded palette:
   green #1ba87e, rose #e86a8e and a violet #8e3fd0, measured at hues 162, 343
   and 273 against a brand hue of 17. Three of the four service tiles on the
   FIRST screen were therefore in colours belonging to no tenant. They stay
   four visually distinct tiles \u2014 that is the point of them \u2014 but the family is
   now derived from the brand and the gold accent, exactly like the home card
   art, so it travels with whatever colour the operator picks. */
.tap-ob-card-ic.saffron { background: linear-gradient(140deg, var(--tap-gold,#f99000), color-mix(in srgb,var(--tap-gold,#f99000) 62%,#000)); box-shadow: 0 6px 16px rgba(249,144,0,.28); }
.tap-ob-card-ic.green   { background: linear-gradient(140deg, color-mix(in srgb,var(--tap-purple,#6109be) 78%,#fff), var(--tap-purple,#6109be)); box-shadow: 0 6px 16px rgba(27,168,126,.28); }
.tap-ob-card-ic.violet  { background: linear-gradient(140deg, var(--tap-purple,#6109be), color-mix(in srgb,var(--tap-purple,#6109be) 55%,#000)); box-shadow: 0 6px 16px rgba(97,9,190,.28); }
.tap-ob-card-ic.rose    { background: linear-gradient(140deg, color-mix(in srgb,var(--tap-gold,#f99000) 55%,var(--tap-purple,#6109be)), color-mix(in srgb,var(--tap-purple,#6109be) 70%,#000)); box-shadow: 0 6px 16px rgba(232,106,142,.28); }
.tap-ob-card-lb { display: block; font-family: 'Fraunces', Georgia, serif; font-size:calc(1 * var(--tap-fs)); font-weight: 700; color: #241832; }
.tap-ob-card-ds { display: block; font-family: 'Plus Jakarta Sans', sans-serif; font-size:calc(0.7813 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin-top: 3px; line-height: 1.35; min-height: 30px; }
.tap-ob-inner-circle {
	border: none; font: inherit; text-align: left; cursor: pointer; width: 100%;
	display: flex; gap: 12px; align-items: flex-start;
	background: linear-gradient(120deg, color-mix(in srgb,var(--tap-purple,#6109be) 52%,#000), var(--tap-purple,#6109be)); /* v7.5.36: was a hardcoded #42077f */
	border-radius: var(--tap-r-4xl); padding: 16px 18px; margin-bottom: 18px;
}
.tap-ob-ic-star { width: 34px; height: 34px; flex-shrink: 0; border-radius: var(--tap-r-full); background: rgba(255,255,255,.16); display: grid; place-items: center; }
.tap-ob-inner-circle strong { display: block; font-family: 'Fraunces', Georgia, serif; font-size:calc(0.9375 * var(--tap-fs)); color: #c8952a; }
.tap-ob-inner-circle span { display: block; font-family: 'Plus Jakarta Sans', sans-serif; font-size:calc(0.7188 * var(--tap-fs)); color: rgba(255,255,255,.82); margin-top: 2px; line-height: 1.4; }
.tap-ob-cta {
	display: block; width: 100%; padding: 14px; border: none; cursor: pointer;
	background: var(--tap-purple, #6109be); color: #fff; border-radius: var(--tap-r-full);
	font-family: 'Plus Jakarta Sans', sans-serif; font-size:calc(0.9063 * var(--tap-fs)); font-weight: 700;
	box-shadow: 0 8px 20px rgba(97,9,190,.24);
}
.tap-ob-cta:hover { background: #42077f; }

/* ---- Wishlist tab ---- */
.tap-wl-grid { display: grid; gap: 14px; }
.tap-wl-card {
	display: flex; background: #fff; border: 1px solid #ede6da; border-radius: var(--tap-r-xl);
	overflow: hidden; box-shadow: 0 2px 12px rgba(66,7,127,.06);
}
.tap-wl-art { width: 96px; flex-shrink: 0; position: relative; }
.tap-wl-art img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tap-wl-art-grad { display: grid; place-items: center; font-size:calc(1.875 * var(--tap-fs)); background: linear-gradient(140deg, var(--tap-purple, #6109be), #9d4edd); min-height: 96px; }
.tap-wl-body { flex: 1; padding: 13px 14px; }
.tap-wl-kind { display: inline-block; font-size:calc(0.625 * var(--tap-fs)); font-weight: 700; color: var(--tap-purple, #6109be); background: #f3ecfd; padding: 2px 8px; border-radius: var(--tap-r-full); }
.tap-wl-name { font-family: 'Fraunces', Georgia, serif; font-size:calc(0.9688 * var(--tap-fs)); font-weight: 600; color: #241832; margin-top: 7px; line-height: 1.2; }
.tap-wl-temple { font-size:calc(0.75 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin-top: 3px; }
.tap-wl-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 10px; }
.tap-wl-price { font-family: 'Fraunces', Georgia, serif; font-size:calc(1 * var(--tap-fs)); font-weight: 700; color: var(--tap-purple, #6109be); }
.tap-wl-rm { background: none; border: none; padding: 2px 4px; cursor: pointer; font-size:calc(1.125 * var(--tap-fs)); color: var(--tap-marigold, #f99000); line-height: 1; }

/* ---- Notifications tab ---- */
.tap-notif-list { display: grid; gap: 12px; }
.tap-notif-card {
	display: flex; gap: 12px; background: #fff; border: 1px solid #ede6da;
	border-radius: var(--tap-r-xl); padding: 14px; box-shadow: 0 2px 12px rgba(66,7,127,.06);
}
.tap-notif-card.tap-tapable { cursor: pointer; }
.tap-notif-card.tap-tapable:hover { box-shadow: 0 8px 28px rgba(66,7,127,.12); }
.tap-notif-ic { width: 40px; height: 40px; flex-shrink: 0; border-radius: 11px; background: #f3ecfd; display: grid; place-items: center; font-size:calc(1.125 * var(--tap-fs)); }
.tap-notif-body { flex: 1; min-width: 0; }
.tap-notif-title { font-size:calc(0.875 * var(--tap-fs)); font-weight: 700; color: #241832; }
.tap-notif-txt { font-size:calc(0.7813 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin-top: 2px; line-height: 1.4; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.tap-notif-time { font-size:calc(0.7188 * var(--tap-fs)); color: #9c8fa8; margin-top: 5px; }

/* ══════════ v6.9.10 — QA round 3 ══════════ */

/* Alerts (QA #4): dismissible cards + unread accent. */
.tap-notif-card { position: relative; }
.tap-notif-card.is-unread { border-color: var(--tap-purple, #6109be); background: linear-gradient(0deg, rgba(97,9,190,.03), rgba(97,9,190,.03)), #fff; }
.tap-notif-card.is-unread::before { content: ''; position: absolute; left: -1px; top: 14px; bottom: 14px; width: 3px; border-radius: 3px; background: var(--tap-purple, #6109be); }
.tap-notif-x { position: absolute; top: 8px; right: 10px; background: none; border: none; font-size:calc(1.0625 * var(--tap-fs)); line-height: 1; color: #c9bfd6; cursor: pointer; padding: 4px; transition: color var(--dur-fast, .15s); }
.tap-notif-x:hover { color: var(--tap-err, #c0392b); }
.tap-notif-card .tap-notif-body { padding-right: 18px; }

/* Booking page (QA #5): active concern chip. */
.tap-search-sug.is-on { background: var(--tap-purple, #6109be); color: #fff; border-color: var(--tap-purple, #6109be); }

/* Support tab (QA #1): two-channel helpdesk. */
.tap-sup-hero { display: flex; gap: 14px; align-items: center; background: var(--tap-purple-pale, #f0e8fd); border-radius: var(--tap-radius, 16px); padding: 16px 18px; margin-bottom: 14px; }
.tap-sup-hero-ic { width: 48px; height: 48px; flex-shrink: 0; border-radius: var(--tap-r-lg); background: #fff; display: grid; place-items: center; font-size:calc(1.5 * var(--tap-fs)); box-shadow: 0 2px 10px rgba(66,7,127,.10); }
.tap-sup-channels { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; margin-bottom: 14px; }
/* v6.9.15: Support channel cards polished — icon chip, arrow affordance, lift. */
.tap-sup-chan { position: relative; display: flex; flex-direction: column; align-items: flex-start; gap: 9px; text-align: left; background: #fff; border: 1.5px solid var(--tap-line, #ece6f2); border-radius: var(--tap-r-2xl); padding: 16px 46px 16px 16px; cursor: pointer; font: inherit; transition: transform var(--dur-fast, .15s), border-color var(--dur-fast, .15s), box-shadow var(--dur-fast, .15s); }
.tap-sup-chan:hover { transform: translateY(-2px); border-color: var(--tap-purple, #6109be); box-shadow: 0 8px 24px rgba(97,9,190,.14); }
.tap-sup-chan.is-on { border-color: var(--tap-purple, #6109be); background: var(--tap-purple-pale, #f0e8fd); }
.tap-sup-chan::after { content: '→'; position: absolute; right: 15px; top: 16px; color: var(--tap-purple, #6109be); font-weight: 800; font-size:calc(1 * var(--tap-fs)); opacity: .5; transition: transform var(--dur-fast, .15s), opacity var(--dur-fast, .15s); }
.tap-sup-chan:hover::after { transform: translateX(3px); opacity: 1; }
.tap-sup-chan-ic { width: 42px; height: 42px; flex-shrink: 0; border-radius: 13px; background: var(--tap-purple-pale, #f0e8fd); display: grid; place-items: center; font-size:calc(1.3125 * var(--tap-fs)); }
.tap-sup-chan-t { font-weight: 800; font-size:calc(0.9375 * var(--tap-fs)); color: var(--tap-ink, #241832); }
.tap-sup-chan-s { font-size:calc(0.7813 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); line-height: 1.4; }

/* v6.9.13 (#Support): Help Center + FAQ accordion, and a readable centred column
   on desktop so the Support tab stops stretching the full width. --tap-support-maxw
   is admin-overridable business logic; 720px reads well on a laptop. */
.tap-sup-help { margin-top: 22px; }
.tap-sup-help-h { margin: 0 0 4px; font-size:calc(1.125 * var(--tap-fs)); color: var(--tap-chocolate, #3a2b1e); }
.tap-sup-faq-h { font-weight: 800; font-size:calc(0.875 * var(--tap-fs)); color: var(--tap-ink, #241832); margin: 10px 0 8px; }
.tap-faq-item { border: 1px solid var(--tap-line, #ece6f2); border-radius: var(--tap-r-lg); background: #fff; margin: 0 0 8px; overflow: hidden; transition: border-color var(--dur-fast, .15s), box-shadow var(--dur-fast, .15s); }
.tap-faq-item:hover { box-shadow: 0 4px 16px rgba(36,24,50,.06); }
.tap-faq-item[open] { border-color: var(--tap-purple, #6109be); box-shadow: 0 4px 16px rgba(97,9,190,.10); }
.tap-faq-q { list-style: none; cursor: pointer; padding: 14px 50px 14px 16px; font-weight: 700; font-size:calc(0.875 * var(--tap-fs)); color: var(--tap-ink, #241832); position: relative; }
.tap-faq-q::-webkit-details-marker { display: none; }
.tap-faq-q::after { content: '+'; position: absolute; right: 12px; top: 50%; transform: translateY(-50%); width: 25px; height: 25px; border-radius: var(--tap-r-xs); background: var(--tap-purple-pale, #f0e8fd); color: var(--tap-purple, #6109be); font-weight: 700; font-size:calc(1.0625 * var(--tap-fs)); display: grid; place-items: center; line-height: 1; }
.tap-faq-item[open] .tap-faq-q::after { content: '−'; background: var(--tap-purple, #6109be); color: #fff; }
.tap-faq-a { padding: 0 15px 14px; font-size:calc(0.8438 * var(--tap-fs)); line-height: 1.65; color: var(--tap-muted, #6b5b78); }
@media (min-width: 1024px) {
	:root { --tap-support-maxw: 720px; }
	.tap-sup-hero, .tap-sup-channels, .tap-ticket-new, .tap-sup-help,
	.tap-dash-content .tap-empty { max-width: var(--tap-support-maxw, 720px); margin-left: auto; margin-right: auto; }
}

/* Family tab (QA #3): structured member cards. 180px columns forced every
   name to wrap and stacked the action buttons — the card needs room for a
   name line plus two side-by-side actions. */
.tap-family-grid { grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); }
.tap-family-actions .tap-btn { padding: 7px 13px; font-size:calc(0.7813 * var(--tap-fs)); }
.tap-family-top { display: flex; gap: 12px; align-items: flex-start; }
.tap-family-avatar { width: 42px; height: 42px; flex-shrink: 0; border-radius: 50%; background: var(--tap-purple-pale, #f0e8fd); color: var(--tap-purple, #6109be); display: grid; place-items: center; font-weight: 800; font-size:calc(1.0625 * var(--tap-fs)); font-family: 'Fraunces', Georgia, serif; }
.tap-family-card.primary .tap-family-avatar { background: #fff4e0; color: var(--tap-marigold, #f99000); }
.tap-family-id { flex: 1; min-width: 0; }
.tap-family-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--tap-line, #ece6f2); }
.tap-family-card { padding-right: 34px; }
.tap-fam-addrow { display: grid; grid-template-columns: 1.3fr 1fr 1fr 32px; gap: 8px; align-items: center; margin-bottom: 8px; }
@media (max-width: 540px) {
	.tap-fam-addrow { grid-template-columns: 1fr 1fr 28px; }
	.tap-fam-addrow > input:first-child { grid-column: 1 / -1; }
}

/* v6.9.11 — extra-members quantity row (booking page, group pujas). */
.tap-xm-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 10px 0; padding: 12px 14px; border: 1.5px solid var(--tap-line, #ece6f2); border-radius: var(--tap-radius-sm, 12px); background: #fff; }
.tap-xm-lbl { font-size:calc(0.875 * var(--tap-fs)); font-weight: 700; color: var(--tap-ink, #241832); }
.tap-extra-total { font-size:calc(0.8438 * var(--tap-fs)); margin-top: 6px; color: var(--tap-ink, #241832); }

/* v6.9.11 — sankalp invitation card on the booking-success screen. */
.tap-snk-invite { text-align: left; background: var(--tap-purple-pale, #f0e8fd); border: 1.5px solid rgba(97, 9, 190, .18); border-radius: var(--tap-radius, 16px); padding: 16px 18px; margin-top: 14px; }
.tap-snk-invite-t { font-weight: 800; font-size:calc(1 * var(--tap-fs)); color: var(--tap-ink, #241832); margin-bottom: 4px; }
.tap-snk-invite-p { font-size:calc(0.8438 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin: 0 0 4px; }
.tap-snk-invite-d { font-size:calc(0.7813 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin: 0 0 10px; }

/* Profile hub (dashboard architecture): stats are shortcuts now. */
.tap-phub-stat.tap-tapable { cursor: pointer; border-radius: var(--tap-r-md); transition: background var(--dur-fast, .15s); }
.tap-phub-stat.tap-tapable:hover { background: rgba(255,255,255,.12); }
.tap-phub-stat.tap-tapable:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

@media (prefers-reduced-motion: reduce) {
	.tap-splash, .tap-onboard, .tap-splash-inner, .tap-splash-logo { animation: none !important; transition: none !important; }
}

/* ---- Bottom sheet + Modify/Upgrade (demo parity: UpgradeSheet) ---- */
/* v6.9.15: modernised mobile bottom sheet — backdrop blur, safe-area inset,
   stronger lift, bigger grip touch target. */
.tap-sheet-overlay {
	position: fixed; inset: 0; z-index: 99997; background: rgba(28,18,44,.52);
	-webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
	display: flex; align-items: flex-end; justify-content: center; animation: tapSplashFade .2s ease;
}
.tap-sheet {
	width: 100%; max-width: 480px; background: var(--tap-card, #fff); border-radius: 28px 28px 0 0;
	padding: 8px 20px calc(24px + env(safe-area-inset-bottom, 0px)); max-height: 88vh; overflow-y: auto;
	box-shadow: 0 -10px 44px rgba(28,18,44,.20);
	-webkit-overflow-scrolling: touch;
	animation: tapSheetRise .32s cubic-bezier(.22,1,.36,1);
}
@keyframes tapSheetRise { from { opacity: 0; transform: translateY(100%); } to { opacity: 1; transform: none; } }
.tap-sheet-grip { width: 40px; height: 5px; border-radius: 3px; background: #ded5ea; margin: 8px auto 16px; }
.tap-sheet-title { font-family: 'Fraunces', Georgia, serif; font-size:calc(1.1875 * var(--tap-fs)); font-weight: 600; color: #241832; margin: 0 0 14px; }
.tap-sheet-note { font-size:calc(0.8125 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin: 0 0 16px; line-height: 1.5; }
.tap-sheet-fine {
	display: flex; gap: 8px; align-items: flex-start; font-size:calc(0.75 * var(--tap-fs)); color: #42077f;
	background: #f3ecfd; border-radius: var(--tap-r-lg); padding: 11px 13px; margin: 0 0 18px; line-height: 1.4;
}
.tap-upg-opts { display: grid; gap: 10px; margin-bottom: 16px; }
.tap-upg-opt {
	display: flex; align-items: center; gap: 12px; width: 100%; text-align: left; cursor: pointer;
	background: #fff; border: 1px solid #ede6da; border-radius: var(--tap-r-xl); padding: 13px 14px;
	font-family: inherit; transition: border-color .15s ease, box-shadow .15s ease;
}
.tap-upg-opt:hover { box-shadow: 0 2px 12px rgba(66,7,127,.08); }
.tap-upg-opt.is-sel { border: 1.5px solid var(--tap-purple, #6109be); box-shadow: 0 2px 12px rgba(97,9,190,.12); }
.tap-upg-opt-ic { width: 40px; height: 40px; flex-shrink: 0; border-radius: 11px; background: #f3ecfd; display: grid; place-items: center; font-size:calc(1.125 * var(--tap-fs)); }
.tap-upg-opt-body { flex: 1; min-width: 0; }
.tap-upg-opt-lb { display: block; font-size:calc(0.875 * var(--tap-fs)); font-weight: 700; color: #241832; }
.tap-upg-opt-nt { display: block; font-size:calc(0.75 * var(--tap-fs)); color: var(--tap-muted, #6b5b78); margin-top: 1px; }
.tap-upg-opt-pr { font-family: 'Fraunces', Georgia, serif; font-size:calc(0.9375 * var(--tap-fs)); font-weight: 700; color: var(--tap-purple, #6109be); flex-shrink: 0; }
.tap-btn-soft { background: #f3ecfd !important; color: var(--tap-purple, #6109be) !important; border: 1px solid #e6d8fa !important; }

/* ---- v4.9.34 QA fixes: inline checkout errors, coupon messages, footer ---- */

/* Toasts must sit above EVERY overlay (sheets are 99997/99998) so errors
   are never hidden behind a modal — part of the BUG-01 silent-failure fix. */
.tap-toast { z-index: 100001 !important; }

/* Inline dismissible error banner inside checkout (QA BUG-01). */
.tap-inline-error {
	display: flex; align-items: flex-start; gap: 10px;
	background: #fdecec; border: 1px solid #f5b8b8; color: #a12626;
	border-radius: var(--tap-r-lg); padding: 12px 14px; margin: 0 0 12px;
	font-size:calc(0.8438 * var(--tap-fs)); font-weight: 600; line-height: 1.45;
	animation: tapSlideUp .2s ease;
}
.tap-inline-error-txt { flex: 1; min-width: 0; }
.tap-inline-error-x {
	background: none; border: none; cursor: pointer; padding: 0 2px;
	color: #a12626; font-size:calc(0.875 * var(--tap-fs)); line-height: 1; flex-shrink: 0;
}

/* Real coupon validation states (QA BUG-02). */
.tap-coupon-ok  { color: var(--tap-ok); font-weight: 700; font-size:calc(0.8125 * var(--tap-fs)); margin-top: 6px; }
.tap-coupon-err { color: var(--tap-err); font-weight: 700; font-size:calc(0.8125 * var(--tap-fs)); margin-top: 6px; }

/* ---- Site footer (QA BUG-10) ---- */
.tap-site-footer {
	background: #241832; color: rgba(255,255,255,.82);
	margin-top: 40px; padding: 30px 20px calc(30px + var(--nav-h, 64px));
	font-family: 'Plus Jakarta Sans', sans-serif;
}
@media (min-width: 1024px) { .tap-site-footer { padding-bottom: 34px; } }
.tap-footer-inner { max-width: 1024px; margin: 0 auto; display: grid; gap: 18px; }
.tap-footer-brand { display: flex; align-items: center; gap: 12px; }
.tap-footer-logo {
	width: 44px; height: 44px; border-radius: var(--tap-r-lg); flex-shrink: 0;
	background: rgba(255,255,255,.1); display: grid; place-items: center; font-size:calc(1.375 * var(--tap-fs));
}
.tap-footer-brand strong { display: block; font-family: 'Fraunces', Georgia, serif; font-size:calc(1.0625 * var(--tap-fs)); color: #fff; }
.tap-footer-brand span { display: block; font-size:calc(0.75 * var(--tap-fs)); color: rgba(255,255,255,.6); margin-top: 2px; }
.tap-footer-links { display: flex; flex-wrap: wrap; gap: 8px 18px; }
.tap-footer-links a { color: rgba(255,255,255,.78); text-decoration: none; font-size:calc(0.8125 * var(--tap-fs)); font-weight: 600; }
.tap-footer-links a:hover { color: var(--tap-marigold, #f99000); }
.tap-footer-contact a { color: rgba(255,255,255,.78); text-decoration: none; font-size:calc(0.8125 * var(--tap-fs)); }
.tap-footer-contact a:hover { color: var(--tap-marigold, #f99000); }
.tap-footer-copy { font-size:calc(0.75 * var(--tap-fs)); color: rgba(255,255,255,.5); border-top: 1px solid rgba(255,255,255,.12); padding-top: 14px; }

/* ---- v4.9.35: Global TOP STATUS STRIP (demo parity, mobile/tablet) ---- */
.tap-topstrip {
	position: sticky; top: 0; z-index: 800;
	display: flex; align-items: center; justify-content: space-between;
	gap: 12px; padding: 10px 16px;
	background: rgba(251,247,240,.92); backdrop-filter: blur(16px) saturate(160%);
	border-bottom: 1px solid rgba(97,9,190,.08);
}
.admin-bar .tap-topstrip { top: 32px; }
@media (max-width: 782px) { .admin-bar .tap-topstrip { top: 46px; } }
.tap-topstrip-brand { display: flex; align-items: center; gap: 8px; text-decoration: none; min-width: 0; }
.tap-topstrip-logo { height: 30px; width: auto; display: block; }
.tap-topstrip-om {
	width: 32px; height: 32px; flex-shrink: 0; border-radius: var(--tap-r-sm);
	background: linear-gradient(140deg, var(--tap-purple, #6109be), #42077f); color: #fff;
	display: grid; place-items: center; font-size:calc(1.0625 * var(--tap-fs));
}
.tap-topstrip-name {
	font-family: 'Fraunces', Georgia, serif; font-size:calc(1.0313 * var(--tap-fs)); font-weight: 700;
	color: #241832; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.tap-topstrip-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.tap-topstrip-btn {
	position: relative; width: 38px; height: 38px; border-radius: var(--tap-r-md);
	display: grid; place-items: center; color: #42077f;
	background: rgba(97,9,190,.07); text-decoration: none;
}
.tap-topstrip-btn svg { width: 19px; height: 19px; }
.tap-topstrip-btn:active { background: rgba(97,9,190,.14); }
.tap-topstrip-dot {
	position: absolute; top: 7px; right: 8px; width: 8px; height: 8px;
	border-radius: var(--tap-r-full); background: var(--tap-marigold, #f99000); border: 1.5px solid #fbf7f0;
}
/* Desktop already has tap-topnav — hide the strip there. Also avoid a double
   brand row on the homepage, where the hero brand bar plays this role. */
@media (min-width: 1024px) { .tap-topstrip { display: none; } }
body.tap-canvas:has(.tap-home-root) .tap-brandbar { display: none; }

/* ═══════════════ Phase 6 (v5.0.0): CONSULTATION ═══════════════
   Layout obeys the admin's design tokens (DIVSA → Astrologers → Profile
   card design): photo position via .tap-cst-pp-*, photo size .tap-cst-ps-*,
   alignment .tap-cst-al-*, spacing .tap-cst-dn-*, accent via the
   --tap-cst-accent variable. */

.tap-consult-root { --tap-cst-accent: var(--tap-purple, #6109be); --tap-cst-gap: 16px; max-width: 860px; margin: 0 auto; padding: 12px; }
.tap-consult-root.tap-cst-dn-compact, .tap-cst-sheet.tap-cst-dn-compact { --tap-cst-gap: 10px; }

.tap-cst-head { text-align: center; margin: 8px 0 18px; }
.tap-cst-title { font-size:calc(1.5 * var(--tap-fs)); font-weight: 800; color: var(--tap-ink, #1e0a2e); margin: 0 0 4px; }
.tap-cst-sub { color: #6f6480; font-size:calc(0.8438 * var(--tap-fs)); margin: 0; }
.tap-cst-empty { text-align: center; color: #6f6480; padding: 24px 8px; }
.tap-cst-skel { height: 140px; border-radius: var(--tap-r-lg); background: linear-gradient(90deg,#f2eef7 25%,#faf8fd 50%,#f2eef7 75%); background-size: 200% 100%; animation: tapcstsk 1.2s infinite; margin: 10px 0; }
.tap-cst-skel.s { height: 70px; }
@keyframes tapcstsk { from { background-position: 200% 0 } to { background-position: -200% 0 } }

/* Listing grid + cards */
.tap-cst-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: var(--tap-cst-gap); }
.tap-cst-card { background: #fff; border: 1px solid #eae4f2; border-radius: var(--tap-r-xl); padding: var(--tap-cst-gap); cursor: pointer; transition: box-shadow .15s, transform .15s; display: flex; gap: 12px; }
.tap-cst-card:hover, .tap-cst-card:focus-visible { box-shadow: 0 6px 22px rgba(97, 9, 190, .12); transform: translateY(-2px); outline: none; }

/* Photo position tokens */
.tap-cst-pp-top .tap-cst-card, .tap-cst-pp-top .tap-cst-hero { flex-direction: column; align-items: center; }
.tap-cst-pp-left .tap-cst-card, .tap-cst-pp-left .tap-cst-hero { flex-direction: row; align-items: flex-start; }
.tap-cst-pp-right .tap-cst-card, .tap-cst-pp-right .tap-cst-hero { flex-direction: row-reverse; align-items: flex-start; }

/* Alignment tokens */
.tap-cst-al-center .tap-cst-body, .tap-cst-al-center .tap-cst-herobody { text-align: center; }
.tap-cst-al-center .tap-cst-meta, .tap-cst-al-center .tap-cst-chips { justify-content: center; }
.tap-cst-al-left .tap-cst-body, .tap-cst-al-left .tap-cst-herobody { text-align: left; }

/* Photo size tokens */
.tap-cst-photo { border-radius: 50%; overflow: hidden; background: #f2eef7; display: flex; align-items: center; justify-content: center; flex: 0 0 auto; border: 3px solid #fff; box-shadow: 0 2px 10px rgba(30,10,46,.12); }
.tap-cst-ps-sm .tap-cst-photo { width: 56px; height: 56px; }
.tap-cst-ps-md .tap-cst-photo { width: 76px; height: 76px; }
.tap-cst-ps-lg .tap-cst-photo { width: 96px; height: 96px; }
.tap-cst-photo.lg { width: 110px !important; height: 110px !important; }
.tap-cst-photo img { width: 100%; height: 100%; object-fit: cover; }
.tap-cst-ph { font-size:calc(1.875 * var(--tap-fs)); }

.tap-cst-body { flex: 1; min-width: 0; }
.tap-cst-name { font-weight: 800; color: var(--tap-ink, #1e0a2e); font-size:calc(0.9688 * var(--tap-fs)); }
.tap-cst-name.lg { font-size:calc(1.3125 * var(--tap-fs)); margin: 0; }
.tap-cst-role { color: #6f6480; font-size:calc(0.7813 * var(--tap-fs)); margin-top: 2px; }
.tap-cst-meta { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 8px; font-size:calc(0.75 * var(--tap-fs)); }
.tap-cst-presence { display: inline-flex; align-items: center; gap: 5px; font-weight: 700; }
.tap-cst-presence i { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.tap-cst-presence.on { color: #2e7d32; } .tap-cst-presence.on i { background: #2e7d32; box-shadow: 0 0 0 3px rgba(46,125,50,.15); }
.tap-cst-presence.busy { color: #b8860b; } .tap-cst-presence.busy i { background: #b8860b; }
.tap-cst-presence.brk { color: #c76b1e; } .tap-cst-presence.brk i { background: #c76b1e; }
.tap-cst-presence.dnd { color: #b02a37; } .tap-cst-presence.dnd i { background: #b02a37; box-shadow: 0 0 0 3px rgba(176,42,55,.12); }
.tap-cst-presence.off { color: #9a91a8; } .tap-cst-presence.off i { background: #9a91a8; }
.tap-cst-rating { color: #b8860b; font-weight: 700; }
.tap-cst-newbadge { background: #f2eef7; color: #6f6480; font-weight: 700; padding: 1px 8px; border-radius: var(--tap-r-full); font-size:calc(0.6875 * var(--tap-fs)); }
.tap-cst-exp { color: #6f6480; }
.tap-cst-chips { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
.tap-cst-chip { background: #f6f2fb; color: var(--tap-cst-accent); font-size:calc(0.6875 * var(--tap-fs)); font-weight: 700; padding: 3px 9px; border-radius: var(--tap-r-full); }
.tap-cst-from { margin-top: 8px; font-weight: 800; color: var(--tap-cst-accent); font-size:calc(0.875 * var(--tap-fs)); }
.tap-cst-from small { color: #6f6480; font-weight: 500; }
.tap-cst-langs { margin-top: 8px; font-size:calc(0.7813 * var(--tap-fs)); color: #4a3a58; }

/* Profile */
.tap-cst-back { background: none; border: 0; color: var(--tap-cst-accent); font-weight: 700; cursor: pointer; padding: 6px 0; font-size:calc(0.8438 * var(--tap-fs)); }
.tap-cst-hero { display: flex; gap: 16px; background: #fff; border: 1px solid #eae4f2; border-radius: var(--tap-r-2xl); padding: calc(var(--tap-cst-gap) + 4px); margin-top: 6px; }
.tap-cst-bio { background: #fff; border: 1px solid #eae4f2; border-radius: var(--tap-r-lg); padding: var(--tap-cst-gap); margin-top: var(--tap-cst-gap); color: #4a3a58; font-size:calc(0.875 * var(--tap-fs)); line-height: 1.6; }
.tap-cst-ctas { display: flex; flex-direction: column; gap: 10px; margin-top: var(--tap-cst-gap); }
.tap-cst-cta { width: 100%; padding: 13px; border-radius: var(--tap-r-md); font-weight: 800; font-size:calc(0.9375 * var(--tap-fs)); }
.tap-cst-reviews { margin-top: 22px; }
.tap-cst-reviews h2 { font-size:calc(1 * var(--tap-fs)); color: var(--tap-ink, #1e0a2e); }
.tap-cst-review { background: #fff; border: 1px solid #eae4f2; border-radius: var(--tap-r-md); padding: 12px 14px; margin-top: 8px; }
.tap-cst-review-top { font-size:calc(0.75 * var(--tap-fs)); color: #b8860b; font-weight: 700; }
.tap-cst-review-body { font-size:calc(0.8438 * var(--tap-fs)); color: #4a3a58; margin-top: 4px; }

/* Bottom sheet (Zomato-style) */
.tap-cst-overlay { position: fixed; inset: 0; background: rgba(20, 8, 32, .55); z-index: 99990; display: flex; align-items: flex-end; justify-content: center; animation: tapcstfade .18s; }
@keyframes tapcstfade { from { opacity: 0 } to { opacity: 1 } }
.tap-cst-sheet { background: #fff; width: 100%; max-width: 560px; max-height: 88vh; overflow: auto; border-radius: 22px 22px 0 0; animation: tapcstup .22s ease-out; --tap-cst-accent: var(--tap-purple, #6109be); --tap-cst-gap: 16px; }
@keyframes tapcstup { from { transform: translateY(40px); } to { transform: none; } }
.tap-cst-sheet-head { position: sticky; top: 0; background: #fff; display: flex; justify-content: space-between; align-items: center; padding: 14px 18px; border-bottom: 1px solid #f0ebf7; z-index: 2; }
.tap-cst-sheet-title { font-weight: 800; color: var(--tap-ink, #1e0a2e); font-size:calc(0.9688 * var(--tap-fs)); }
.tap-cst-sheet-x { background: #f2eef7; border: 0; border-radius: 50%; width: 30px; height: 30px; cursor: pointer; font-size:calc(0.8125 * var(--tap-fs)); color: #4a3a58; }
.tap-cst-sheet-body { padding: 14px 18px 22px; }
.tap-cst-label { font-size:calc(0.75 * var(--tap-fs)); font-weight: 800; text-transform: uppercase; letter-spacing: .04em; color: #6f6480; margin: 14px 0 8px; }
.tap-cst-chiprow { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 4px; -webkit-overflow-scrolling: touch; }
.tap-cst-daychip { flex: 0 0 auto; background: #faf8fd; border: 1.5px solid #e6def2; border-radius: var(--tap-r-md); padding: 9px 14px; font-size:calc(0.8125 * var(--tap-fs)); font-weight: 700; color: #4a3a58; cursor: pointer; text-align: center; line-height: 1.35; }
.tap-cst-daychip b { color: var(--tap-cst-accent); }
.tap-cst-daychip.sel { border-color: var(--tap-cst-accent); background: #f6f0fd; color: var(--tap-cst-accent); }
.tap-cst-timegrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(88px, 1fr)); gap: 8px; }
.tap-cst-time { background: #faf8fd; border: 1.5px solid #e6def2; border-radius: var(--tap-r-sm); padding: 9px 4px; font-size:calc(0.8125 * var(--tap-fs)); font-weight: 700; color: #4a3a58; cursor: pointer; }
.tap-cst-time.sel { border-color: var(--tap-cst-accent); background: var(--tap-cst-accent); color: #fff; }
.tap-cst-confirm { width: 100%; margin-top: 18px; padding: 14px; border-radius: var(--tap-r-md); font-weight: 800; font-size:calc(0.9375 * var(--tap-fs)); }
.tap-cst-confirm:disabled { opacity: .5; cursor: not-allowed; }
.tap-cst-input { width: 100%; border: 1.5px solid #e6def2; border-radius: var(--tap-r-sm); padding: 11px 12px; font-size:calc(0.875 * var(--tap-fs)); margin-top: 8px; box-sizing: border-box; }
.tap-cst-input:focus { border-color: var(--tap-cst-accent); outline: none; }
.tap-cst-picked { background: #f6f0fd; color: var(--tap-cst-accent); font-weight: 800; border-radius: var(--tap-r-sm); padding: 10px 12px; font-size:calc(0.8438 * var(--tap-fs)); }
.tap-cst-fine { font-size:calc(0.75 * var(--tap-fs)); color: #6f6480; text-align: center; margin-top: 10px; }

/* Post-payment */
.tap-cst-done { text-align: center; padding: 34px 16px; }
.tap-cst-done-icn { font-size:calc(2.75 * var(--tap-fs)); }
.tap-cst-done h2 { color: var(--tap-ink, #1e0a2e); margin: 10px 0 6px; }
.tap-cst-done-sub { color: #6f6480; font-size:calc(0.875 * var(--tap-fs)); max-width: 420px; margin: 0 auto 18px; }

@media (min-width: 640px) { .tap-cst-overlay { align-items: center; } .tap-cst-sheet { border-radius: var(--tap-r-4xl); } .tap-cst-ctas { flex-direction: row; } }

/* ═══════════════ v5.0.1 (frontend audit): DESKTOP LAYOUT ═══════════════
   Fix: the app rendered as one phone-width column on laptops. On ≥1024px
   the booking + consult surfaces now use a proper desktop canvas: wide
   centered container, comfortable reading column for detail sections,
   multi-column catalogue (the grid was already fluid — it just needed
   room), app-style centered sticky bar, and centered dialogs. Purely
   additive: nothing below 1024px changes. */

@media (min-width: 1024px) {
	.tap-booking-root,
	.tap-consult-root { max-width: 1160px; margin-left: auto; margin-right: auto; padding-left: 24px; padding-right: 24px; }

	/* Detail-page sections read best in a centered column; the catalogue
	   grid, brand bar and promo sliders keep the full canvas. */
	.tap-booking-root > .tap-section,
	.tap-booking-root > .tap-family-panel,
	.tap-booking-root > .tap-guest-note,
	.tap-booking-root > .tap-coupon-row { max-width: 840px; margin-left: auto; margin-right: auto; }

	/* Hero media: cinematic, not phone-tall. */
	.tap-booking-root .tap-hero-img,
	.tap-booking-root .tap-hero img { max-height: 420px; object-fit: cover; border-radius: var(--tap-r-4xl); }

	/* Sticky CTA becomes an app-style centered dock instead of an
	   edge-to-edge phone bar. */
	.tap-sticky { left: 50%; right: auto; transform: translateX(-50%); width: 100%; max-width: 880px; border-radius: 18px 18px 0 0; padding: 12px 22px 14px; }

	/* Dialogs center on desktop (they are bottom sheets on phones). */
	.tap-modal-wrap { align-items: center; }
	.tap-modal { border-radius: var(--tap-radius-xl); animation: tapModalIn var(--dur-std) ease-out; }

	/* Consult: roomier grid + hero on big screens. */
	.tap-consult-root .tap-cst-grid { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); }
	.tap-cst-hero { padding: 26px; }
	.tap-cst-ctas { max-width: 640px; }
}

@keyframes tapModalIn { from { transform: translateY(16px); opacity: .7; } to { transform: none; opacity: 1; } }

/* Very large screens: keep line lengths sane. */
@media (min-width: 1440px) {
	.tap-booking-root, .tap-consult-root { max-width: 1240px; }
}

/* ── v6.5.0 — single-date bar + admin-placed closing countdown ────────
   Every colour below resolves to a brand custom property, so the admin's
   customizer still owns the palette. Nothing here is a fixed hex.       */
.tap-datebar{background:var(--tap-gold-light);border-radius:var(--tap-radius);padding:16px 18px;border:1px solid var(--tap-line)}
.tap-datebar h2{margin-bottom:10px}
.tap-datebar-row{display:flex;align-items:center;gap:10px}
.tap-datebar-ic{font-size:calc(1.25 * var(--tap-fs));line-height:1;flex-shrink:0}
.tap-datebar-txt{font-size:calc(0.9688 * var(--tap-fs));font-weight:800;color:var(--tap-ink);font-family:Fraunces,Georgia,serif;letter-spacing:-.01em}
.tap-datebar-seats{margin-top:6px;font-size:calc(0.7813 * var(--tap-fs));font-weight:700;color:var(--tap-ok)}
.tap-datebar .tap-countdown-live{margin-top:10px}
.tap-cd-hero{padding:10px 2px 0;display:flex;justify-content:center}
.tap-countdown-long{font-family:inherit;font-size:calc(0.875 * var(--tap-fs));font-weight:800;letter-spacing:.01em;padding:7px 14px;border-radius:var(--tap-radius-sm);display:inline-flex;align-items:center;gap:6px}
.tap-sticky .tap-countdown-long{align-self:center;margin:0 0 6px;font-size:calc(0.7813 * var(--tap-fs));padding:4px 10px}
@media (max-width:400px){.tap-countdown-long{font-size:calc(0.7813 * var(--tap-fs));padding:6px 10px}}

/* ── v6.5.0 Phase 2 — semantic tokens ────────────────────────────────
   These values used to sit as raw hex inside inline styles in the SPA,
   which meant the brand customizer could never reach them. They are now
   real custom properties: the defaults below reproduce the shipped look
   exactly, and anything the admin sets later simply overrides them.     */
:root{
  --tap-notice-bg:#fff8e8; --tap-notice-fg:#7a5200; --tap-notice-fg2:#9a7a4a;
  --tap-warn-bg:#fff4e7;   --tap-warn-fg:#854f0b;
  --tap-ok-bg:#f4fff7;     --tap-star:#f5a623;
  --tap-prompt-fg:#8a7a5c; --tap-wa:#25d366;
  --tap-soft-bg:#faf7ff;   --tap-soft-bg2:#faf6ff;  --tap-soft-bg3:#f6f3fa;
  --tap-grey:#6b6b6b;      --tap-grey-dark:#2b2b2b;
}

/* ==========================================================================
   v6.9.27 — ACCESSIBILITY (TAP-M-010)

   Applied at the design-system level so every screen inherits them rather
   than each component remembering. Scoped under .tap-root / .tap-app so
   nothing outside a DIVSA surface is touched (the v6.6.4 lesson: three rules
   that targeted bare `html` once restyled the host theme site-wide).
   ========================================================================== */

/* --- WCAG 2.2 SC 2.5.8 Target Size (Minimum) ------------------------------
   Interactive controls must be at least 24x24 CSS px. The app is used one-
   handed, on a phone, often by older devotees, so the floor here is the
   24px the spec requires — reached via min-height/width rather than padding
   so it cannot be undone by a component's own padding reset. Icon-only
   controls (the sheet ✕, steppers, chips) were the ones actually below it. */
.tap-root button,
.tap-root [role="button"],
.tap-root a.tap-btn,
.tap-root input[type="checkbox"],
.tap-root input[type="radio"],
.tap-app .tap-bsheet-x,
.tap-app .tap-pg-x {
  min-height: 24px;
  min-width: 24px;
}
/* Primary actions get the comfortable 44px touch target (iOS HIG / Android
   48dp), which is what the money-path buttons should have been all along. */
.tap-root .tap-btn,
.tap-root .tap-btn-cta,
.tap-root .tap-sheet-trigger,
.tap-app .tap-bsheet-done {
  min-height: 44px;
}

/* --- Skip link (WCAG 2.4.1 Bypass Blocks) ---------------------------------
   Keyboard and screen-reader devotees had to tab through the entire header
   and nav on every page before reaching the booking flow. Visually hidden
   until focused, then pinned top-left. */
.tap-skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 100000;
  padding: 12px 18px;
  background: var(--tap-purple, #6109be);
  color: #fff;
  font-weight: 700;
  border-radius: 0 0 10px 0;
  text-decoration: none;
}
.tap-skip-link:focus,
.tap-skip-link:focus-visible {
  left: 0;
  outline: 3px solid #fff;
  outline-offset: -6px;
}

/* --- Focus visibility on the disclosure triggers --------------------------
   These carry aria-expanded now, so they must also LOOK focused. */
.tap-root .tap-sheet-trigger:focus-visible {
  outline: 3px solid var(--tap-purple, #6109be);
  outline-offset: 2px;
}

/* A dialog focused programmatically (no focusable child) must not show a
   stray outline — the trap gives it tabindex="-1" purely to receive focus. */
.tap-root [role="dialog"][tabindex="-1"]:focus {
  outline: none;
}

/* --- Reduced motion ------------------------------------------------------
   The app already honours this in several places; make it the default for
   anything that animates, so a new component cannot regress it. */
@media (prefers-reduced-motion: reduce) {
  .tap-root *,
  .tap-root *::before,
  .tap-root *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

/* v6.9.84 — itemised bill lines + the savings row.
   Sub-rows are add-on line items under the add-ons total: indented and muted
   so they read as detail, not as separate charges competing with the main
   amounts. The savings row is the only positive number on the bill, so it
   uses the OK tone rather than the accent (which every CTA already owns). */
.tap-sumrow-sub{padding-left:12px}
.tap-sumrow-sub .tap-summeta{font-size:calc(0.7813 * var(--tap-fs))}
.tap-sumsaved{color:var(--tap-ok,#0f7b4f); font-weight:700}
@media (max-width: 320px) {
  .tap-slot-urgent { position: static; display: inline-block; margin-top: 4px; }
  .tap-pcard { width: 100% !important; }
}

@media (max-width: 360px) {
  .tap-member-grid,
  .tap-sankalp-grid { grid-template-columns: 1fr; }
}

/* ======================================================================
 * v7.3.0 — Scheduled consultation profile + same-page review/payment.
 * This extends the existing consultation design system; it does not add
 * realtime chat, per-minute billing or a second frontend framework.
 * ====================================================================== */
.tap-cst-eyebrow { display:inline-flex; align-items:center; gap:6px; margin-bottom:7px; color:var(--tap-cst-accent); font-size:calc(0.6875 * var(--tap-fs)); font-weight:800; letter-spacing:.09em; text-transform:uppercase; }
.tap-cst-badge-row { display:flex; flex-wrap:wrap; gap:5px; margin:5px 0; }
.tap-cst-methods { display:flex; flex-wrap:wrap; gap:6px; margin-top:9px; }
.tap-cst-method-chip { display:inline-flex; align-items:center; min-height:28px; padding:4px 9px; border:1px solid #e6def2; border-radius:999px; background:#fff; color:#4a3a58; font-size:calc(0.6875 * var(--tap-fs)); font-weight:700; }
.tap-cst-card-actions { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px; margin-top:13px; }
.tap-cst-card-actions > :only-child { grid-column:1/-1; }
.tap-cst-card-action { min-height:42px; padding:9px 10px; white-space:normal; line-height:1.2; }
.tap-cst-state-card { max-width:560px; margin:24px auto; padding:30px 20px; border:1px solid #eae4f2; border-radius:var(--tap-r-xl); background:#fff; text-align:center; }
.tap-cst-state-card h2 { margin:7px 0; font-size:calc(1.125 * var(--tap-fs)); }
.tap-cst-state-card p { color:#6f6480; }
.tap-cst-state-icon { font-size:calc(2.375 * var(--tap-fs)); }

.tap-cst-profile-hero { align-items:center; background:linear-gradient(145deg,#fff 0%,#fbf8ff 100%); }
.tap-cst-stat-grid { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; margin-top:14px; }
.tap-cst-stat { min-width:0; padding:13px 8px; border:1px solid #eae4f2; border-radius:var(--tap-r-md); background:#fff; text-align:center; }
.tap-cst-stat strong,.tap-cst-stat span { display:block; }
.tap-cst-stat strong { color:var(--tap-cst-accent); font-size:calc(1.125 * var(--tap-fs)); line-height:1.15; }
.tap-cst-stat span { margin-top:4px; color:#6f6480; font-size:calc(0.6563 * var(--tap-fs)); line-height:1.25; }
.tap-cst-profile-sections { display:grid; gap:13px; margin-top:14px; }
.tap-cst-profile-section,.tap-cst-profile-sections > .tap-cst-gallery { margin:0; padding:17px; border:1px solid #eae4f2; border-radius:var(--tap-r-lg); background:#fff; }
.tap-cst-profile-section h2 { margin:0 0 9px; color:var(--tap-ink,#1e0a2e); font-size:calc(1 * var(--tap-fs)); }
.tap-cst-profile-section p,.tap-cst-richtext { margin:0; color:#4a3a58; font-size:calc(0.875 * var(--tap-fs)); line-height:1.65; }
.tap-cst-credential-list { margin:0; padding-left:20px; color:#4a3a58; }
.tap-cst-credential-list li + li { margin-top:5px; }
.tap-cst-section-note { color:#6f6480!important; font-size:calc(0.7813 * var(--tap-fs))!important; }
.tap-cst-package-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(112px,1fr)); gap:9px; margin-top:13px; }
.tap-cst-package-card { position:relative; display:grid; gap:4px; min-height:82px; padding:14px 10px; border:1.5px solid #e6def2; border-radius:var(--tap-r-md); background:#fff; color:var(--tap-ink,#1e0a2e); cursor:pointer; text-align:left; }
.tap-cst-package-card strong { font-size:calc(0.9375 * var(--tap-fs)); }
.tap-cst-package-card > span:not(.tap-cst-recommended) { color:var(--tap-cst-accent); font-size:calc(0.9375 * var(--tap-fs)); font-weight:800; }
.tap-cst-package-card:hover,.tap-cst-package-card:focus-visible { border-color:var(--tap-cst-accent); outline:3px solid color-mix(in srgb,var(--tap-cst-accent) 18%,transparent); }
.tap-cst-package-card.recommended { border-color:color-mix(in srgb,var(--tap-cst-accent) 50%,#e6def2); background:#fbf8ff; }
.tap-cst-recommended { position:absolute; top:-9px; right:8px; padding:2px 7px; border-radius:999px; background:var(--tap-cst-accent); color:#fff; font-size:calc(0.5625 * var(--tap-fs)); font-weight:800; text-transform:uppercase; }
.tap-cst-profile-actions { position:relative; z-index:1; padding:10px; border:1px solid #eae4f2; border-radius:var(--tap-r-lg); background:#fff; box-shadow:0 8px 22px rgba(30,10,46,.08); }

.tap-cst-mini-profile { display:flex; align-items:center; gap:11px; padding:11px; border:1px solid #ebe4f3; border-radius:var(--tap-r-md); background:#fbf9fd; }
.tap-cst-mini-profile img,.tap-cst-mini-avatar { width:48px; height:48px; flex:0 0 48px; border-radius:50%; object-fit:cover; display:flex; align-items:center; justify-content:center; background:#f0eaf6; }
.tap-cst-mini-profile strong,.tap-cst-mini-profile span { display:block; }
.tap-cst-mini-profile > div > span { color:#6f6480; font-size:calc(0.75 * var(--tap-fs)); margin-top:2px; }
.tap-cst-option-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:9px; }
.tap-cst-option-card { display:grid; gap:4px; min-height:76px; padding:12px; border:1.5px solid #e6def2; border-radius:var(--tap-r-md); background:#fff; color:#4a3a58; cursor:pointer; text-align:left; }
.tap-cst-option-card strong { color:var(--tap-ink,#1e0a2e); font-size:calc(0.8125 * var(--tap-fs)); }
.tap-cst-option-card span { font-size:calc(0.6875 * var(--tap-fs)); line-height:1.35; }
.tap-cst-option-card.sel { border-color:var(--tap-cst-accent); background:#f8f2ff; box-shadow:0 0 0 2px color-mix(in srgb,var(--tap-cst-accent) 12%,transparent); }
.tap-cst-inline-state { width:100%; padding:12px; border:1px dashed #d9cee4; border-radius:var(--tap-r-sm); color:#6f6480; background:#faf8fc; font-size:calc(0.7813 * var(--tap-fs)); text-align:center; }
.tap-cst-inline-state.error { border-color:#eab8b3; color:#a23d34; background:#fff5f4; }

.tap-cst-review-body { padding-bottom:calc(26px + env(safe-area-inset-bottom)); }
.tap-cst-form-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; }
.tap-cst-field { display:grid; gap:5px; min-width:0; color:#5f5269; font-size:calc(0.75 * var(--tap-fs)); font-weight:700; }
.tap-cst-field .tap-cst-input { margin:0; min-height:44px; font-size:calc(1 * var(--tap-fs)); }
.tap-cst-review-card { margin-top:14px; padding:14px; border:1px solid #e7dfed; border-radius:var(--tap-r-lg); background:#fff; box-shadow:0 4px 15px rgba(42,20,54,.04); }
.tap-cst-review-card-head { display:flex; justify-content:space-between; gap:12px; align-items:flex-start; margin-bottom:11px; }
.tap-cst-review-card-head strong,.tap-cst-review-card-head span { display:block; }
.tap-cst-review-card-head strong { color:var(--tap-ink,#1e0a2e); font-size:calc(0.875 * var(--tap-fs)); }
.tap-cst-review-card-head span { margin-top:2px; color:#74677d; font-size:calc(0.7188 * var(--tap-fs)); }
.tap-cst-coupon-row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px; }
.tap-cst-coupon-row .tap-cst-input { margin:0; min-height:44px; text-transform:uppercase; }
.tap-cst-offer-list { display:grid; gap:7px; margin-top:10px; }
.tap-cst-offer-chip { display:flex; justify-content:space-between; align-items:center; gap:10px; width:100%; padding:9px 10px; border:1px dashed #cdbbe0; border-radius:var(--tap-r-sm); background:#fbf7ff; color:#4a3a58; cursor:pointer; text-align:left; }
.tap-cst-offer-chip strong { color:var(--tap-cst-accent); }
.tap-cst-offer-chip span { font-size:calc(0.6875 * var(--tap-fs)); }
.tap-cst-coupon-status { min-height:18px; margin-top:8px; font-size:calc(0.75 * var(--tap-fs)); }
.tap-cst-coupon-status.success { color:#287a3d; }
.tap-cst-coupon-status.error { color:#b43d35; }
.tap-cst-summary { display:grid; gap:9px; }
.tap-cst-summary-row { display:flex; justify-content:space-between; align-items:flex-start; gap:18px; color:#6a5d73; font-size:calc(0.8125 * var(--tap-fs)); }
.tap-cst-summary-row strong { color:#2c2032; text-align:right; font-weight:700; }
.tap-cst-summary-row.discount strong { color:#23823b; }
.tap-cst-summary-row.total { margin-top:3px; padding-top:11px; border-top:1px solid #e9e2ee; font-size:calc(1 * var(--tap-fs)); }
.tap-cst-summary-row.total span,.tap-cst-summary-row.total strong { color:var(--tap-ink,#1e0a2e); font-weight:900; }
.tap-cst-wallet-balance { display:flex; justify-content:space-between; gap:12px; margin-bottom:9px; padding:10px 11px; border-radius:var(--tap-r-sm); background:#f6f1fa; color:#6f6480; font-size:calc(0.75 * var(--tap-fs)); }
.tap-cst-wallet-balance strong { color:var(--tap-cst-accent); font-size:calc(0.875 * var(--tap-fs)); }
.tap-cst-payment-methods { display:grid; gap:8px; }
.tap-cst-payment-choice { display:flex; align-items:flex-start; gap:10px; padding:11px; border:1px solid #e7dfed; border-radius:var(--tap-r-sm); cursor:pointer; }
.tap-cst-payment-choice input { width:18px; height:18px; margin:1px 0 0; accent-color:var(--tap-cst-accent); }
.tap-cst-payment-choice strong,.tap-cst-payment-choice span { display:block; }
.tap-cst-payment-choice strong { color:var(--tap-ink,#1e0a2e); font-size:calc(0.8125 * var(--tap-fs)); }
.tap-cst-payment-choice span { margin-top:2px; color:#756a7c; font-size:calc(0.7188 * var(--tap-fs)); }
.tap-cst-payment-choice.disabled { opacity:.55; cursor:not-allowed; }
.tap-cst-add-money { justify-self:start; }
.tap-cst-pay-now { position:sticky; bottom:0; z-index:3; margin-top:14px; box-shadow:0 8px 24px rgba(97,9,190,.22); }
.tap-cst-trust-note { display:flex; align-items:flex-start; gap:8px; margin-top:10px; padding:10px; border-radius:var(--tap-r-sm); background:#f5faf7; color:#52635a; font-size:calc(0.7188 * var(--tap-fs)); line-height:1.45; }
.tap-cst-trust-note p { margin:0; }
.tap-cst-confirm-summary { display:grid; gap:8px; max-width:520px; margin:18px auto; padding:15px; border:1px solid #e7dfed; border-radius:var(--tap-r-lg); background:#fff; text-align:left; }
.tap-cst-done-actions { display:flex; justify-content:center; flex-wrap:wrap; gap:9px; }

@media (max-width:639px) {
  .tap-cst-stat-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
  .tap-cst-form-grid,.tap-cst-option-grid { grid-template-columns:1fr; }
  .tap-cst-card-actions { grid-template-columns:1fr 1fr; }
  .tap-cst-card-actions > :nth-child(3) { grid-column:1/-1; }
}
@media (max-width:359px) {
  .tap-cst-card { padding:12px; gap:10px; }
  .tap-cst-card-actions,.tap-cst-coupon-row { grid-template-columns:1fr; }
  .tap-cst-option-card { min-height:68px; }
  .tap-cst-sheet-body { padding-left:13px; padding-right:13px; }
}
@media (prefers-reduced-motion:reduce) {
  .tap-cst-card,.tap-cst-sheet,.tap-cst-overlay,.tap-cst-package-card,.tap-cst-option-card { animation:none!important; transition:none!important; transform:none!important; }
}

/* v7.3.0 profile information architecture: accessible focused panels. */
.tap-cst-profile-tabs { display:flex; gap:6px; margin-top:15px; padding:5px; overflow-x:auto; border:1px solid #e7dfed; border-radius:var(--tap-r-lg); background:#fff; scrollbar-width:none; }
.tap-cst-profile-tabs::-webkit-scrollbar { display:none; }
.tap-cst-profile-tab { flex:1 0 auto; min-height:42px; padding:8px 14px; border:0; border-radius:var(--tap-r-md); background:transparent; color:#6b5e73; font-weight:750; cursor:pointer; }
.tap-cst-profile-tab.is-active { background:var(--tap-cst-accent); color:#fff; box-shadow:0 4px 12px color-mix(in srgb,var(--tap-cst-accent) 24%,transparent); }
.tap-cst-profile-tab:focus-visible { outline:3px solid color-mix(in srgb,var(--tap-cst-accent) 28%,transparent); outline-offset:2px; }
.tap-cst-profile-panels { margin-top:12px; }
.tap-cst-profile-panel { display:grid; gap:13px; }
.tap-cst-profile-panel[hidden] { display:none!important; }
@media(max-width:359px){.tap-cst-profile-tab{padding:8px 11px;font-size:calc(0.75 * var(--tap-fs))}}

/* v7.3.0 — fixed-duration consultation fulfilment and review states. */
.tap-cst-contact-card{display:grid;gap:12px}
.tap-cst-contact-state{display:flex;align-items:center;gap:8px;min-height:44px;padding:11px 13px;border:1px solid var(--tap-border,#e5dce9);border-radius:12px;background:var(--tap-surface-soft,#faf7fb);color:var(--tap-muted,#6b5b78);font-size:calc(0.8125 * var(--tap-fs));line-height:1.45}
.tap-cst-contact-state.ready{border-color:color-mix(in srgb,var(--tap-success,#16845b) 30%,transparent);background:color-mix(in srgb,var(--tap-success,#16845b) 8%,white);color:var(--tap-success,#126c4b)}
.tap-cst-contact-state.error{border-color:color-mix(in srgb,var(--tap-danger,#b42318) 28%,transparent);background:color-mix(in srgb,var(--tap-danger,#b42318) 7%,white);color:var(--tap-danger,#9f1c15)}
.tap-cst-summary-row.savings{margin-top:2px;padding:8px 10px;border-radius:10px;background:color-mix(in srgb,var(--tap-success,#16845b) 8%,white);color:var(--tap-success,#126c4b)}
.tap-astro-contact{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;padding:10px 11px;border:1px solid var(--tap-border,#e8e0eb);border-radius:10px;background:var(--tap-surface-soft,#faf7fb);font-size:calc(0.75 * var(--tap-fs));color:var(--tap-muted,#6b5b78)}
.tap-astro-contact.available{border-color:color-mix(in srgb,var(--tap-success,#16845b) 28%,transparent);background:color-mix(in srgb,var(--tap-success,#16845b) 7%,white);color:var(--tap-success,#126c4b)}
.tap-astro-contact.missing{border-color:color-mix(in srgb,var(--tap-danger,#b42318) 24%,transparent);background:color-mix(in srgb,var(--tap-danger,#b42318) 6%,white);color:var(--tap-danger,#9f1c15)}
.tap-astro-contact small{display:block;flex-basis:100%;color:inherit;opacity:.82}
.tap-astro-contact .tap-btn{margin-left:auto;text-decoration:none}
@media(max-width:479px){.tap-astro-contact{align-items:stretch}.tap-astro-contact .tap-btn{width:100%;margin-left:0;justify-content:center}.tap-cst-contact-state{align-items:flex-start}}

/* v7.3.0 — consultation review: mobile-first single flow, desktop commerce split. */
.tap-cst-review-layout {
  display:grid;
  grid-template-columns:minmax(0,1fr);
  gap:14px;
  min-width:0;
}
.tap-cst-review-main,
.tap-cst-review-aside { min-width:0; }
.tap-cst-review-main > :first-child,
.tap-cst-review-aside > :first-child { margin-top:0; }
@media (min-width:900px) {
  .tap-cst-review-sheet { max-width:960px; }
  .tap-cst-review-layout {
    grid-template-columns:minmax(0,1.35fr) minmax(300px,.85fr);
    gap:22px;
    align-items:start;
  }
  .tap-cst-review-aside {
    position:sticky;
    top:68px;
    align-self:start;
  }
  .tap-cst-review-aside .tap-cst-pay-now { position:static; }
}

/* ═══════════════════════════════════════════════════════════════════════
 * v7.3.1 — scheduled consultation decision experience
 * One primary action on listing/profile, desktop inline scheduler, mobile
 * bottom sheet with quick dates, available-day calendar, grouped slots and
 * a persistent selection summary. Backend availability and payment contracts
 * are unchanged.
 * ═══════════════════════════════════════════════════════════════════════ */
.tap-cst-card[role="link"] { cursor:pointer; }
.tap-cst-card[role="link"] .tap-cst-card-actions { width:100%; }
.tap-cst-card-actions { grid-template-columns:minmax(0,1fr); }
.tap-cst-card-actions .tap-cst-card-action { width:100%; min-height:44px; }
.tap-cst-next-availability { display:flex; align-items:center; min-height:24px; color:var(--tap-muted,#6f6480); font-size:calc(0.7813 * var(--tap-fs)); font-weight:700; }
.tap-cst-inline-link { appearance:none; border:0; background:transparent; color:var(--tap-cst-accent); padding:6px 4px; font:inherit; font-size:calc(0.7813 * var(--tap-fs)); font-weight:750; text-decoration:underline; text-underline-offset:3px; cursor:pointer; }
.tap-cst-inline-link:focus-visible { outline:3px solid color-mix(in srgb,var(--tap-cst-accent) 28%,transparent); outline-offset:2px; border-radius:8px; }

.tap-cst-desktop-scheduler { display:none; margin-top:18px; padding:20px; border:1px solid #e6deec; border-radius:var(--tap-r-2xl); background:#fff; box-shadow:0 12px 32px rgba(42,20,54,.06); }
.tap-cst-inline-scheduler-head { display:flex; justify-content:space-between; align-items:flex-start; gap:18px; margin-bottom:4px; }
.tap-cst-inline-scheduler-head h2 { margin:0; color:var(--tap-ink,#1e0a2e); font-size:calc(1.25 * var(--tap-fs)); }
.tap-cst-inline-scheduler-head p { margin:5px 0 0; color:var(--tap-muted,#6f6480); font-size:calc(0.8125 * var(--tap-fs)); }
.tap-cst-secure-note { flex:0 0 auto; color:#52635a; font-size:calc(0.75 * var(--tap-fs)); font-weight:750; }

.tap-cst-scheduler { min-width:0; }
.tap-cst-scheduler.is-inline { display:grid; grid-template-columns:minmax(0,1fr); }
.tap-cst-package-selector { display:grid; grid-template-columns:repeat(auto-fit,minmax(112px,1fr)); gap:9px; }
.tap-cst-duration-card { position:relative; display:grid; gap:3px; min-height:96px; padding:13px 12px; border:1.5px solid #e5ddec; border-radius:var(--tap-r-md); background:#fff; color:#4a3a58; text-align:center; cursor:pointer; }
.tap-cst-duration-card strong { color:var(--tap-ink,#1e0a2e); font-size:calc(0.875 * var(--tap-fs)); }
.tap-cst-duration-card span { color:var(--tap-cst-accent); font-size:calc(1.1875 * var(--tap-fs)); font-weight:900; }
.tap-cst-duration-card small { color:var(--tap-muted,#6f6480); font-size:calc(0.6563 * var(--tap-fs)); }
.tap-cst-duration-card.sel { border-color:var(--tap-cst-accent); background:color-mix(in srgb,var(--tap-cst-accent) 7%,white); box-shadow:0 0 0 2px color-mix(in srgb,var(--tap-cst-accent) 11%,transparent); }
.tap-cst-duration-card:focus-visible,.tap-cst-calendar-toggle:focus-visible,.tap-cst-calendar-day:focus-visible { outline:3px solid color-mix(in srgb,var(--tap-cst-accent) 28%,transparent); outline-offset:2px; }

.tap-cst-date-head { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-top:5px; }
.tap-cst-date-head .tap-cst-label { margin-bottom:8px; }
.tap-cst-date-tools { display:flex; justify-content:flex-end; }
.tap-cst-calendar-toggle { appearance:none; border:0; background:transparent; color:var(--tap-cst-accent); padding:8px 2px; font:inherit; font-size:calc(0.75 * var(--tap-fs)); font-weight:800; cursor:pointer; }
.tap-cst-quick-dates .tap-cst-daychip { white-space:pre-line; min-width:92px; min-height:58px; }
.tap-cst-calendar[hidden] { display:none!important; }
.tap-cst-calendar { display:grid; gap:13px; margin:10px 0 4px; padding:13px; border:1px solid #e7dfed; border-radius:var(--tap-r-lg); background:#fbf9fd; }
.tap-cst-calendar-month h3 { margin:0 0 9px; color:var(--tap-ink,#1e0a2e); font-size:calc(0.8125 * var(--tap-fs)); }
.tap-cst-calendar-grid { display:grid; grid-template-columns:repeat(7,minmax(38px,1fr)); gap:6px; }
.tap-cst-calendar-day { display:grid; place-items:center; gap:2px; min-height:52px; padding:6px 3px; border:1px solid #e2daea; border-radius:10px; background:#fff; color:#4a3a58; cursor:pointer; }
.tap-cst-calendar-day small { font-size:calc(0.5625 * var(--tap-fs)); color:#796d82; }
.tap-cst-calendar-day strong { font-size:calc(0.875 * var(--tap-fs)); }
.tap-cst-calendar-day.sel { border-color:var(--tap-cst-accent); background:var(--tap-cst-accent); color:#fff; }
.tap-cst-calendar-day.sel small { color:#fff; }

.tap-cst-timewrap { display:grid; gap:13px; }
.tap-cst-time-group { display:grid; gap:7px; }
.tap-cst-time-group h3 { margin:0; color:#6a5d73; font-size:calc(0.7188 * var(--tap-fs)); text-transform:uppercase; letter-spacing:.05em; }
.tap-cst-time-group .tap-cst-timegrid { grid-template-columns:repeat(auto-fill,minmax(92px,1fr)); }
.tap-cst-time { min-height:44px; }
.tap-cst-inline-state strong,.tap-cst-inline-state span { display:block; }
.tap-cst-inline-state span { margin-top:3px; font-size:calc(0.7188 * var(--tap-fs)); }

.tap-cst-schedule-footer { position:sticky; bottom:0; z-index:4; display:grid; grid-template-columns:minmax(0,1fr) minmax(150px,.9fr); align-items:center; gap:12px; margin:18px -18px -6px; padding:12px 18px calc(12px + env(safe-area-inset-bottom)); border-top:1px solid #e9e2ee; background:rgba(255,255,255,.96); box-shadow:0 -10px 28px rgba(31,13,42,.08); backdrop-filter:blur(14px); }
.tap-cst-schedule-summary { display:grid; gap:3px; min-width:0; }
.tap-cst-schedule-summary span { overflow:hidden; color:var(--tap-muted,#6f6480); font-size:calc(0.7188 * var(--tap-fs)); text-overflow:ellipsis; white-space:nowrap; }
.tap-cst-schedule-summary strong { color:var(--tap-ink,#1e0a2e); font-size:calc(1.125 * var(--tap-fs)); }
.tap-cst-schedule-footer .tap-cst-confirm { margin:0; min-height:48px; }
.tap-cst-schedule-sheet { max-height:min(92dvh,920px); }
.tap-cst-schedule-sheet-body { padding-bottom:8px; }

@media (min-width:900px) {
  .tap-cst-desktop-scheduler { display:block; }
  .tap-cst-profile-actions.has-desktop-scheduler { display:none; }
  .tap-cst-scheduler.is-inline { grid-template-columns:minmax(0,1fr); }
  .tap-cst-scheduler.is-inline .tap-cst-option-grid { grid-template-columns:repeat(2,minmax(0,1fr)); max-width:720px; }
  .tap-cst-scheduler.is-inline .tap-cst-package-selector { max-width:720px; }
  .tap-cst-scheduler.is-inline .tap-cst-quick-dates { overflow:visible; display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); }
  .tap-cst-scheduler.is-inline .tap-cst-quick-dates .tap-cst-daychip { min-width:0; }
  .tap-cst-scheduler.is-inline .tap-cst-timewrap { max-width:850px; }
  .tap-cst-scheduler.is-inline .tap-cst-schedule-footer { position:static; grid-template-columns:minmax(0,1fr) 280px; margin:20px 0 0; padding:14px; border:1px solid #e6deec; border-radius:var(--tap-r-lg); box-shadow:none; background:#faf8fc; }
  .tap-cst-scheduler.is-inline .tap-cst-fine { text-align:left; }
}

@media (max-width:899px) {
  .tap-cst-profile-actions { position:sticky; bottom:calc(var(--tap-fixed-nav-h,0px) + env(safe-area-inset-bottom)); z-index:8; margin-left:-4px; margin-right:-4px; padding:10px; }
  .tap-cst-schedule-sheet .tap-cst-sheet-head { padding-top:max(14px,env(safe-area-inset-top)); }
}

@media (max-width:479px) {
  .tap-cst-schedule-sheet { width:100%; max-width:none; height:min(92dvh,880px); max-height:min(92dvh,880px); display:flex; flex-direction:column; overflow:hidden; }
  .tap-cst-schedule-sheet > .tap-cst-sheet-body { flex:1 1 auto; min-height:0; overflow:auto; }
  .tap-cst-package-selector { grid-template-columns:repeat(3,minmax(92px,1fr)); overflow-x:auto; scroll-snap-type:x proximity; padding-bottom:4px; }
  .tap-cst-duration-card { min-width:104px; min-height:91px; scroll-snap-align:start; }
  .tap-cst-calendar-grid { grid-template-columns:repeat(7,minmax(34px,1fr)); gap:4px; }
  .tap-cst-calendar-day { min-height:48px; }
  .tap-cst-schedule-footer { grid-template-columns:minmax(0,1fr) minmax(138px,.9fr); }
}

@media (max-width:359px) {
  .tap-cst-schedule-footer { grid-template-columns:1fr; }
  .tap-cst-schedule-summary { grid-template-columns:1fr auto; align-items:center; }
  .tap-cst-schedule-summary span { white-space:normal; }
  .tap-cst-schedule-footer .tap-cst-confirm { width:100%; }
}

@media (prefers-reduced-motion:reduce) {
  .tap-cst-duration-card,.tap-cst-calendar-day,.tap-cst-calendar-toggle,.tap-cst-schedule-footer { transition:none!important; animation:none!important; }
}
/* ===== END assets/css/tap-frontend.css ===== */

/* ===== BEGIN assets/css/tap-ui.css ===== */
/* ==========================================================================
   TalentAstro — UI enhancement layer (tap-ui.css)
   Additive polish on top of tap-frontend.css. Loaded AFTER it.
   Covers: accessible toast region, global keyboard focus, touch targets,
   reduced-motion, mobile feel, skeleton + dialog primitives.
   Nothing here overrides existing component styling destructively.
   ========================================================================== */

/* ---- Accessible toast region (replaces per-toast inline positioning) ---- */
.tap-toast-region {
	position: fixed;
	left: 50%;
	bottom: 90px;
	transform: translateX(-50%);
	z-index: 999999;
	display: flex;
	flex-direction: column;
	gap: 8px;
	align-items: center;
	pointer-events: none;
	width: max-content;
	max-width: min(92vw, 460px);
}
.tap-toast-region .tap-toast { pointer-events: auto; }

/* ---- Global keyboard focus (WCAG 2.4.7) — only for keyboard users ---- */
.tap-root a:focus-visible,
.tap-root button:focus-visible,
.tap-root input:focus-visible,
.tap-root textarea:focus-visible,
.tap-root select:focus-visible,
.tap-root [tabindex]:focus-visible,
.tap-root input[type="checkbox"]:focus-visible,
.tap-root input[type="radio"]:focus-visible,
.tap-modal a:focus-visible,
.tap-modal button:focus-visible,
.tap-modal input:focus-visible,
.tap-intent-chip:focus-visible,
.tap-il-card:focus-visible {
	outline: 3px solid var(--tap-purple, #6109be);
	outline-offset: 2px;
	border-radius: 8px;
}
/* Don't show focus ring on mouse click (browsers that lack :focus-visible). */
.tap-root :focus:not(:focus-visible) { outline: none; }

/* ---- Touch targets: 44–48px minimum on touch devices (WCAG 2.5.5) ---- */
@media (pointer: coarse) {
	.tap-root button,
	.tap-root .tap-btn,
	.tap-root a.tap-btn,
	.tap-delivery-chip,
	.tap-intent-chip,
	.tap-dtab,
	.tap-rm,
	.tap-addmember {
		min-height: 44px;
	}
	.tap-root input,
	.tap-root textarea,
	.tap-root select {
		min-height: 44px;
		font-size:calc(1 * var(--tap-fs)); /* prevents iOS zoom-on-focus */
	}
}

/* ---- Skeleton utility (consistent, reduced-motion aware) ---- */
.tap-skel {
	background: linear-gradient(90deg, rgba(240, 232, 253, 0.6) 0%, rgba(255, 248, 231, 0.9) 25%, rgba(245, 200, 66, 0.4) 50%, rgba(255, 248, 231, 0.9) 75%, rgba(240, 232, 253, 0.6) 100%);
	background-size: 300% 100%;
	animation: tapMetallicShimmer 2s cubic-bezier(0.4, 0, 0.2, 1) infinite, tapPulseWave 2.5s ease-in-out infinite;
	border-radius: var(--tap-radius-sm, 10px);
	position: relative;
	overflow: hidden;
}
.tap-skel::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(110deg, transparent 30%, rgba(255, 255, 255, 0.7) 50%, transparent 70%);
	animation: tapPassSweep 1.8s ease-in-out infinite;
}
.tap-skel--line { height: 12px; margin: 8px 0; }
.tap-skel--title { height: 22px; width: 60%; margin: 10px 0; }
.tap-skel--card { height: 180px; }

/* Multi-Pass Metallic Shimmer & Sweep Keyframes */
@keyframes tapMetallicShimmer {
	0% { background-position: 300% 0; }
	100% { background-position: -300% 0; }
}
@keyframes tapPassSweep {
	0% { transform: translateX(-100%); }
	100% { transform: translateX(200%); }
}
@keyframes tapPulseWave {
	0%, 100% { opacity: 1; }
	50% { opacity: 0.65; }
}

/* ---- Dialog / modal polish (pair with role="dialog" aria-modal="true") ---- */
.tap-modal-wrap { -webkit-overflow-scrolling: touch; }
body.tap-modal-open { overflow: hidden; } /* scroll-lock helper class */

/* ---- Mobile feel ---- */
/* v6.6.4: was bare `html`, which forced smooth scrolling on every page of
   the site including WooCommerce. Scoped to DIVSA screens; scroll-behavior
   set on body still propagates to the viewport. */
body.tap-app { scroll-behavior: smooth; }
.tap-root { -webkit-tap-highlight-color: rgba(97, 9, 190, .12); overscroll-behavior-y: contain; }
.tap-root img { max-width: 100%; height: auto; }
.tap-root button { touch-action: manipulation; }

/* UX-017: Active/touch press visual feedback */
.tap-root .tap-btn:active,
.tap-root .tap-chip:active,
.tap-root .tap-card:active,
.tap-root .tap-intent-chip:active,
.tap-root .tap-delivery-chip:active {
	transform: scale(0.97);
	opacity: 0.92;
	transition: transform 0.1s ease, opacity 0.1s ease;
}

/* ---- Empty / error state primitives ---- */
.tap-state {
	text-align: center;
	padding: 40px 20px;
	color: var(--tap-muted, #6b5b78);
}
.tap-state__icon { font-size:calc(2.5 * var(--tap-fs)); margin-bottom: 10px; }
.tap-state__title { font-weight: 800; color: var(--tap-ink, #1e0a2e); margin-bottom: 6px; }
.tap-state__cta {
	display: inline-block; margin-top: 14px;
	background: var(--tap-purple, #6109be); color: #fff; text-decoration: none;
	font-weight: 700; padding: var(--tap-space-3, 12px) var(--tap-space-6, 24px); border-radius: var(--tap-radius-full, 999px);
}

/* ---- Respect reduced-motion globally (covers shimmer, confetti, transitions) ---- */
@media (prefers-reduced-motion: reduce) {
	html { scroll-behavior: auto; }
	.tap-root *,
	.tap-root *::before,
	.tap-root *::after,
	.tap-skel,
	.tap-skeleton,
	.tap-confetti-particle,
	.tap-celebrate-mandala {
		animation-duration: .001ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: .001ms !important;
	}
}

/* ---- WhatsApp escape-hatch button (no-dates state) ---- */
.tap-btn-wa {
	display: inline-flex; align-items: center; gap: 8px;
	background: #25D366; color: #fff; text-decoration: none;
	font-weight: 700; padding: var(--tap-space-3, 12px) var(--tap-space-5, 20px); border-radius: var(--tap-radius-full, 999px);
	border: none; cursor: pointer;
}
.tap-btn-wa:hover { background: #1ebe5d; }

/* ---- Disabled primary CTA (e.g. no bookable date) ---- */
.tap-btn-cta.is-disabled,
.tap-btn-cta:disabled {
	opacity: .55;
	cursor: not-allowed;
	filter: grayscale(.3);
	box-shadow: none;
}

/* ---- UX-024: Smooth view transitions ---- */
.tap-view-enter {
	animation: tapViewEnter 0.25s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

@keyframes tapViewEnter {
	from {
		opacity: 0;
		transform: translateY(8px) scale(0.99);
	}
	to {
		opacity: 1;
		transform: translateY(0) scale(1);
	}
}

/* Progress line metallic fill */
.tap-step-line-fill,
.tap-progress-fill {
	height: 100%;
	background: linear-gradient(90deg, var(--tap-purple, #6109be) 0%, var(--tap-marigold, #f99000) 50%, var(--tap-turmeric, #f5c842) 100%);
	background-size: 200% 100%;
	animation: tapProgressGlow 3s ease infinite;
	border-radius: var(--tap-radius-full, 999px);
	transition: width var(--dur-slow, 400ms) var(--ease-out, cubic-bezier(0.4, 0, 0.2, 1));
}

/* Step bounce keyframes */
@keyframes tapStepBounce {
	0% { transform: scale(0.8); }
	50% { transform: scale(1.18); }
	70% { transform: scale(0.95); }
	100% { transform: scale(1); }
}
.tap-step.active .tap-step-circle {
	animation: tapStepBounce 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* Golden Aura Pulse Ring & 3D Blessing Particle Keyframes */
.tap-golden-aura-pulse {
	position: absolute; width: 140px; height: 140px; border-radius: 50%;
	background: radial-gradient(circle, rgba(255,215,0,0.6) 0%, rgba(249,144,0,0.3) 45%, rgba(97,9,190,0) 75%);
	animation: tapAuraPulse 2.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes tapAuraPulse {
	0% { transform: scale(0.2); opacity: 0; }
	40% { opacity: 0.95; }
	100% { transform: scale(4.5); opacity: 0; }
}
@keyframes tapBlessingParticle3D {
	0% { transform: translate3d(0, 0, 0) rotateX(0deg) rotateY(0deg) scale(0.5); opacity: 0; }
	20% { opacity: 1; }
	80% { opacity: 0.8; }
	100% { transform: translate3d(var(--tx, 40px), var(--ty, -120px), var(--tz, 100px)) rotateX(360deg) rotateY(180deg) scale(1.2); opacity: 0; }
}
.tap-blessing-particle-3d {
	position: fixed; z-index: 999998; pointer-events: none; will-change: transform, opacity;
	animation: tapBlessingParticle3D 2.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}
/* ===== END assets/css/tap-ui.css ===== */

/* ===== BEGIN assets/css/tap-premium.css ===== */
/* ============================================================
   TalentAstro — Premium overlay (loaded LAST)
   Scoped under .tap-root so it cannot leak into the WP theme.
   Uses only the design tokens that the Brand Customizer drives,
   so admin colour/font/logo changes flow through automatically.
   Additive polish — does not change existing layout dimensions.
   ============================================================ */

/* ---------- Brand logo bar (from window.TAP_BRAND.logo) ---------- */
.tap-root .tap-brandbar{
  display:flex;align-items:center;gap:10px;padding:4px 0 16px;margin-bottom:4px;
}
.tap-root .tap-brandbar-logo{
  height:44px;max-width:220px;object-fit:contain;display:block;
}

/* ---------- Promo banner above catalogue (from tap_banners) ---------- */
.tap-root .tap-promo{
  position:relative;overflow:hidden;border-radius:var(--tap-radius-xl,26px);
  margin:0 0 22px;min-height:150px;display:flex;align-items:center;
  box-shadow:var(--tap-shadow,0 4px 20px rgba(97,9,190,.10));isolation:isolate;
}
.tap-root .tap-promo-bg{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-2;
}
.tap-root .tap-promo::after{
  content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(90deg,rgba(26,6,42,.90) 0%,rgba(26,6,42,.55) 55%,rgba(26,6,42,.20) 100%);
}
.tap-root .tap-promo-in{padding:24px 28px;color:#fff;max-width:640px}
.tap-root .tap-promo-ey{
  font-size:calc(0.6875 * var(--tap-fs));font-weight:800;letter-spacing:.09em;text-transform:uppercase;
  color:var(--tap-marigold,#f99000);margin-bottom:8px;
}
.tap-root .tap-promo-title{
  font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:600;
  font-size:clamp(19px,2.6vw,27px);line-height:1.15;margin-bottom:7px;letter-spacing:-.01em;
}
.tap-root .tap-promo-sub{
  font-size:calc(0.875 * var(--tap-fs));color:rgba(255,255,255,.9);line-height:1.45;margin-bottom:15px;max-width:54ch;
}
.tap-root .tap-promo-cta{display:inline-flex;align-items:center;gap:7px;width:auto}
@media(max-width:560px){
  .tap-root .tap-promo{min-height:auto}
  .tap-root .tap-promo-in{padding:20px 18px}
}

/* ---------- Premium polish: cards ---------- */
.tap-root .tap-pcard{
  border-radius:var(--tap-radius,18px);
  border:1px solid var(--tap-line,#ece6f2);
  box-shadow:0 1px 3px rgba(30,10,46,.04);
  overflow:hidden;
  transition:transform .3s cubic-bezier(.34,1.4,.5,1),
             box-shadow .3s ease, border-color .3s ease;
}
.tap-root .tap-pcard:hover{
  transform:translateY(-6px);
  box-shadow:var(--tap-shadow-xl,0 18px 50px rgba(97,9,190,.16));
  border-color:transparent;
}
.tap-root .tap-pcard img,
.tap-root .tap-hero-img{transition:transform .5s ease}
.tap-root .tap-pcard:hover .tap-hero-img,
.tap-root .tap-pcard:hover img{transform:scale(1.05)}
.tap-root .tap-grid{gap:24px}
@media(max-width:560px){.tap-root .tap-grid{gap:16px}}

/* ---------- Premium polish: headline ---------- */
.tap-root .tap-headline{
  font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;
  font-weight:600;letter-spacing:-.02em;line-height:1.1;
}

/* ---------- Premium polish: primary + gold buttons ---------- */
.tap-root .tap-btn-primary,
.tap-root .tap-btn-xl{
  background:var(--grad-sacred,linear-gradient(135deg,#6109be 0%,#d75c27 100%));
  color:var(--tap-cta-text,#fff);border:none;
  box-shadow:0 6px 16px rgba(97,9,190,.26);
  transition:transform .2s cubic-bezier(.34,1.4,.5,1),box-shadow .2s ease;
}
.tap-root .tap-btn-gold{
  background:var(--grad-gold,linear-gradient(135deg,#f99000 0%,#f5c842 100%));
  color:#3a2400;border:none;
  box-shadow:0 6px 16px rgba(249,144,0,.30);
}
.tap-root .tap-btn-primary:hover,
.tap-root .tap-btn-gold:hover,
.tap-root .tap-btn-xl:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(97,9,190,.34)}
.tap-root .tap-btn-primary:active,
.tap-root .tap-btn-gold:active,
.tap-root .tap-btn-xl:active{transform:translateY(0)}

/* ---------- Premium polish: inputs ---------- */
.tap-root .tap-inp,
.tap-root .tap-input,
.tap-root .tap-coupon-inp{
  border-radius:var(--tap-radius-sm,12px);
  border:1px solid var(--tap-line,#ece6f2);
  transition:border-color .18s ease, box-shadow .18s ease;
}
.tap-root .tap-inp:focus,
.tap-root .tap-input:focus,
.tap-root .tap-coupon-inp:focus{
  outline:none;
  border-color:var(--tap-purple,#6109be);
  box-shadow:0 0 0 3px rgba(97,9,190,.14);
}

/* ---------- Premium polish: pills / chips ---------- */
.tap-root .tap-pill,
.tap-root .tap-chip{
  border-radius:var(--tap-radius-full,999px);
  transition:transform .15s ease, border-color .2s ease, background .2s ease, color .2s ease;
}
.tap-root .tap-pill:hover,
.tap-root .tap-chip:hover{transform:translateY(-1px)}

/* ---------- Premium polish: sankalp / family cards ---------- */
.tap-root .tap-family-card,
.tap-root .tap-panel,
.tap-root .tap-pcard,
.tap-root .tap-mem-card{border-radius:var(--tap-radius,18px)}

/* ---------- Accessible focus ring everywhere ---------- */
.tap-root :focus-visible{
  outline:3px solid var(--tap-purple,#6109be);
  outline-offset:2px;border-radius:var(--tap-r-3xs);
}

/* ---------- Respect reduced motion ---------- */
@media(prefers-reduced-motion:reduce){
  .tap-root *{animation-duration:.001ms!important;transition-duration:.001ms!important}
  .tap-root .tap-pcard:hover{transform:none}
  .tap-root .tap-pcard:hover img,
  .tap-root .tap-pcard:hover .tap-hero-img{transform:none}
}

/* ================= HOME: banner slider + category sections ================= */
.tap-root .tap-slider{position:relative;margin:0 0 22px;border-radius:var(--tap-radius-xl,26px);overflow:hidden;box-shadow:var(--tap-shadow,0 4px 20px rgba(97,9,190,.10))}
.tap-root .tap-slides{display:flex;transition:transform .5s var(--ease-out,cubic-bezier(.4,0,.2,1))}
.tap-root .tap-slide{min-width:100%;position:relative;aspect-ratio:var(--tap-banner-ratio,3/1);display:flex;align-items:center}
@media(max-width:700px){.tap-root .tap-slide{aspect-ratio:var(--tap-banner-ratio-m,var(--tap-banner-ratio,16/10))}}
.tap-root .tap-slide-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:var(--tap-banner-fit,cover);z-index:-2}
.tap-root .tap-slide::after{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(90deg,rgba(26,6,42,.9),rgba(26,6,42,.5) 55%,rgba(26,6,42,.15))}
.tap-root .tap-slide-in{padding:0 clamp(22px,5vw,56px);color:#fff;max-width:640px}
.tap-root .tap-slide-ey{font-size:calc(0.75 * var(--tap-fs));font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--tap-marigold,#f99000);margin-bottom:9px}
.tap-root .tap-slide-title{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:600;font-size:clamp(20px,3.4vw,34px);line-height:1.12;margin-bottom:9px;letter-spacing:-.01em}
.tap-root .tap-slide-sub{font-size:calc(0.9063 * var(--tap-fs));color:rgba(255,255,255,.9);margin-bottom:16px;max-width:48ch;line-height:1.45}
.tap-root .tap-slide-cta{display:inline-flex;align-items:center;gap:7px;width:auto}
.tap-root .tap-slide-dots{position:absolute;bottom:14px;left:50%;transform:translateX(-50%);display:flex;gap:7px;z-index:3}
.tap-root .tap-slide-dot{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,.5);border:none;cursor:pointer;padding:0;transition:.2s}
.tap-root .tap-slide-dot.on{background:#fff;width:24px;border-radius:5px}

/* v7.7.3: was `margin:26px 0`. The shorthand also wrote margin-inline:0, and
   at (0,2,0) it ties with the v5.0.1 rule
   `.tap-booking-root > .tap-section{max-width:840px;margin-inline:auto}` —
   this file is concatenated AFTER tap-frontend.css, so the shorthand won and
   silently stripped the centring while leaving the 840px cap in place. That is
   why detail sections sat 840px wide pinned to the LEFT of a 1437px canvas.
   margin-block writes only the axis this rule actually cares about. */
.tap-root .tap-section{margin-block:26px}
.tap-root .tap-section-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:13px}
.tap-root .tap-section-title{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:600;font-size:clamp(19px,2.4vw,24px);letter-spacing:-.01em;display:flex;align-items:center;gap:9px;margin:0}
.tap-root .tap-section-em{font-size:calc(1.25 * var(--tap-fs))}
.tap-root .tap-section-scroller{display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:8px;scrollbar-width:none}
.tap-root .tap-section-scroller::-webkit-scrollbar{display:none}
.tap-root .tap-section-scroller .tap-pcard{scroll-snap-align:start;min-width:var(--tap-card-minw,268px);max-width:var(--tap-card-minw,268px);flex:none}
@media(max-width:560px){.tap-root .tap-section-scroller .tap-pcard{min-width:80vw;max-width:80vw}}
.tap-root .tap-scard-hot{border-color:#ffe2b8 !important;box-shadow:0 2px 12px rgba(249,144,0,.12)}

/* ================= BOOKING FLOW: premium restyle (all screens) ================= */
/* ---- back link + section labels ---- */
.tap-root .tap-back{display:inline-flex;align-items:center;gap:6px;color:var(--tap-purple,#6109be);font-weight:600;font-size:calc(0.8438 * var(--tap-fs))}
/* v7.7.3: exact duplicate of the .tap-section rule 13 lines above — same
   selector, same value. Removed rather than converted; one declaration. */
.tap-root .tap-label,.tap-root .tap-section>h2,.tap-root .tap-section>h3{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:600;letter-spacing:-.01em}
.tap-root .tap-sub{color:var(--tap-muted,#6b5b78)}

/* ---- detail hero ---- */
.tap-root .tap-detail-hero{border-radius:var(--tap-radius-xl,24px);overflow:hidden;position:relative;box-shadow:var(--tap-shadow,0 4px 20px rgba(97,9,190,.10))}
.tap-root .tap-detail-hero-overlay{background:linear-gradient(180deg,rgba(20,6,36,.35) 0,transparent 32%,transparent 62%,rgba(20,6,36,.5) 100%)}
.tap-root .tap-detail-hero-info h1,.tap-root .tap-detail-hero-info h2{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;letter-spacing:-.01em}
.tap-root .tap-gthumb{border-radius:var(--tap-r-md);overflow:hidden;border:2px solid transparent;transition:.2s;opacity:.75}
.tap-root .tap-gthumb:hover,.tap-root .tap-gthumb.is-active{border-color:var(--tap-purple,#6109be);opacity:1}

/* ---- tier / package cards ---- */
.tap-root .tap-tiers{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}
.tap-root .tap-tier-card{position:relative;border:2px solid var(--tap-line,#ece6f2);border-radius:var(--tap-radius,18px);
  padding:20px 18px;cursor:pointer;background:#fff;transition:border-color .2s,box-shadow .2s,transform .2s var(--ease-spring,cubic-bezier(.34,1.4,.5,1))}
.tap-root .tap-tier-card:hover{transform:translateY(-3px);box-shadow:var(--tap-shadow,0 4px 20px rgba(97,9,190,.10))}
.tap-root .tap-tier-card.is-sel{border-color:var(--tap-purple,#6109be);background:linear-gradient(180deg,var(--tap-purple-pale,#f0e8fd),#fff 62%);box-shadow:var(--tap-shadow,0 4px 20px rgba(97,9,190,.10))}
.tap-root .tap-tier-card.is-popular{border-color:var(--tap-marigold,#f99000)}
.tap-root .tap-tier-card.is-popular.is-sel{border-color:var(--tap-purple,#6109be)}
.tap-root .tap-tier-badge{position:absolute;top:-11px;left:50%;transform:translateX(-50%);background:var(--grad-gold,linear-gradient(135deg,#f99000,#f5c842));
  color:#3a2400;font-size:calc(0.6875 * var(--tap-fs));font-weight:800;padding:4px 12px;border-radius:var(--tap-radius-full,999px);white-space:nowrap;box-shadow:0 4px 12px rgba(249,144,0,.4)}
.tap-root .tap-tier-name{font-weight:700;font-size:calc(1.0625 * var(--tap-fs));color:var(--tap-ink,#1e0a2e)}
.tap-root .tap-tier-desc{color:var(--tap-muted,#6b5b78);font-size:calc(0.7813 * var(--tap-fs));margin-top:2px}
.tap-root .tap-tier-price-block{margin-top:12px;font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:700;color:var(--tap-purple,#6109be)}
.tap-root .tap-tier-icon{color:var(--tap-purple,#6109be)}

/* ---- date slots ---- */
.tap-root .tap-slots{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}
.tap-root .tap-slot{border:2px solid var(--tap-line,#ece6f2);border-radius:var(--tap-radius,18px);padding:15px;cursor:pointer;background:#fff;transition:.2s}
.tap-root .tap-slot:hover{border-color:var(--tap-purple,#6109be)}
.tap-root .tap-slot.is-sel,.tap-root .tap-slot.selected{border-color:var(--tap-purple,#6109be);background:var(--tap-purple-pale,#f0e8fd)}
.tap-root .tap-slot-avail{color:var(--tap-ok,#1a7d3c);font-weight:700;font-size:calc(0.7813 * var(--tap-fs))}

/* ---- members / family ---- */
.tap-root .tap-member-row input,.tap-root .tap-members input{border-radius:var(--tap-radius-sm,12px);border:1px solid var(--tap-line,#ece6f2)}
.tap-root .tap-addmember{display:inline-flex;align-items:center;gap:7px;border:1px dashed var(--tap-purple,#6109be);
  border-radius:var(--tap-radius-sm,12px);background:var(--tap-purple-pale,#f0e8fd);color:var(--tap-purple,#6109be);font-weight:700}

/* ---- add-on qty ---- */
.tap-root .tap-qty{display:inline-flex;align-items:center;border:1.5px solid var(--tap-line,#ece6f2);border-radius:var(--tap-radius-full,999px);overflow:hidden}
.tap-root .tap-qty button{border:none;background:#fff;color:var(--tap-purple,#6109be);font-weight:800;width:32px;height:32px;cursor:pointer}

/* ---- review / order summary ---- */
.tap-root .tap-summary{background:#fff;border:1px solid var(--tap-line,#ece6f2);border-radius:var(--tap-radius-xl,24px);box-shadow:var(--tap-shadow,0 4px 20px rgba(97,9,190,.10))}
/* v6.9.13 (#10): on laptop/desktop the order-summary + sankalp/success panels used to
   stretch the full 1160px container and looked broken. Cap them to a comfortable card
   and centre. Width is a variable so it stays admin-tunable without a new menu. */
@media(min-width:1024px){
  :root{--tap-flow-maxw:640px}
  .tap-root .tap-summary,
  .tap-root .tap-panel.tap-success,
  .tap-root .tap-panel:has(> .tap-sankalp-sacred),
  .tap-root .tap-panel:has(.tap-snk-invite){max-width:var(--tap-flow-maxw,640px);margin-left:auto;margin-right:auto}
}
.tap-root .tap-sumrow{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;min-width:0;font-size:calc(0.875 * var(--tap-fs));line-height:1.45}
.tap-root .tap-sumrow > span:first-child{min-width:0;overflow-wrap:anywhere}
.tap-root .tap-sumrow > span:last-child{flex:0 0 auto;white-space:nowrap;font-variant-numeric:tabular-nums}
.tap-root .tap-summary-section-title{margin:18px 0 8px;font-size:calc(0.8125 * var(--tap-fs));font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--tap-muted,#6b5b78)}
.tap-root .tap-summary-context{display:grid;gap:8px;margin:0 0 14px;padding:12px 14px;border:1px solid var(--tap-line,#ece6f2);border-radius:var(--tap-r-md,12px);background:var(--tap-bg,#faf7fd)}
.tap-root .tap-summary-context-row{display:flex;justify-content:space-between;gap:14px;min-width:0;font-size:calc(0.8125 * var(--tap-fs));line-height:1.4}
.tap-root .tap-summary-context-row span:first-child{color:var(--tap-muted,#6b5b78);flex:0 0 38%}
.tap-root .tap-summary-context-row span:last-child{min-width:0;text-align:right;font-weight:700;overflow-wrap:anywhere}
.tap-root .tap-total{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:700;font-size:calc(1.25 * var(--tap-fs))}
.tap-root .tap-discount{color:var(--tap-ok,#1a7d3c);font-weight:700}
.tap-root .tap-coupon-inp{border-radius:var(--tap-radius-sm,12px);border:1px solid var(--tap-line,#ece6f2)}
.tap-root .tap-sticky,.tap-root .tap-sticky-price{background:rgba(255,255,255,.96);backdrop-filter:blur(10px);border-top:1px solid var(--tap-line,#ece6f2);box-shadow:0 -6px 24px rgba(30,10,46,.08)}

/* ---- sankalp ---- */
.tap-root .tap-sankalp-sacred{background:linear-gradient(180deg,#fffaf2,#fff);border:1px solid #ffe2b8;border-radius:var(--tap-radius,18px)}
.tap-root .tap-gotra-help{color:var(--tap-purple,#6109be);font-weight:600;cursor:pointer}
.tap-root .tap-delivery-chip{border:1.5px solid var(--tap-line,#ece6f2);border-radius:var(--tap-radius-full,999px);padding:8px 14px;cursor:pointer;transition:.2s;font-weight:600;font-size:calc(0.8125 * var(--tap-fs))}
.tap-root .tap-delivery-chip.is-sel,.tap-root .tap-delivery-chip.selected{border-color:var(--tap-purple,#6109be);background:var(--tap-purple-pale,#f0e8fd);color:var(--tap-purple,#6109be)}

/* ---- success ---- */
.tap-root .tap-success{text-align:center}
.tap-root .tap-success h1,.tap-root .tap-success h2{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;letter-spacing:-.01em}

/* ---- notice ---- */
.tap-root .tap-notice-warn{background:linear-gradient(135deg,#fff8ef,#fff3e0);border:1px solid #ffe2b8;border-radius:var(--tap-radius-sm,12px);color:#8a5a00}

/* ================= APP SHELL: elevated Explore (Shankh) centre button ================= */
.tap-appshell-nav{overflow:visible}
.tap-bnav-explore{position:relative;justify-content:flex-end;padding-bottom:8px}
.tap-bnav-explore .tap-bnav-icon{display:none}
.tap-bnav-fab{
  position:absolute;top:-24px;left:50%;transform:translateX(-50%);
  width:56px;height:56px;border-radius:50%;
  background:linear-gradient(140deg,var(--tap-purple,#6109be),#43067f);
  display:flex;align-items:center;justify-content:center;color:#fff;
  box-shadow:0 10px 24px rgba(97,9,190,.45),0 0 0 4px #fff;
  transition:transform var(--dur-std,.25s) var(--ease-spring,cubic-bezier(.34,1.4,.5,1))
}
.tap-bnav-explore:active .tap-bnav-fab,.tap-bnav-explore.active .tap-bnav-fab{transform:translateX(-50%) translateY(-2px) scale(1.06)}
.tap-bnav-explore.active .tap-bnav-lbl-explore{color:var(--tap-purple,#6109be)}
.tap-bnav-fabsvg{width:30px;height:30px;display:block}
.tap-bnav-fabimg{width:32px;height:32px;object-fit:contain;display:block;filter:brightness(0) invert(1)}
.tap-bnav-lbl-explore{line-height:1;font-weight:700}

/* ================= CHADHAVA — item list (Sri Mandir reference style) ================= */
.tap-root .tap-chad-list{display:flex;flex-direction:column;margin-bottom:20px}
.tap-root .tap-chad-item{display:flex;gap:16px;justify-content:space-between;padding:20px 0;border-bottom:1px solid var(--tap-line,#ece6f2)}
.tap-root .tap-chad-item:first-child{padding-top:4px}
.tap-root .tap-chad-info{flex:1;min-width:0}
.tap-root .tap-chad-name{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:700;font-size:calc(1.125 * var(--tap-fs));color:var(--tap-ink,#1e0a2e);line-height:1.3;margin-bottom:7px}
.tap-root .tap-chad-desc{font-size:calc(0.875 * var(--tap-fs));color:var(--tap-muted,#6b5b78);line-height:1.55;margin-bottom:10px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.tap-root .tap-chad-price{font-weight:800;font-size:calc(1.1875 * var(--tap-fs));color:var(--tap-ok,#1a7d3c)}
.tap-root .tap-chad-right{position:relative;width:132px;flex:none;display:flex;flex-direction:column;align-items:center}
.tap-root .tap-chad-img{width:132px;height:106px;border-radius:var(--tap-r-xl);overflow:hidden;background:linear-gradient(135deg,#fff8e7,#f0e8fd);display:flex;align-items:center;justify-content:center;font-size:calc(2.125 * var(--tap-fs))}
.tap-root .tap-chad-img img{width:100%;height:100%;object-fit:cover;display:block}
.tap-root .tap-chad-step{position:absolute;bottom:-15px;left:50%;transform:translateX(-50%);display:flex;align-items:center;justify-content:space-between;width:112px;height:40px;background:var(--tap-marigold,#f99000);border-radius:11px;box-shadow:0 6px 16px rgba(249,144,0,.36)}
.tap-root .tap-chad-step button{border:none;background:none;color:#fff;font-size:calc(1.375 * var(--tap-fs));font-weight:700;width:40px;height:40px;cursor:pointer;line-height:1;-webkit-tap-highlight-color:transparent}
.tap-root .tap-chad-step button:active{transform:scale(.9)}
.tap-root .tap-chad-qty{color:#fff;font-weight:800;font-size:calc(1.0625 * var(--tap-fs));min-width:20px;text-align:center}
/* v6.9.11: the same stepper, used inline by the extra-members quantity row —
   the chadhava rule above absolutely positions it onto the item card. */
.tap-root .tap-xm-row .tap-chad-step{position:static;transform:none;flex:none}
.tap-root .tap-chad-item.is-on .tap-chad-img{outline:2.5px solid var(--tap-marigold,#f99000);outline-offset:1px}
.tap-root .tap-btn-green{background:var(--tap-ok,#1a7d3c);color:#fff}
/*
 * v7.5.5 — the Chadhava bar was `background: var(--tap-ok) !important` — a
 * solid green bar with a translucent-white ghost button, while Puja, VIP Puja
 * and Healing each used a different treatment again. Four verticals, one
 * action, three looks, and the green came from the SEMANTIC success token, so
 * on a white-label install the operator's brand colour never reached the
 * booking button and "confirmed" and "buy now" were the same green.
 *
 * The bar is now the shared white/blurred surface every other vertical uses;
 * only the offerings-count layout is Chadhava-specific and that is kept.
 */
/* The Chadhava bar appends [total, CTA] straight onto .tap-sticky with no
   .tap-sticky-inner wrapper, so it relied on the old green block's own layout.
   Give it the same row the standard bar has: total on the left, one dominant
   action on the right, action never shrinking below a comfortable tap width. */
/* flex-direction is stated explicitly: tap-phase2.css sets `.tap-sticky {
   flex-direction: column }` for the narrow two-line bars, and without naming
   the property here that column wins and the CTA drops under the total. */
.tap-root .tap-chad-sticky{border-top:1px solid var(--tap-line,#ece6f2);display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px}
.tap-root .tap-chad-sticky .tap-btn{flex:0 0 auto;min-width:min(58%,220px)}
.tap-root .tap-chad-sticky .tap-sticky-price{flex:1 1 auto;min-width:0}
/* The running total sits on the shared light bar now, so it takes the normal
   ink colour — it was forced to #fff for the old green background, which would
   otherwise render white-on-white. */
.tap-root .tap-chad-sticky .tap-sticky-price{background:transparent;border-top:none;box-shadow:none;backdrop-filter:none}
.tap-root .tap-chad-sticky .tap-chad-stickylbl{display:flex;align-items:center;gap:12px;color:var(--tap-ink,#1e0a2e)}
.tap-root .tap-chad-stickycnt{font-weight:700;font-size:calc(0.8125 * var(--tap-fs));color:var(--tap-muted,#6b5b78)}
.tap-root .tap-chad-stickyamt{font-weight:800;font-size:calc(1.25 * var(--tap-fs));font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;color:var(--tap-ink,#1e0a2e)}

/* ================= RESPONSIVE: phone = app, tablet = touch, laptop = website ================= */
/* Tablet (768–1023): comfortable padding, touch scrollers stay */
@media(min-width:768px) and (max-width:1023px){
  .tap-root{padding-left:22px;padding-right:22px}
  .tap-root .tap-section-scroller .tap-pcard{min-width:min(var(--tap-card-minw,240px),240px);max-width:min(var(--tap-card-minw,240px),240px)}
}
/* Laptop/desktop (≥1024): centered container + section rows become grids (no sideways scroll) */
@media(min-width:1024px){
  .tap-root{padding-left:28px;padding-right:28px}
  .tap-root .tap-section-scroller{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--tap-card-gridmin,252px),252px),1fr));overflow:visible;scroll-snap-type:none;padding-bottom:0}
  .tap-root .tap-section-scroller .tap-pcard{min-width:0;max-width:none}
  .tap-root .tap-slider{border-radius:var(--tap-r-5xl)}
  .tap-root .tap-chad-item{padding:24px 0}
}
/* Phone (<768): app polish */
@media(max-width:767px){
  .tap-root{padding-left:14px;padding-right:14px}
  .tap-root .tap-slider{margin-left:-2px;margin-right:-2px}
}

/* ================= MEMBERSHIP marketing strip (home) + guest note ================= */
.tap-root .tap-mem-strip{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:22px 0;
  padding:18px 20px;border-radius:var(--tap-radius,18px);color:#3a2400;
  background:var(--grad-gold,linear-gradient(135deg,#ffe9c4,#ffd98f));border:1px solid #ffd98f;
  box-shadow:0 6px 18px rgba(249,144,0,.18)}
.tap-root .tap-mem-strip-t{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:700;font-size:calc(1.0625 * var(--tap-fs));margin-bottom:3px}
.tap-root .tap-mem-strip-s{font-size:calc(0.8125 * var(--tap-fs));opacity:.85;line-height:1.45}
.tap-root .tap-mem-strip .tap-btn{white-space:nowrap;flex:none}
@media(max-width:560px){.tap-root .tap-mem-strip{flex-direction:column;align-items:flex-start}.tap-root .tap-mem-strip .tap-btn{width:100%;text-align:center}}
.tap-root .tap-guest-note,.tap-modal .tap-guest-note{background:#f0e8fd;border-radius:var(--tap-r-sm);padding:10px 12px;font-size:calc(0.7813 * var(--tap-fs));color:#4a2a76;line-height:1.5;margin:4px 0 12px}

/* ================= A · HOME HERO (mockup match) ================= */
.tap-home-root .tap-hero-cta-row{margin:20px 0 14px}
.tap-home-root .tap-hero-cta{display:inline-flex;align-items:center;gap:8px;
  background:var(--grad-gold,linear-gradient(135deg,#f99000,#f5c842));color:#3a2400;
  font-weight:800;font-size:calc(1 * var(--tap-fs));padding:15px 32px;border-radius:var(--tap-radius-full,999px);
  box-shadow:0 12px 28px rgba(249,144,0,.42);transition:transform .2s var(--ease-out,cubic-bezier(.4,0,.2,1))}
.tap-home-root .tap-hero-cta:hover{transform:translateY(-2px)}
.tap-home-root .tap-hero-trust{display:flex;flex-wrap:wrap;gap:10px 20px;margin-top:8px}
.tap-home-root .tap-hero-trust-i{display:inline-flex;align-items:center;gap:6px;font-size:calc(0.8125 * var(--tap-fs));font-weight:600;color:rgba(255,255,255,.92);text-shadow:0 1px 3px rgba(0,0,0,.3)}
@media(max-width:560px){.tap-home-root .tap-hero-trust{gap:8px 14px}.tap-home-root .tap-hero-trust-i{font-size:calc(0.75 * var(--tap-fs))}}

/* ================= B · POOJA DETAIL — info chips + panels (mockup) ================= */
.tap-root .tap-info-chips{display:flex;gap:9px;overflow-x:auto;padding-bottom:10px;scrollbar-width:none;margin-bottom:6px}
.tap-root .tap-info-chips::-webkit-scrollbar{display:none}
.tap-root .tap-info-chip{flex:none;display:inline-flex;align-items:center;gap:6px;border:1.5px solid var(--tap-line,#ece6f2);background:#fff;color:var(--tap-muted,#6b5b78);
  font-family:var(--tap-font-b,inherit);font-weight:700;font-size:calc(0.8125 * var(--tap-fs));padding:9px 15px;border-radius:var(--tap-radius-full,999px);cursor:pointer;transition:.18s;-webkit-tap-highlight-color:transparent}
.tap-root .tap-info-chip.is-on{border-color:var(--tap-purple,#6109be);background:var(--tap-purple,#6109be);color:#fff;box-shadow:0 6px 16px rgba(97,9,190,.28)}
.tap-root .tap-info-panel{display:none;animation:tapFade .25s ease}
.tap-root .tap-info-panel.is-on{display:block}
@keyframes tapFade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.tap-root .tap-info-lead{font-weight:700;font-size:calc(0.9375 * var(--tap-fs));color:var(--tap-ink,#1e0a2e);margin-bottom:8px}
/* process steps */
.tap-root .tap-steps{display:flex;flex-direction:column;gap:14px}
.tap-root .tap-step-row{display:flex;gap:13px;align-items:flex-start}
.tap-root .tap-step-n{flex:none;width:30px;height:30px;border-radius:50%;background:var(--tap-purple-pale,#f0e8fd);color:var(--tap-purple,#6109be);font-weight:800;font-size:calc(0.875 * var(--tap-fs));display:flex;align-items:center;justify-content:center}
.tap-root .tap-step-t{font-weight:700;font-size:calc(0.9063 * var(--tap-fs));color:var(--tap-ink,#1e0a2e)}
.tap-root .tap-step-d{font-size:calc(0.8125 * var(--tap-fs));color:var(--tap-muted,#6b5b78);line-height:1.5;margin-top:2px}
/* inclusions */
.tap-root .tap-incl{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:11px}
.tap-root .tap-incl li{position:relative;padding-left:30px;font-size:calc(0.9063 * var(--tap-fs));color:var(--tap-ink,#1e0a2e);line-height:1.4}
.tap-root .tap-incl li::before{content:"✓";position:absolute;left:0;top:-1px;width:21px;height:21px;border-radius:50%;background:var(--tap-ok,#1a7d3c);color:#fff;font-size:calc(0.75 * var(--tap-fs));font-weight:800;display:flex;align-items:center;justify-content:center}
/* reviews */
.tap-root .tap-rev{text-align:center;padding:10px 0}
.tap-root .tap-rev-score{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:700;font-size:calc(2.75 * var(--tap-fs));color:var(--tap-ink,#1e0a2e);line-height:1}
.tap-root .tap-rev-stars{color:var(--tap-marigold,#f99000);font-size:calc(1.25 * var(--tap-fs));letter-spacing:2px;margin:6px 0}
.tap-root .tap-rev-note{font-size:calc(0.8125 * var(--tap-fs));color:var(--tap-muted,#6b5b78)}
/* faq */
.tap-root .tap-faq{display:flex;flex-direction:column;gap:9px}
.tap-root .tap-faq-item{border:1px solid var(--tap-line,#ece6f2);border-radius:var(--tap-r-md);padding:2px 14px;background:#fff}
.tap-root .tap-faq-item summary{cursor:pointer;font-weight:700;font-size:calc(0.875 * var(--tap-fs));color:var(--tap-ink,#1e0a2e);padding:12px 0;list-style:none}
.tap-root .tap-faq-item summary::-webkit-details-marker{display:none}
.tap-root .tap-faq-item summary::after{content:"+";float:right;color:var(--tap-purple,#6109be);font-weight:800;font-size:calc(1.125 * var(--tap-fs))}
.tap-root .tap-faq-item[open] summary::after{content:"\2212"}
.tap-root .tap-faq-a{font-size:calc(0.8438 * var(--tap-fs));color:var(--tap-muted,#6b5b78);line-height:1.55;padding:0 0 13px}

/* ================= C · PROFILE DASHBOARD (mockup premium) ================= */
.tap-root .tap-spiritual-header{background:linear-gradient(140deg,var(--tap-purple,#6109be),#43067f);color:#fff;border-radius:var(--tap-radius-xl,24px);padding:22px 20px;margin-bottom:18px;box-shadow:0 12px 30px rgba(97,9,190,.3);position:relative;overflow:hidden}
.tap-root .tap-spiritual-header::after{content:"";position:absolute;top:-40px;right:-40px;width:150px;height:150px;border-radius:50%;background:rgba(255,255,255,.08)}
.tap-root .tap-spiritual-uid{font-size:calc(0.75 * var(--tap-fs));font-weight:700;letter-spacing:.03em;color:rgba(255,255,255,.85);margin-bottom:5px;position:relative}
.tap-root .tap-spiritual-name{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:600;font-size:calc(1.625 * var(--tap-fs));line-height:1.1;margin-bottom:16px;position:relative}
.tap-root .tap-spiritual-stats{display:flex;gap:10px;margin-bottom:16px;position:relative}
.tap-root .tap-spiritual-stat{flex:1;background:rgba(255,255,255,.13);border-radius:var(--tap-r-lg);padding:11px 8px;text-align:center;font-size:calc(0.6875 * var(--tap-fs));color:rgba(255,255,255,.85)}
.tap-root .tap-spiritual-stat strong{display:block;font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:700;font-size:calc(1.125 * var(--tap-fs));color:#fff;margin-bottom:2px}
.tap-root .tap-level-label{font-size:calc(0.75 * var(--tap-fs));color:rgba(255,255,255,.85);margin-bottom:6px;font-weight:600;position:relative}
.tap-root .tap-level-bar{height:8px;background:rgba(255,255,255,.2);border-radius:var(--tap-r-full);overflow:hidden;position:relative}
.tap-root .tap-level-fill{height:100%;background:linear-gradient(90deg,var(--tap-marigold,#f99000),#f5c842);border-radius:var(--tap-r-full);transition:width 1s cubic-bezier(.4,0,.2,1)}
.tap-root .tap-level-badge{display:inline-flex;align-items:center;gap:6px;font-weight:800;font-size:calc(0.75 * var(--tap-fs));color:#3a2400;padding:6px 14px;border-radius:var(--tap-r-full);position:relative}
.tap-root .tap-uid-badge{background:rgba(255,255,255,.1);border:1px dashed rgba(255,255,255,.35);border-radius:var(--tap-r-md);padding:10px 14px;display:flex;justify-content:space-between;align-items:center;position:relative}
.tap-root .tap-uid-label{font-size:calc(0.6875 * var(--tap-fs));color:rgba(255,255,255,.7);font-weight:600}
.tap-root .tap-uid-value{font-family:monospace;font-weight:800;font-size:calc(0.875 * var(--tap-fs));color:#fff;letter-spacing:.05em}
.tap-root .tap-logout{margin-top:14px !important;width:100%;background:rgba(255,255,255,.15) !important;color:#fff !important;border:none !important;position:relative}
.tap-root .tap-tabs{display:flex;gap:8px;overflow-x:auto;padding-bottom:10px;margin-bottom:14px;scrollbar-width:none}
.tap-root .tap-tabs::-webkit-scrollbar{display:none}
.tap-root .tap-tab{flex:none;border:1.5px solid var(--tap-line,#ece6f2);background:#fff;color:var(--tap-muted,#6b5b78);font-weight:700;font-size:calc(0.8125 * var(--tap-fs));padding:9px 16px;border-radius:var(--tap-r-full);cursor:pointer;transition:.18s;-webkit-tap-highlight-color:transparent}
.tap-root .tap-tab.is-on,.tap-root .tap-tab.active{border-color:var(--tap-purple,#6109be);background:var(--tap-purple,#6109be);color:#fff;box-shadow:0 6px 16px rgba(97,9,190,.26)}
.tap-root .tap-ref-card{background:var(--grad-gold,linear-gradient(135deg,#ffe9c4,#ffd98f));border-radius:var(--tap-radius,18px);padding:18px;color:#3a2400;box-shadow:0 6px 18px rgba(249,144,0,.2)}
.tap-root .tap-ref-title{font-family:var(--tap-font-heading,"Fraunces"),Georgia,serif;font-weight:700;font-size:calc(1.0625 * var(--tap-fs));margin-bottom:4px}
.tap-root .tap-ref-desc{font-size:calc(0.8125 * var(--tap-fs));opacity:.85;line-height:1.45;margin-bottom:12px}
.tap-root .tap-ref-code{font-family:monospace;font-weight:800;font-size:calc(1.125 * var(--tap-fs));letter-spacing:.1em;background:rgba(255,255,255,.6);border-radius:var(--tap-r-sm);padding:11px;text-align:center;margin-bottom:10px}

/* ================= PHASE 3 · Accessibility (WCAG) + perceived performance ================= */
/* Keyboard focus rings — visible for keyboard users, hidden for mouse (a11y without visual noise) */
.tap-root a:focus-visible,
.tap-root button:focus-visible,
.tap-root input:focus-visible,
.tap-root select:focus-visible,
.tap-root textarea:focus-visible,
.tap-root summary:focus-visible,
.tap-root [tabindex]:focus-visible{outline:3px solid var(--tap-purple,#6109be);outline-offset:2px;border-radius:var(--tap-r-3xs)}
.tap-root :focus:not(:focus-visible){outline:none}

/* Minimum 44px touch targets on mobile (WCAG 2.5.5 / one-thumb use) */
@media(max-width:767px){
  .tap-root button,.tap-root .tap-btn,.tap-root a.tap-btn,.tap-root .tap-bnav-item{min-height:44px}
  .tap-root .tap-info-chip,.tap-root .tap-tab,.tap-root .tap-slot,.tap-root .tap-delivery-chip{min-height:40px}
  .tap-root .tap-chad-step button,.tap-root .tap-qty button{min-width:40px;min-height:40px}
}

/* Respect reduced-motion preference (vestibular safety) */
@media(prefers-reduced-motion:reduce){
  .tap-root *,.tap-root *::before,.tap-root *::after{
    animation-duration:.001ms !important;animation-iteration-count:1 !important;
    transition-duration:.001ms !important;scroll-behavior:auto !important}
}

/* Skeleton shimmer utility for loading states (perceived performance) */
.tap-root .tap-skeleton{background:linear-gradient(100deg,var(--tap-line, #ece6f2) 30%,#f6f2fb 50%,var(--tap-line, #ece6f2) 70%);background-size:200% 100%;animation:tapShimmer 1.2s ease-in-out infinite;border-radius:var(--tap-r-sm);min-height:12px}
.tap-root .tap-skeleton-card{height:220px;border-radius:var(--tap-radius,18px)}
.tap-root .tap-skeleton-line{height:12px;margin:8px 0}
@keyframes tapShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}

/* Screen-reader-only text (labels for icon-only controls) */
.tap-root .tap-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* Smooth in-page scroll (info chips / anchors) unless reduced-motion */
@media(prefers-reduced-motion:no-preference){.tap-root{scroll-behavior:smooth}}

/* ================= SPIRITUAL PREMIUM REFINEMENT ================= */
/* Signature — a soft divine gold glow at the top of the hero, like aarti light.
   Low-opacity overlay, never interferes with content or layout.
   v4.9.27: retargeted from the removed .tap-hero-v2 to the compact hero. */
.tap-home-root .tap-hero-compact{position:relative}
.tap-home-root .tap-hero-compact::after{content:"";position:absolute;left:0;right:0;top:0;height:55%;pointer-events:none;
  background:radial-gradient(ellipse 70% 100% at 50% 0%, rgba(249,144,0,.16), rgba(249,144,0,0) 70%);z-index:1}
.tap-home-root .tap-hero-compact-body{position:relative;z-index:2}

/* Serene layered elevation on package/tier cards — calm depth, not a hard drop shadow */
.tap-root .tap-tier-card{box-shadow:0 1px 2px rgba(30,10,46,.05),0 14px 34px -14px rgba(97,9,190,.22);transition:transform .22s var(--ease-spring,cubic-bezier(.34,1.56,.64,1)),box-shadow .22s var(--ease-out,ease)}
.tap-root .tap-tier-card:hover{transform:translateY(-3px);box-shadow:0 2px 4px rgba(30,10,46,.06),0 22px 48px -16px rgba(97,9,190,.30)}

/* Spring-loaded, tactile feel on the primary + sacred call-to-actions */
.tap-root .tap-btn-primary,.tap-root .tap-btn-sacred,.tap-root .tap-btn-cta,.tap-root .tap-btn-gold{
  transition:transform .22s var(--ease-spring,cubic-bezier(.34,1.56,.64,1)),box-shadow .22s var(--ease-out,ease),filter .22s ease}
.tap-root .tap-btn-primary:hover,.tap-root .tap-btn-sacred:hover,.tap-root .tap-btn-gold:hover{transform:translateY(-2px);filter:saturate(1.06)}
.tap-root .tap-btn-primary:active,.tap-root .tap-btn-sacred:active,.tap-root .tap-btn-cta:active,.tap-root .tap-btn-gold:active{transform:translateY(0) scale(.985)}
.tap-root .tap-btn-sacred{box-shadow:0 10px 26px -8px rgba(249,144,0,.5)}

/* Typographic polish — Fraunces serif reads more refined a touch tighter */
.tap-root h1,.tap-root h2,.tap-root .tap-hero-title,.tap-root .tap-hero-card-title,.tap-root .tap-tier-name{letter-spacing:-.012em}
.tap-root .tap-hero-title{line-height:1.06}

/* Sticky checkout bar — a hair more depth so it reads as elevated above content */
.tap-root .tap-sticky-cta,.tap-root .tap-chad-sticky{box-shadow:0 -6px 24px -8px rgba(30,10,46,.16)}

/* ============ RESPONSIVE POLISH + MOCKUP ALIGNMENT (v4.9.10) ============ */
/* Legacy .tap-hscroll rows: match section-scroller — become a wrapped grid on laptop
   instead of a sideways scroll, so any older row stays consistent on wide screens. */
@media(min-width:1024px){
  .tap-root .tap-hscroll{display:grid;grid-template-columns:repeat(auto-fill,minmax(252px,1fr));overflow:visible;gap:18px}
  .tap-root .tap-hscroll .tap-pcard{width:auto;flex:none}
}
/* Airier vertical rhythm on tablet/laptop (phones stay tight & app-like) — closer to the
   generous whitespace in the reference mockups. */
@media(min-width:768px){
  .tap-root .tap-section{margin-top:34px}
  .tap-root .tap-section-head{margin-bottom:16px}
}
/* Keep long prose readable on ultra-wide screens (detail descriptions, benefits). */
@media(min-width:1024px){
  .tap-root .tap-detail-main .tap-desc,
  .tap-root .tap-detail-main .tap-prose{max-width:72ch}
}
/* Card polish to match the clean, elevated cards in the mockups (consistent on every card). */
.tap-root .tap-pcard{border:1px solid rgba(97,9,190,.06)}
.tap-root .tap-pcard:hover{border-color:rgba(97,9,190,.12)}

/* ============ SCREENSHOT FIXES: title wrap, modal overflow, width ============ */
/* Hero/detail title must wrap inside its banner instead of clipping on the right. */
.tap-root .tap-detail-hero-info h1,.tap-root .tap-detail-hero-info h2{overflow-wrap:break-word;word-break:break-word;white-space:normal;max-width:100%}
/* Give the detail hero room so a two-line title is never cut by the fixed aspect ratio. */
.tap-root .tap-detail-hero{aspect-ratio:auto;min-height:200px}
.tap-root .tap-detail-hero-info{padding:16px}
/* Modal must never scroll sideways; inputs stay inside. */
.tap-modal{overflow-x:hidden}
.tap-modal input,.tap-modal textarea,.tap-modal .tap-input{max-width:100%;box-sizing:border-box}
/* Plugin fills whatever width the theme gives it (best with a full-width page template). */
.tap-root{width:100%}

/* ============ 'Most Popular' badge — no overlap with card content ============ */
.tap-root .tap-tier-card.is-popular{padding-top:28px}
.tap-root .tap-tier-badge{top:0;border-radius:0 0 12px 12px;font-size:calc(0.6875 * var(--tap-fs));padding:5px 14px;box-shadow:0 4px 12px rgba(249,144,0,.28)}

/* ============================================================
   DETAIL v3 — JSX design parity for Puja / VIP / Healing / Chadhava
   Participation rows · date cards · add-on rows · partner-or-family
   ============================================================ */

/* Participation tiers → JSX row cards (radio on right) */
.tap-root .tap-tiers{grid-template-columns:1fr;gap:12px}
.tap-root .tap-tier-card{display:flex;flex-direction:row;align-items:center;gap:13px;padding:14px 16px;border-radius:var(--tap-r-xl);border-width:1px}
.tap-root .tap-tier-card.is-sel{border-width:1.5px;background:#fff}
/* v6.9.14: give the badge real clearance so it never overlaps the tier name/price. */
.tap-root .tap-tier-card.is-popular{padding-top:26px;padding-right:16px}
.tap-root .tap-tier-badge{top:0;left:auto;right:14px;transform:none;border-radius:0 0 8px 8px;font-size:calc(0.5938 * var(--tap-fs));padding:3px 10px;line-height:1.2;z-index:2}
.tap-root .tap-tier-head{flex:1;margin-top:0;gap:13px;align-items:center}
.tap-root .tap-tier-icon{width:44px;height:44px;border-radius:var(--tap-r-md);background:#F3ECFD;display:grid;place-items:center;flex-shrink:0}
.tap-root .tap-tier-icon svg{width:28px;height:22px}
.tap-root .tap-tier-name{font-size:calc(0.9375 * var(--tap-fs));font-weight:700}
.tap-root .tap-tier-desc{font-size:calc(0.7813 * var(--tap-fs))}
.tap-root .tap-tier-price-block{margin-top:0;flex-direction:column;align-items:flex-end;gap:0;text-align:right;flex-shrink:0}
.tap-root .tap-tier-price{font-size:calc(0.9375 * var(--tap-fs))}
.tap-root .tap-tier-orig{font-size:calc(0.6875 * var(--tap-fs))}
.tap-root .tap-tier-save{font-size:calc(0.5938 * var(--tap-fs));padding:1px 6px}
.tap-root .tap-tier-check{position:static;opacity:1;transform:none;width:20px;height:20px;border:2px solid #EDE6DA;background:#fff;color:transparent;flex-shrink:0;transition:border-color .15s ease}
.tap-root .tap-tier-card.is-sel .tap-tier-check{border-color:var(--tap-purple, #6109BE);background:var(--tap-purple, #6109BE);color:#fff;font-size:calc(0.6875 * var(--tap-fs))}

/* Slots → JSX date cards */
.tap-root .tap-slots{grid-template-columns:1fr;gap:12px}
.tap-root .tap-slot2{display:flex;align-items:center;gap:14px;padding:12px 14px;border-radius:var(--tap-r-xl);border:1px solid var(--tap-line,#ece6f2);background:#fff}
.tap-root .tap-slot2:after{display:none}
.tap-root .tap-slot2.is-sel{border:1.5px solid var(--tap-purple, #6109BE);background:#fff;box-shadow:none}
.tap-root .tap-slot2-date{width:54px;border-radius:13px;background:#F3ECFD;padding:9px 0;text-align:center;flex-shrink:0;display:flex;flex-direction:column;line-height:1.15}
.tap-root .tap-slot2.is-sel .tap-slot2-date{background:var(--tap-purple, #6109BE)}
.tap-root .tap-slot2-day{font-size:calc(0.6563 * var(--tap-fs));font-weight:600;color:#9C8FA8}
.tap-root .tap-slot2-num{font-family:"Fraunces",Georgia,serif;font-size:calc(1.25 * var(--tap-fs));font-weight:700;color:#241832}
.tap-root .tap-slot2-mon{font-size:calc(0.625 * var(--tap-fs));color:#9C8FA8}
.tap-root .tap-slot2.is-sel .tap-slot2-day,.tap-root .tap-slot2.is-sel .tap-slot2-mon{color:rgba(255,255,255,.8)}
.tap-root .tap-slot2.is-sel .tap-slot2-num{color:#fff}
.tap-root .tap-slot2-info{flex:1;min-width:0}
.tap-root .tap-slot2-time{font-size:calc(0.9063 * var(--tap-fs));font-weight:700;color:#241832;display:flex;align-items:center;gap:5px}
.tap-root .tap-slot2-clock{font-size:calc(0.8125 * var(--tap-fs))}
.tap-root .tap-slot2 .tap-countdown-live{margin:3px 0;font-size:calc(0.6875 * var(--tap-fs));padding:2px 7px}
.tap-root .tap-slot2-seats{font-size:calc(0.7188 * var(--tap-fs));font-weight:600;color:var(--tap-ok, #1A7D3C);margin-top:3px}
.tap-root .tap-slot2-seats.is-low{color:#C0392B}
.tap-root .tap-slot2-seats.is-full-txt{color:#C0392B}
.tap-root .tap-slot2-radio{width:20px;height:20px;border-radius:var(--tap-r-full);border:2px solid #EDE6DA;flex-shrink:0;display:grid;place-items:center;transition:border-color .15s ease}
.tap-root .tap-slot2.is-sel .tap-slot2-radio{border-color:var(--tap-purple, #6109BE)}
.tap-root .tap-slot2.is-sel .tap-slot2-radio:after{content:"";width:10px;height:10px;border-radius:var(--tap-r-full);background:var(--tap-purple, #6109BE)}
.tap-root .tap-slot2.is-upcoming{border-color:var(--tap-marigold, #F99000);background:#FFFDF8}

/* Add-ons → JSX rows (icon square · label+price · checkbox) */
.tap-root .tap-addons-grid{grid-template-columns:1fr;gap:12px}
@media(min-width:768px){.tap-root .tap-addons-grid{grid-template-columns:1fr}}
.tap-root .tap-addon-card{display:grid;grid-template-columns:44px 1fr auto;grid-template-rows:auto auto;gap:2px 13px;align-items:center;padding:13px 16px;border-radius:var(--tap-r-xl);border-width:1px}
.tap-root .tap-addon-card.is-on{border:1.5px solid var(--tap-purple, #6109BE);background:#fff}
.tap-root .tap-addon-emoji{grid-row:1/3;width:44px;height:44px;border-radius:var(--tap-r-md);background:#F3ECFD;display:grid;place-items:center;font-size:calc(1.25 * var(--tap-fs))}
.tap-root .tap-addon-name-txt{grid-column:2;grid-row:1;font-size:calc(0.875 * var(--tap-fs))}
.tap-root .tap-addon-desc{grid-column:2;grid-row:2;font-size:calc(0.75 * var(--tap-fs));-webkit-line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}
.tap-root .tap-addon-bottom{grid-column:3;grid-row:1/3;display:flex;flex-direction:column;align-items:flex-end;gap:7px;margin-top:0}
.tap-root .tap-addon-price-tag{font-size:calc(0.8438 * var(--tap-fs))}
.tap-root .tap-addon-togbtn{width:24px;height:24px;padding:0;border-radius:7px;border:1.5px solid #EDE6DA;background:#fff;color:transparent;display:grid;place-items:center;font-size:0}
.tap-root .tap-addon-togbtn.on{border-color:var(--tap-purple, #6109BE);background:var(--tap-purple, #6109BE);color:#fff;font-size:calc(0.8125 * var(--tap-fs))}
.tap-root .tap-addon-togbtn.on:before{content:"\2713"}

/* Chadhava — partner OR family (mutually exclusive) */
.tap-root .tap-pf-head{margin:24px 0 12px}
.tap-root .tap-pf-eyebrow{font-size:calc(0.6875 * var(--tap-fs));font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--tap-marigold, #F99000);margin-bottom:3px}
.tap-root .tap-pf-title{font-family:"Fraunces",Georgia,serif;font-size:calc(1.25 * var(--tap-fs));font-weight:600;color:#241832;margin:0}
.tap-root .tap-pf-card{display:flex;align-items:center;gap:13px;background:#fff;border:1px solid #EDE6DA;border-radius:var(--tap-r-xl);padding:14px 16px;margin-bottom:12px;cursor:pointer;box-shadow:0 2px 12px rgba(66,7,127,.06);transition:border-color .15s ease,opacity .15s ease}
.tap-root .tap-pf-card.is-on{border:1.5px solid var(--tap-purple, #6109BE)}
.tap-root .tap-pf-card.is-dim{opacity:.5}
.tap-root .tap-pf-ic{width:44px;height:44px;border-radius:var(--tap-r-md);background:#F3ECFD;display:grid;place-items:center;font-size:calc(1.1875 * var(--tap-fs));flex-shrink:0}
.tap-root .tap-pf-ic-saffron{background:#FFF1DC;color:var(--tap-marigold, #F99000)}
.tap-root .tap-pf-mid{flex:1;min-width:0}
.tap-root .tap-pf-name{font-size:calc(0.9063 * var(--tap-fs));font-weight:700;color:#241832}
.tap-root .tap-pf-sub{font-size:calc(0.75 * var(--tap-fs));color:var(--tap-muted, #6B5B78);margin-top:1px}
.tap-root .tap-pf-check{width:24px;height:24px;border-radius:7px;border:1.5px solid #EDE6DA;background:#fff;display:grid;place-items:center;font-size:calc(0.875 * var(--tap-fs));color:#fff;flex-shrink:0;transition:border-color .15s ease,background .15s ease}
.tap-root .tap-pf-card.is-on .tap-pf-check{border-color:var(--tap-purple, #6109BE);background:var(--tap-purple, #6109BE)}
.tap-root .tap-pf-step{display:flex;align-items:center;gap:10px;flex-shrink:0}
.tap-root .tap-pf-step button{width:32px;height:32px;border-radius:9px;display:grid;place-items:center;font-size:calc(1.0625 * var(--tap-fs));line-height:1;cursor:pointer;font-family:inherit}
.tap-root .tap-pf-step-minus{border:1.5px solid #E6D8FA;background:#fff;color:var(--tap-purple, #6109BE)}
.tap-root .tap-pf-step-plus{border:none;background:var(--tap-purple, #6109BE);color:#fff}
.tap-root .tap-pf-step button:disabled{opacity:.4;cursor:not-allowed}
.tap-root .tap-pf-count{font-size:calc(1 * var(--tap-fs));font-weight:700;color:#241832;min-width:20px;text-align:center}

/* Chadhava — offering summary (violet-soft, JSX) */
.tap-root .tap-chad-sum{background:#F3ECFD;border-radius:var(--tap-r-xl);padding:16px;margin:8px 0 18px}
.tap-root .tap-chad-sum-hd{font-size:calc(0.7813 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE);letter-spacing:.06em;margin-bottom:12px}
.tap-root .tap-chad-sum-row{display:flex;justify-content:space-between;margin-bottom:8px;font-size:calc(0.8438 * var(--tap-fs));color:var(--tap-muted, #6B5B78)}
.tap-root .tap-chad-sum-row span:last-child{font-weight:700;color:#241832}
.tap-root .tap-chad-sum-line{height:1px;background:#E6D8FA;margin:10px 0}
.tap-root .tap-chad-sum-total{display:flex;justify-content:space-between;align-items:center}
.tap-root .tap-chad-sum-total span:first-child{font-family:"Fraunces",Georgia,serif;font-size:calc(1 * var(--tap-fs));font-weight:600;color:#241832}
.tap-root .tap-chad-sum-amt{font-family:"Fraunces",Georgia,serif;font-size:calc(1.375 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE)}

@media (prefers-reduced-motion: reduce){
  .tap-root .tap-tier-check,.tap-root .tap-slot2-radio,.tap-root .tap-pf-card,.tap-root .tap-pf-check{transition:none}
}

/* ============================================================
   PROFILE HUB v3 — JSX parity (header card · wallet · booking cards)
   ============================================================ */

/* ── v7.6.4: TWO card primitives, not three idioms ───────────────────────
   The dashboard shipped three disagreeing card treatments visible in a
   single scroll: a violet gradient hero (.tap-phub-card, radius 22px), a
   white card at 20px with a token border (.tap-prof-card), and a white
   card at 16px with a HARDCODED #EDE6DA border and a different shadow
   (.tap-bkcard). Three radii, two borders, two shadows, three paddings.

   There are now exactly two primitives:
     FEATURE — gradient, for the identity and balance headers.
     CONTENT — white, for everything the devotee reads or edits.
   Both are token-driven, and CONTENT picks up the same admin-configurable
   --tap-card-radius the listing cards already use, so the whole app
   agrees on one corner. */

/* FEATURE card — profile hub header + wallet balance. */
.tap-root .tap-phub-card,
.tap-root .tap-wallet-card{
	background:var(--tap-profile-grad,var(--grad-sacred,linear-gradient(140deg,#42077F,#6109BE)));
	border-radius:var(--tap-r-4xl);
	padding:20px;
	color:#fff;
	box-shadow:0 12px 30px rgba(97,9,190,.28);
}
.tap-root .tap-phub-card{margin-bottom:18px}

/* CONTENT card — booking cards + profile field groups. */
.tap-root .tap-prof-card,
.tap-root .tap-bkcard{
	background:var(--tap-card,#fff);
	border:1px solid var(--tap-line,#EDE6DA);
	border-radius:var(--tap-card-radius,var(--tap-r-xl));
	padding:16px;
	margin-bottom:14px;
	box-shadow:0 2px 12px rgba(66,7,127,.06);
}
/* The profile group ends in form fields that carry their own bottom
   margin — trim the card's own so the gap is not doubled. */
.tap-root .tap-prof-card{padding-bottom:4px}
.tap-root .tap-phub-top{display:flex;align-items:center;gap:14px}
.tap-root .tap-phub-avatar{width:58px;height:58px;border-radius:var(--tap-r-2xl);background:rgba(255,255,255,.18);display:grid;place-items:center;font-family:"Fraunces",Georgia,serif;font-size:calc(1.5 * var(--tap-fs));font-weight:700;color:#fff;flex-shrink:0}
.tap-root .tap-phub-id{flex:1;min-width:0}
.tap-root .tap-phub-name{font-family:"Fraunces",Georgia,serif;font-size:calc(1.1875 * var(--tap-fs));font-weight:600;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* v6.9.13: on the narrowest phones (≤380px) keep the profile card from crowding —
   trim the padding and let the tier badge wrap under the name instead of squeezing it. */
@media(max-width:380px){
  .tap-root .tap-phub-card{padding:16px}
  .tap-root .tap-phub-avatar{width:52px;height:52px;font-size:calc(1.3125 * var(--tap-fs))}
  .tap-root .tap-phub-name{font-size:calc(1.0625 * var(--tap-fs))}
  .tap-root .tap-phub-stat-num{font-size:calc(1.125 * var(--tap-fs))}
}
.tap-root .tap-phub-meta{font-size:calc(0.7813 * var(--tap-fs));color:rgba(255,255,255,.8);margin-top:2px}
.tap-root .tap-phub-tier{display:inline-flex;align-items:center;gap:5px;background:rgba(255,255,255,.16);padding:5px 11px;border-radius:var(--tap-r-full);font-size:calc(0.7188 * var(--tap-fs));font-weight:700;flex-shrink:0}
.tap-root .tap-phub-tier-star{color:var(--tap-marigold, #F99000)}
.tap-root .tap-phub-stats{display:flex;margin-top:18px}
.tap-root .tap-phub-stat{flex:1;text-align:center}
.tap-root .tap-phub-stat.has-div{border-right:1px solid rgba(255,255,255,.16)}
.tap-root .tap-phub-stat-num{font-family:"Fraunces",Georgia,serif;font-size:calc(1.25 * var(--tap-fs));font-weight:700;line-height:1.1}
.tap-root .tap-phub-stat-lbl{font-size:calc(0.6875 * var(--tap-fs));color:rgba(255,255,255,.75);margin-top:2px}
.tap-root .tap-phub-uid{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:16px;background:rgba(255,255,255,.1);border:1px dashed rgba(255,255,255,.3);border-radius:var(--tap-r-md);padding:9px 14px}
.tap-root .tap-phub-uid-lbl{font-size:calc(0.6875 * var(--tap-fs));color:rgba(255,255,255,.72);font-weight:600}
.tap-root .tap-phub-uid-val{font-family:monospace;font-weight:800;font-size:calc(0.875 * var(--tap-fs));letter-spacing:.05em}

/* Wallet tab (JSX) — the card box itself is the shared FEATURE primitive above. */
.tap-root .tap-wallet-lbl{font-size:calc(0.7813 * var(--tap-fs));color:rgba(255,255,255,.8)}
.tap-root .tap-wallet-bal{font-family:"Fraunces",Georgia,serif;font-size:calc(2.125 * var(--tap-fs));font-weight:700;margin:4px 0 8px}
.tap-root .tap-wallet-note{font-size:calc(0.7813 * var(--tap-fs));color:rgba(255,255,255,.8);line-height:1.45}
.tap-root .tap-wtxn-list{display:flex;flex-direction:column}
.tap-root .tap-wtxn{display:flex;align-items:center;gap:12px;padding:13px 2px;border-bottom:1px solid #EDE6DA}
.tap-root .tap-wtxn:last-child{border-bottom:none}
.tap-root .tap-wtxn-ic{width:38px;height:38px;border-radius:11px;background:#F3ECFD;color:var(--tap-purple, #6109BE);display:grid;place-items:center;font-size:calc(1.125 * var(--tap-fs));font-weight:800;flex-shrink:0}
.tap-root .tap-wtxn-ic.is-credit{background:#E7F5EC;color:var(--tap-ok, #1A7D3C)}
.tap-root .tap-wtxn-mid{flex:1;min-width:0}
.tap-root .tap-wtxn-reason{font-size:calc(0.875 * var(--tap-fs));font-weight:600;color:#241832}
.tap-root .tap-wtxn-date{font-size:calc(0.75 * var(--tap-fs));color:#9C8FA8;margin-top:1px}
.tap-root .tap-wtxn-amt{font-size:calc(0.9063 * var(--tap-fs));font-weight:700;color:#241832;white-space:nowrap}
.tap-root .tap-wtxn-amt.is-credit{color:var(--tap-ok, #1A7D3C)}

/* Booking cards (JSX) — code + status badge, serif title, temple, footer.
   The card box itself is the shared CONTENT primitive above. */
.tap-root .tap-bkcard-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}
.tap-root .tap-bkcard-code{font-size:calc(0.75 * var(--tap-fs));font-weight:700;color:#9C8FA8;letter-spacing:.04em}
.tap-root .tap-bkcard-badge{font-size:calc(0.6875 * var(--tap-fs));font-weight:700;padding:4px 11px;border-radius:var(--tap-r-full)}
.tap-root .tap-bkcard-badge.is-upcoming{background:#F3ECFD;color:var(--tap-purple, #6109BE)}
.tap-root .tap-bkcard-badge.is-completed{background:#E7F5EC;color:var(--tap-ok, #1A7D3C)}
.tap-root .tap-bkcard-badge.is-cancelled{background:#FDECED;color:#C0392B}
.tap-root .tap-bkcard-badge.is-pendingpay{background:#FFF4E0;color:#9A5B00}
.tap-root .tap-bkcard-name{font-family:"Fraunces",Georgia,serif;font-size:calc(1.0625 * var(--tap-fs));font-weight:600;color:#241832;line-height:1.25}
.tap-root .tap-bkcard-temple{display:flex;align-items:center;gap:5px;margin-top:5px;font-size:calc(0.7813 * var(--tap-fs));color:var(--tap-muted, #6B5B78)}
.tap-root .tap-bkcard-pin{font-size:calc(0.75 * var(--tap-fs))}
.tap-root .tap-bkcard-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:14px;padding-top:14px;border-top:1px solid #EDE6DA}
.tap-root .tap-bkcard-date{font-size:calc(0.8125 * var(--tap-fs));color:var(--tap-muted, #6B5B78);white-space:nowrap}
.tap-root .tap-bkcard-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}

/* ============================================================
   SINGLE PUJA (CPT) v3 — JSX PujaDetail parity
   ============================================================ */
.tap-root .tap-pdp-hero{position:relative;border-radius:var(--tap-r-4xl);overflow:hidden;min-height:230px;display:flex;align-items:flex-end;margin-bottom:22px;box-shadow:0 14px 34px rgba(66,7,127,.22)}
.tap-root .tap-pdp-hero-media{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.tap-root .tap-pdp-hero-scrim{position:absolute;inset:0;background:linear-gradient(180deg,rgba(36,24,50,0) 30%,rgba(36,24,50,.72) 100%)}
.tap-root .tap-pdp-hero-info{position:relative;padding:24px;color:#fff;width:100%}
.tap-root .tap-pdp-hero-eyebrow{font-size:calc(0.75 * var(--tap-fs));text-transform:uppercase;letter-spacing:.09em;opacity:.85;margin-bottom:7px;font-weight:600}
.tap-root .tap-pdp-hero-title{font-family:"Fraunces",Georgia,serif;font-size:clamp(26px,4.5vw,42px);font-weight:700;line-height:1.15;margin:0 0 10px;color:#fff;text-shadow:0 2px 10px rgba(0,0,0,.25)}
.tap-root .tap-pdp-hero-rating{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.tap-root .tap-pdp-stars{color:var(--tap-marigold, #F99000);font-size:calc(0.9375 * var(--tap-fs));letter-spacing:2px}
.tap-root .tap-pdp-rating-num{font-weight:700;font-size:calc(0.875 * var(--tap-fs))}
.tap-root .tap-pdp-rating-count{font-size:calc(0.8125 * var(--tap-fs));color:rgba(255,255,255,.75)}
.tap-root .tap-pdp-watch{position:absolute;top:18px;right:18px;background:rgba(255,255,255,.92);color:#42077F;border:none;border-radius:var(--tap-r-full);padding:8px 16px;font-size:calc(0.8125 * var(--tap-fs));font-weight:700;cursor:pointer}

/* Buy card */
.tap-root .tap-pdp-buy{background:#FBF7F0;border:1px solid #F0E7D6;border-radius:var(--tap-r-2xl);padding:18px}
.tap-root .tap-pdp-from{margin-bottom:12px}
.tap-root .tap-pdp-from-lbl{font-size:calc(0.6875 * var(--tap-fs));color:#9C8FA8;text-transform:uppercase;letter-spacing:.07em;font-weight:600}
.tap-root .tap-pdp-from-price{font-family:"Fraunces",Georgia,serif;font-size:calc(1.875 * var(--tap-fs));font-weight:700;color:var(--tap-purple, #6109BE);line-height:1.1;margin-top:2px}
.tap-root .tap-pdp-tiers{margin-bottom:16px}
.tap-root .tap-pdp-tier-row{display:flex;justify-content:space-between;align-items:center;padding:9px 0;border-bottom:1px solid #EDE4D3;font-size:calc(0.875 * var(--tap-fs))}
.tap-root .tap-pdp-tier-row:last-child{border-bottom:none}
.tap-root .tap-pdp-tier-name{font-weight:600;text-transform:capitalize;color:#241832}
.tap-root .tap-pdp-tier-price strong{color:var(--tap-purple, #6109BE);font-size:calc(0.9063 * var(--tap-fs))}
.tap-root .tap-pdp-tier-price del{font-size:calc(0.75 * var(--tap-fs));color:#9C8FA8;margin-left:5px}
.tap-root .tap-pdp-book{text-align:center;text-decoration:none;display:block;padding:15px;border-radius:var(--tap-r-lg);font-family:"Fraunces",Georgia,serif;font-size:calc(1 * var(--tap-fs))}
.tap-root .tap-pdp-signals{margin-top:16px;list-style:none;padding:0;display:grid;gap:9px}
.tap-root .tap-pdp-signals li{display:flex;align-items:center;gap:9px;font-size:calc(0.8125 * var(--tap-fs));color:#4A3D57}
.tap-root .tap-pdp-signals b{color:#241832;font-weight:700}
.tap-root .tap-pdp-sig-ic{width:22px;height:22px;border-radius:7px;background:#F3ECFD;display:grid;place-items:center;font-size:calc(0.75 * var(--tap-fs));flex-shrink:0}
/* ===== END assets/css/tap-premium.css ===== */

/* ===== BEGIN assets/css/tap-adaptive.css ===== */
/* =====================================================================
   tap-adaptive.css  (v4.9.31)  — device-adaptive presentation layer
   Enqueued LAST so it authoritatively resolves the mobile↔desktop split.
   Breakpoints mirror TAP_Device:  mobile <768 · tablet 768–1023 · desktop ≥1024
   Nothing here changes data/markup semantics — layout & interaction only.
   ===================================================================== */

/* ---------------------------------------------------------------------
   1. NAVIGATION SWAP  (the core desktop fix)
   Mobile + tablet  → fixed bottom app-nav (native feel, one-hand reach)
   Desktop          → sticky top nav bar, bottom nav removed
   The two-class selector .tap-bottom-nav.tap-appshell-nav (0,2,0) out-ranks
   the base single-class rule, so no minified source edits are needed.
   --------------------------------------------------------------------- */
.tap-topnav { display: none; }

@media (max-width: 1023px) {
	.tap-bottom-nav.tap-appshell-nav { display: flex !important; }
	.tap-topnav { display: none !important; }
}

@media (min-width: 1024px) {
	.tap-bottom-nav.tap-appshell-nav { display: none !important; }
	.tap-topnav { display: flex !important; }
	/* No fixed bottom bar on desktop → reclaim the reserved space, and make room
	   for the FIXED top bar (v4.9.32 fix: the nav prints in wp_footer, so a sticky
	   top:0 sat at the bottom of the page — fixed positioning pins it to the top). */
	body.tap-canvas { padding-bottom: 0 !important; padding-top: 66px !important; }
	/* WhatsApp support FAB sits bottom-right on desktop, clear of content. */
	.tap-wa-fab { bottom: 24px !important; }
}

/* Desktop top navigation bar ---------------------------------------- */
.tap-topnav {
	position: fixed; top: 0; left: 0; right: 0; z-index: 950;
	align-items: center; gap: 8px;
	width: 100%;
	background: rgba(255,255,255,.92);
	backdrop-filter: saturate(180%) blur(20px);
	border-bottom: 1px solid var(--tap-line, #ece6f2);
	padding: 10px clamp(16px, 4vw, 40px);
	box-shadow: 0 2px 20px rgba(97,9,190,.06);
}
.tap-topnav-brand {
	display: inline-flex; align-items: center; gap: 9px;
	text-decoration: none; margin-right: auto;
}
.tap-topnav-brand .tap-topnav-om { font-size:calc(1.5 * var(--tap-fs)); color: var(--tap-purple, #6109be); line-height: 1; }
.tap-topnav-brand .tap-topnav-name {
	font-family: Fraunces, Georgia, serif; font-weight: 700; font-size:calc(1.25 * var(--tap-fs));
	color: var(--tap-ink, #1e0a2e); letter-spacing: -.01em;
}
.tap-topnav-brand .tap-topnav-logo { height: 36px; max-width: 200px; width: auto; object-fit: contain; display: block; }
.tap-topnav-links { display: inline-flex; align-items: center; gap: 4px; }
.tap-topnav-link {
	display: inline-flex; align-items: center; gap: 7px;
	padding: 9px 16px; border-radius: var(--tap-r-full);
	font-size:calc(0.9375 * var(--tap-fs)); font-weight: 700; text-decoration: none;
	color: var(--tap-muted, #6b5b78);
	transition: background .15s ease, color .15s ease;
	white-space: nowrap;
}
.tap-topnav-link .tap-topnav-ic { font-size:calc(1 * var(--tap-fs)); line-height: 1; }
.tap-topnav-link:hover { background: var(--tap-purple-pale, #f0e8fd); color: var(--tap-purple, #6109be); }
.tap-topnav-link.active { background: var(--tap-purple, #6109be); color: #fff; }
.tap-topnav-cta {
	margin-left: 6px; padding: 10px 20px;
	background: var(--grad-sacred, linear-gradient(135deg,#6109be,#d75c27));
	color: #fff !important; border-radius: var(--tap-r-full); font-weight: 800;
}
.tap-topnav-cta:hover { filter: brightness(1.05); background: var(--grad-sacred, linear-gradient(135deg,#6109be,#d75c27)); }

/* ---------------------------------------------------------------------
   2. DESKTOP LAYOUT  — stop the app reading as a stretched phone column.
   The content column gets a real desktop width; horizontal rails become
   multi-column grids (reuses patterns already present in premium.css).
   --------------------------------------------------------------------- */
@media (min-width: 1024px) {

	/* Home hero reads as a banner, not a full-bleed phone card. */
	.tap-hero-compact { padding: 40px 44px 44px; }
	.tap-hero-compact-title { font-size:calc(2.125 * var(--tap-fs)); max-width: 18ch; }

	/* Card rails → responsive grids on desktop (no awkward side-scroll).
	   These MUST stay inside the ≥1024 query: at phone widths the rails are
	   deliberately swipeable, and a grid here collapses them into a stack. */
	.tap-home-root .tap-hscroll-snap,
	.tap-fcard-rail,
	.tap-testimonials {
		display: grid;
		grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
		gap: 18px; overflow: visible;
	}
	.tap-fcard, .tap-fav-card, .tap-testi-card { width: auto !important; }

	/* Deity row centered rather than left-scrolling. */
	.tap-deity-grid { justify-content: center; }
}


/* Tablet: hybrid — a touch of extra breathing room, keep touch nav. */
@media (min-width: 768px) and (max-width: 1023px) {
	.tap-hero-compact { padding: 30px 30px 32px; }
}

/* ---------------------------------------------------------------------
   3. INTERACTION PATTERN  — hover only where a real pointer exists.
   Touch devices should not get sticky :hover states after a tap.
   --------------------------------------------------------------------- */
@media (hover: none) {
	.tap-pcard:hover, .tap-fcard:hover, .tap-tier-card:hover,
	.tap-slot:hover, .tap-addon-card:hover, .tap-plan-card:hover,
	.tap-deity-item:hover .tap-deity-icon { transform: none; box-shadow: inherit; }
}

/* ---------------------------------------------------------------------
   4. ADAPTIVE OVERLAY  (TAPDevice.overlay)
   Touch  → bottom sheet (rounded top, slide-up, drag handle)
   Desktop→ centered dialog (rounded, scale-in)
   --------------------------------------------------------------------- */
.tap-ovl {
	position: fixed; inset: 0; z-index: 9200;
	background: rgba(13,8,32,.55); backdrop-filter: blur(6px);
	display: flex; opacity: 0; transition: opacity .2s ease;
}
.tap-ovl.is-open { opacity: 1; }
.tap-ovl.is-closing { opacity: 0; }
.tap-ovl-panel {
	background: #fff; position: relative; width: 100%;
	max-height: 92vh; overflow-y: auto; overscroll-behavior: contain;
}
.tap-ovl-x {
	position: absolute; top: 14px; right: 16px; z-index: 2;
	width: 32px; height: 32px; border: none; border-radius: 50%;
	background: var(--tap-line, #ece6f2); color: var(--tap-muted, #6b5b78);
	font-size:calc(1.25 * var(--tap-fs)); line-height: 1; cursor: pointer;
	display: grid; place-items: center; transition: background .15s ease;
}
.tap-ovl-x:hover { background: var(--tap-err, #c0392b); color: #fff; }
.tap-ovl-handle { width: 40px; height: 4px; border-radius: var(--tap-r-2xs); background: var(--tap-line,#ece6f2); margin: 10px auto 6px; }
.tap-ovl-title { font-family: Fraunces, Georgia, serif; font-size:calc(1.25 * var(--tap-fs)); font-weight: 700; padding: 4px 24px 0; margin: 0; color: var(--tap-ink,#1e0a2e); }
.tap-ovl-body { padding: 16px 24px 28px; }

/* Sheet (touch) */
.tap-ovl-sheet { align-items: flex-end; justify-content: center; }
.tap-ovl-sheet .tap-ovl-panel {
	max-width: 560px; border-radius: 24px 24px 0 0;
	transform: translateY(100%); transition: transform .28s cubic-bezier(.34,1.4,.5,1);
	padding-bottom: env(safe-area-inset-bottom, 0px);
}
.tap-ovl-sheet.is-open .tap-ovl-panel { transform: translateY(0); }

/* Dialog (desktop) */
.tap-ovl-dialog { align-items: center; justify-content: center; padding: 24px; }
.tap-ovl-dialog .tap-ovl-panel {
	max-width: 520px; border-radius: var(--tap-r-3xl);
	transform: scale(.96); opacity: 0; transition: transform .2s ease, opacity .2s ease;
	box-shadow: 0 24px 60px rgba(13,8,32,.35);
}
.tap-ovl-dialog .tap-ovl-panel[data-size="lg"] { max-width: 760px; }
.tap-ovl-dialog.is-open .tap-ovl-panel { transform: scale(1); opacity: 1; }

@media (prefers-reduced-motion: reduce) {
	.tap-ovl, .tap-ovl-panel { transition: none !important; }
}

/* ─────────────────────────────────────────────────────────────────────
   v4.9.34 — QA BUG-06: horizontal overflow at ~1024–1279px viewports.
   Root causes: the 1160px desktop container could exceed viewports just
   under it (e.g. 1150px), and the sticky bottom bar / add-on grid used
   fixed tracks with non-shrinkable flex children. Guarantee gutters,
   let flex children shrink (min-width:0) and let rows wrap instead of
   clipping prices and trust badges.
   ──────────────────────────────────────────────────────────────────── */
body.tap-canvas { overflow-x: clip; }

@media (min-width: 1024px) {
	.tap-addons-grid { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
	.tap-addon-card { min-width: 0; }
	.tap-addon-bottom { flex-wrap: wrap; gap: 6px; }
	.tap-addon-price-tag { white-space: nowrap; }
}

/* Sticky checkout bar: shrink + wrap, never clip (all widths). */
.tap-sticky { flex-wrap: wrap; }
.tap-sticky-inner { flex-wrap: wrap; min-width: 0; }
.tap-sticky-price { min-width: 0; }
.tap-sticky-trust { flex-wrap: wrap; row-gap: 4px; }
.tap-sticky .tap-btn-gold,
.tap-sticky .tap-btn-cta { max-width: 100%; }

/* =====================================================================
   v5.7.0 — Detail Page & CTA layer (DIVSA → 📄 Detail Page & CTA)
   Loaded LAST (after tap-premium), so these rules win the cascade
   without a single !important. Every rule below is inert until the
   admin changes a setting: the custom-property fallbacks and the
   body-class guards reproduce v5.6.0 exactly at the defaults.
   ===================================================================== */

/* ---- #7 Participation cards: size + columns from TAP_PDP css_vars ---- */
.tap-root .tap-tiers { grid-template-columns: var(--tap-tier-cols-mobile, 1fr); gap: 12px; }
@media (min-width: 768px) {
	.tap-root .tap-tiers { grid-template-columns: var(--tap-tier-cols-desktop, var(--tap-tier-cols-mobile, 1fr)); }
}
.tap-root .tap-tier-card { padding: var(--tap-tier-pad, 14px 16px); }
.tap-root .tap-tier-card.is-popular { padding-top: var(--tap-tier-pad-top-pop, 14px); }
.tap-root .tap-tier-icon { width: var(--tap-tier-icon, 44px); height: var(--tap-tier-icon, 44px); }
.tap-root .tap-tier-icon svg { width: calc(var(--tap-tier-icon, 44px) * .64); height: calc(var(--tap-tier-icon, 44px) * .5); }
.tap-root .tap-tier-name { font-size: var(--tap-tier-name, 15px); }

/* Multi-column cards flip to a vertical layout (icon above name, price
   below) — the shipped horizontal row does not survive a narrow column. */
.tap-tiercols-m2 .tap-root .tap-tier-card,
.tap-tiercols-d2 .tap-root .tap-tier-card,
.tap-tiercols-d3 .tap-root .tap-tier-card { flex-direction: column; align-items: flex-start; gap: 10px; }
.tap-tiercols-m2 .tap-root .tap-tier-price-block,
.tap-tiercols-d2 .tap-root .tap-tier-price-block,
.tap-tiercols-d3 .tap-root .tap-tier-price-block { align-items: flex-start; text-align: left; }
.tap-tiercols-m2 .tap-root .tap-tier-check,
.tap-tiercols-d2 .tap-root .tap-tier-check,
.tap-tiercols-d3 .tap-root .tap-tier-check { position: absolute; top: 12px; right: 12px; }
@media (max-width: 767.98px) {
	/* Desktop-only column choices never squeeze a phone. */
	.tap-tiercols-d2 .tap-root .tap-tier-card,
	.tap-tiercols-d3 .tap-root .tap-tier-card { flex-direction: row; align-items: center; }
	.tap-tiercols-d2 .tap-root .tap-tier-check,
	.tap-tiercols-d3 .tap-root .tap-tier-check { position: static; }
	.tap-tiercols-d2 .tap-root .tap-tier-price-block,
	.tap-tiercols-d3 .tap-root .tap-tier-price-block { align-items: flex-end; text-align: right; }
}

/* ---- #2 Price after participation: card prices reveal on selection ---- */
.tap-root .tap-tiers-price-after .tap-tier-card:not(.is-sel) .tap-tier-price-block { display: none; }
.tap-root .tap-tiers-price-after .tap-tier-card:not(.is-sel) .tap-tier-tapnote {
	font-size:calc(0.7188 * var(--tap-fs)); font-weight: 600; color: var(--tap-muted, #9c8fa8);
}
.tap-root .tap-tiers-price-after .tap-tier-card.is-sel .tap-tier-tapnote { display: none; }

/* ═══ v6.9.12 — BOTTOM-SHEET CARD NORMALISATION (overlap fix) ═══════════════
   The participation & add-on sheets are a FIXED ~520px panel at every
   viewport, but they mount on <body> and so inherit the admin's PAGE-level
   tier-column setting (e.g. tap-tiercols-d3 → three 153px columns). Crammed
   into 520px, the tick, the "Most Popular" badge and the add-on "Add" button
   all collide with the card text (reported on desktop-width sheets).
   A sheet is intrinsically narrow, so its cards ALWAYS stack as one-column
   rows with the tick and Add button in normal flow — never absolutely
   dropped onto the title. !important + the body-scoped selector beat both the
   inherited grid variable and the .tap-tiercols-d3 column rule. */
.tap-root .tap-bsheet-body .tap-tiers { grid-template-columns: 1fr !important; gap: 12px; }
.tap-root .tap-bsheet-body .tap-tier-card {
	flex-direction: row !important; align-items: center; gap: 13px;
	padding: 14px 16px; overflow: visible;
}
.tap-root .tap-bsheet-body .tap-tier-card.is-popular { padding-top: 20px; }
.tap-root .tap-bsheet-body .tap-tier-head { flex: 1; min-width: 0; margin-top: 0; }
.tap-root .tap-bsheet-body .tap-tier-price-block {
	margin-left: auto; flex-direction: column; align-items: flex-end;
	text-align: right; flex-shrink: 0; gap: 0;
}
.tap-root .tap-bsheet-body .tap-tier-tapnote { flex-basis: auto; margin-left: auto; text-align: right; white-space: nowrap; }
.tap-root .tap-bsheet-body .tap-tier-check {
	position: static !important; opacity: 1 !important; transform: none !important;
	width: 22px; height: 22px; border: 2px solid var(--tap-line, #ece6f2);
	background: #fff; color: transparent; flex-shrink: 0;
}
.tap-root .tap-bsheet-body .tap-tier-card.is-sel .tap-tier-check {
	border-color: var(--tap-purple, #6109be); background: var(--tap-purple, #6109be); color: #fff;
}
.tap-root .tap-bsheet-body .tap-tier-badge { top: 0; left: auto; right: 16px; transform: none; }

/* Add-on rows: one per line, so the price + "Add" pill get the full sheet
   width and never clip against the panel edge. */
.tap-root .tap-bsheet-body .tap-addons-grid { grid-template-columns: 1fr !important; }
.tap-root .tap-bsheet-body .tap-addon-card { min-width: 0; }
.tap-root .tap-bsheet-body .tap-addon-bottom { gap: 12px; }
.tap-root .tap-bsheet-body .tap-addon-togbtn { flex-shrink: 0; white-space: nowrap; }

/* ---- #3/#9 Booking-page sticky CTA bar: style + alignment ------------- */
/* pill → floating rounded dock (the app look), full → edge-to-edge bar.
   auto (default) keeps the shipped behaviour: bar on phones, dock ≥1024. */
.tap-ctabar-pill .tap-sticky {
	left: 50%; right: auto; transform: translateX(-50%);
	width: calc(100% - 24px); max-width: 640px;
	bottom: 10px; border-radius: var(--tap-r-2xl);
	border: 1px solid var(--tap-line, #ece6f2);
}
.tap-ctabar-pill.tap-ctabar-left .tap-sticky { left: 12px; transform: none; }
.tap-ctabar-pill.tap-ctabar-right .tap-sticky { left: auto; right: 12px; transform: none; }
.tap-ctabar-full .tap-sticky {
	left: 0; right: 0; transform: none; max-width: none; width: auto;
	border-radius: 0; bottom: 0;
}
@media (min-width: 1024px) {
	/* full mode must also beat the desktop dock rule in tap-frontend.css */
	.tap-ctabar-full .tap-sticky { left: 0; right: 0; transform: none; max-width: none; border-radius: 0; }
	.tap-ctabar-pill.tap-ctabar-left .tap-sticky { left: 24px; }
	.tap-ctabar-pill.tap-ctabar-right .tap-sticky { right: 24px; }
}

/* ---- #5 Profile header styles (DIVSA → Detail Page & CTA) ------------- */
/* brand (default) now follows the Brand Customizer via --grad-sacred in
   tap-premium.css. gold + soft are the two alternatives. */
.tap-profile-gold .tap-root .tap-phub-card,
.tap-profile-gold .tap-root .tap-wallet-card {
	background: var(--grad-gold, linear-gradient(135deg, #f99000, #f5c842));
	color: #3a2400; box-shadow: 0 12px 30px rgba(249, 144, 0, .3);
}
.tap-profile-gold .tap-root .tap-phub-meta,
.tap-profile-gold .tap-root .tap-phub-stat-lbl,
.tap-profile-gold .tap-root .tap-phub-uid-lbl,
.tap-profile-gold .tap-root .tap-wallet-lbl,
.tap-profile-gold .tap-root .tap-wallet-note { color: rgba(58, 36, 0, .75); }
.tap-profile-gold .tap-root .tap-phub-avatar,
.tap-profile-gold .tap-root .tap-phub-tier,
.tap-profile-gold .tap-root .tap-phub-uid { background: rgba(255, 255, 255, .35); color: #3a2400; }
.tap-profile-gold .tap-root .tap-phub-uid { border-color: rgba(58, 36, 0, .25); }
.tap-profile-gold .tap-root .tap-phub-uid-val { color: #3a2400; }

.tap-profile-soft .tap-root .tap-phub-card,
.tap-profile-soft .tap-root .tap-wallet-card {
	background: var(--tap-card, #fff);
	color: var(--tap-ink, #1e0a2e);
	border: 1px solid var(--tap-line, #ece6f2);
	box-shadow: 0 4px 20px rgba(30, 10, 46, .07);
}
.tap-profile-soft .tap-root .tap-phub-meta,
.tap-profile-soft .tap-root .tap-phub-stat-lbl,
.tap-profile-soft .tap-root .tap-phub-uid-lbl,
.tap-profile-soft .tap-root .tap-wallet-lbl,
.tap-profile-soft .tap-root .tap-wallet-note { color: var(--tap-muted, #6b5b78); }
.tap-profile-soft .tap-root .tap-phub-avatar { background: var(--tap-purple-pale, #f0e8fd); color: var(--tap-purple, #6109be); }
.tap-profile-soft .tap-root .tap-phub-tier { background: var(--tap-purple-pale, #f0e8fd); color: var(--tap-purple, #6109be); }
.tap-profile-soft .tap-root .tap-phub-uid { background: var(--tap-bg, #faf7fd); border-color: var(--tap-line, #ece6f2); }
.tap-profile-soft .tap-root .tap-phub-uid-val { color: var(--tap-ink, #1e0a2e); }
.tap-profile-soft .tap-root .tap-phub-stat.has-div { border-right-color: var(--tap-line, #ece6f2); }
.tap-profile-soft .tap-root .tap-wallet-bal { color: var(--tap-purple, #6109be); }

/* ---- #6 PDP gallery: give the server-rendered gallery the same
        comfortable sizing the SPA one gets, before Layout Studio
        upgrades it into carousel/slider/lightbox. ------------------------ */
.tap-root .tap-gallery { grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); }
.tap-root .tap-gallery .tap-gthumb img { width: 100%; height: 100%; aspect-ratio: var(--tap-gal-ratio, 4/3); object-fit: cover; display: block; }

/* ---- #1 Responsive corrections (v5.6.0 testing feedback) -------------- */
/* Nothing here invents a new layout — it repairs the places where the
   phone layout leaked onto desktop or the desktop layout crushed phones. */

/* Phones: the root must never allow sideways scroll, media never overflows. */
.tap-root img, .tap-root video { max-width: 100%; height: auto; }
.tap-root { overflow-x: clip; }

@media (max-width: 767px) {
	/* PDP hero: phone-appropriate height (it inherited the desktop 230px+scrim). */
	.tap-root .tap-pdp-hero { min-height: 190px; }
	.tap-root .tap-pdp-hero-title { font-size: clamp(22px, 6.5vw, 30px); }
	/* Progress bar: three steps must fit a 360px screen without clipping. */
	.tap-root .tap-progress-bar { gap: 6px; }
	.tap-root .tap-ps-lbl { font-size:calc(0.6563 * var(--tap-fs)); }
	/* Detail sidebar stacks under content (belt-and-braces with tap-frontend). */
	.tap-root .tap-detail-layout { grid-template-columns: 1fr; }
	.tap-root .tap-sticky-box { position: static; }
	/* Floating PDP CTA bar: keep the button tappable, price readable. */
	.tap-pdp-floatbar { flex-wrap: wrap; gap: 8px; }
	.tap-pdp-floatbar .tap-pdp-book { min-width: 0 !important; flex: 1; }
}

@media (min-width: 768px) and (max-width: 1023px) {
	/* Tablets: two-column tier grid reads better than one long stack
	   when the admin chose auto — but ONLY when they opted into columns. */
	.tap-tiercols-d2 .tap-root .tap-tiers,
	.tap-tiercols-d3 .tap-root .tap-tiers { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 1024px) {
	/* Desktop booking flow: the content column used to render at phone
	   width inside a 1900px window (v5.6.0 feedback, screenshots 1+3).
	   The booking root now uses the same comfortable measure as the rest
	   of the app; sections keep their readable max width. */
	.tap-booking-root { max-width: 1160px; }
	/* PDP gallery thumbs can afford to be bigger on desktop. */
	.tap-root .tap-gallery { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); }
}

/* ═══════════════════════════════════════════════════════════════════════
   v5.8.0 — client testing round 2: mobile UI corrections (#8, #13),
   wallet payment card (#11), de-hardcoded UI controls (#6), date icon (#9)
   ═══════════════════════════════════════════════════════════════════════ */

/* ── #13 Participation cards: overflow, tapnote wrap, badge overlap ──── */
.tap-root .tap-tiers { max-width: 100%; }
.tap-root .tap-tiers > * { min-width: 0; }
.tap-root .tap-tier-card { min-width: 0; max-width: 100%; overflow: hidden; position: relative; }
.tap-root .tap-tier-card > * { min-width: 0; }
.tap-root .tap-tier-name,
.tap-root .tap-tier-who { overflow-wrap: anywhere; }
/* "Tap to see price" was a squeezed right column wrapping one word per
   line — on phones it now sits under the name as a quiet full-width note. */
.tap-root .tap-tier-tapnote { white-space: nowrap; }
.tap-tiercols-m2 .tap-root .tap-tier-tapnote,
.tap-tiercols-d2 .tap-root .tap-tier-tapnote,
.tap-tiercols-d3 .tap-root .tap-tier-tapnote { white-space: normal; }
@media (max-width: 767px) {
	.tap-root .tap-tier-card { flex-wrap: wrap; }
	.tap-root .tap-tier-tapnote { flex-basis: 100%; white-space: normal; margin-top: 2px; }
}
/* Most Popular badge: clipped inside the card corner, above content, never
   overlapping the tapnote/price. */
.tap-root .tap-tier-badge {
	position: absolute; top: 0; right: 0; z-index: 3;
	max-width: calc(100% - 12px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
	border-radius: 0 14px 0 12px; padding: 4px 10px; font-size:calc(0.6875 * var(--tap-fs)); line-height: 1.2;
}
.tap-root .tap-tier-card.is-popular { padding-top: max(var(--tap-tier-pad-top-pop, 26px), 26px); }
/* VIP price stack (#13): price / strike / save badge stack cleanly and wrap
   instead of overlapping each other or the card edge. */
.tap-root .tap-tier-price-block { flex-wrap: wrap; min-width: 0; max-width: 100%; row-gap: 2px; }
.tap-root .tap-tier-price,
.tap-root .tap-tier-orig,
.tap-root .tap-tier-save { min-width: 0; overflow-wrap: anywhere; }
.tap-root .tap-tier-save { white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 380px) {
	.tap-root .tap-tier-price { font-size:calc(1 * var(--tap-fs)); }
}

/* ── #13 Sticky footer: balance the price area vs the Book Now button ── */
.tap-root .tap-sticky { padding-right: max(14px, env(safe-area-inset-right)); padding-left: max(14px, env(safe-area-inset-left)); box-sizing: border-box; }
.tap-root .tap-sticky-inner { display: flex; align-items: center; gap: 10px; width: 100%; }
.tap-root .tap-sticky-price { flex: 1 1 auto; min-width: 0; overflow: hidden; }
.tap-root .tap-sticky-price > div { overflow: hidden; text-overflow: ellipsis; }
.tap-root .tap-sticky .tap-btn-cta { flex: 0 1 auto; min-width: 0; max-width: 62%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 420px) {
	.tap-root .tap-sticky .tap-btn-cta { padding-left: 16px; padding-right: 16px; max-width: 58%; }
	.tap-root .tap-sticky-trust { font-size:calc(0.6875 * var(--tap-fs)); }
}

/* ── #13 Sankalp form: inputs stack on phones, placeholders never cut ── */
.tap-root .tap-sankalp-grid { display: grid; grid-template-columns: 1fr; gap: 10px; }
@media (min-width: 560px) {
	.tap-root .tap-sankalp-grid { grid-template-columns: 1fr 1fr 1fr; }
}
.tap-root .tap-sankalp-grid .tap-input { min-width: 0; width: 100%; box-sizing: border-box; }

/* ── #13 Bottom navigation overlap: reserve room for nav + sticky bar ── */
@media (max-width: 1023px) {
	body.tap-canvas .tap-booking-root,
	body.tap-canvas .tap-root:has(> .tap-sticky) {
		padding-bottom: calc(150px + env(safe-area-inset-bottom, 0px));
	}
	.tap-root .tap-delivery-chips { display: flex; flex-wrap: wrap; gap: 8px; }
	.tap-root .tap-delivery-chip { min-width: 0; }
}

/* ── #13 Stepper: PACKAGE → DATE → PAY spacing evens out ─────────────── */
.tap-root .tap-progress-bar { display: flex; align-items: center; justify-content: space-between; width: 100%; }
.tap-root .tap-progress-bar .tap-progress-line { flex: 1 1 auto; min-width: 14px; }
.tap-root .tap-progress-bar .tap-progress-step { flex: 0 0 auto; }

/* ── #9 Date & Time icon: scales with its heading, everywhere ─────────── */
.tap-root .tap-step-h { font-size:calc(1.0625 * var(--tap-fs)); margin-bottom: 10px; }
.tap-root .tap-ic-dt { font-size: 1em; line-height: 1; display: inline-block; vertical-align: -0.05em; }
.tap-root .tap-date-note { background: #fff4e7; border-radius: var(--tap-r-sm); padding: 10px 14px; margin-bottom: 18px; font-size:calc(0.8125 * var(--tap-fs)); color: #854F0B; }

/* ── v7.6.4 Astrologer panel tabs ─────────────────────────────────────────
   Previously `.tap-tabs > .tap-tab`, which the theme styles as the dashboard's
   square TILE grid — two text tabs came out as 55x76 boxes on a phone, and the
   selected one was never marked because the shared rule keys off `.active`
   while the panel passes `is-active`. These are plain text tabs and scroll
   horizontally rather than squashing when an install enables Earnings. */
.tap-root .tap-astro-tabs {
	display: flex;
	gap: 4px;
	margin-bottom: 14px;
	border-bottom: 1px solid var(--tap-line, #ece6f2);
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;
}
.tap-root .tap-astro-tabs::-webkit-scrollbar { display: none; }
.tap-root .tap-astro-tab {
	flex: none;
	min-height: 44px;                /* touch target */
	padding: 10px 14px;
	background: none;
	border: 0;
	border-bottom: 2px solid transparent;
	margin-bottom: -1px;             /* sit on the container's rule */
	font: inherit;
	font-size:calc(0.875 * var(--tap-fs));
	font-weight: 700;
	color: var(--tap-muted, #6b5b78);
	white-space: nowrap;
	cursor: pointer;
}
.tap-root .tap-astro-tab.is-active {
	color: var(--tap-ink-accent, var(--tap-purple, #6109be));
	border-bottom-color: var(--tap-ink-accent, var(--tap-purple, #6109be));
}
.tap-root .tap-astro-tab:focus-visible { outline: 2px solid var(--tap-purple, #6109be); outline-offset: -2px; }

/* ── v7.6.4 Mobile account menu ───────────────────────────────────────────
   A phone gets a compact settings-style list and one section per page,
   instead of a tile strip and an inline panel sharing one viewport. These
   classes are only ever emitted on mobile (70-dashboard.js branches on
   TAPDevice.isMobile()), so no media query is needed to keep desktop clean —
   desktop never renders them. */
.tap-root .tap-mnav { margin-top: 16px; }
.tap-root .tap-mnav-grp {
	background: var(--tap-card, #fff);
	border: 1px solid var(--tap-line, #ece6f2);
	border-radius: var(--tap-card-radius, var(--tap-r-xl));
	overflow: hidden;
	margin-bottom: 14px;
}
.tap-root .tap-mnav-grp:last-child { margin-bottom: 0; }
.tap-root .tap-mnav-row {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto auto;
	align-items: center;
	gap: 12px;
	width: 100%;
	min-height: 52px;                /* comfortably over the 44px target */
	padding: 12px 15px;
	background: none;
	border: 0;
	border-bottom: 1px solid var(--tap-line, #ece6f2);
	font: inherit;
	text-align: left;
	color: var(--tap-ink, #1e0a2e);
	cursor: pointer;
}
.tap-root .tap-mnav-row:last-child { border-bottom: 0; }
.tap-root .tap-mnav-row:active { background: var(--tap-purple-pale, #f0e8fd); }
.tap-root .tap-mnav-row:focus-visible { outline: 2px solid var(--tap-purple, #6109be); outline-offset: -2px; }
.tap-root .tap-mnav-ic {
	display: grid; place-items: center;
	width: 34px; height: 34px; flex: none;
	border-radius: var(--tap-r-md, 10px);
	background: var(--tap-purple-pale, #f0e8fd);
	color: var(--tap-purple, #6109be);
}
.tap-root .tap-mnav-ic svg { width: 19px; height: 19px; }
.tap-root .tap-mnav-lb { font-size:calc(0.9375 * var(--tap-fs)); font-weight: 600; min-width: 0; }
.tap-root .tap-mnav-val {
	font-size:calc(0.8125 * var(--tap-fs)); font-weight: 700;
	color: var(--tap-muted, #6b5b78);
	font-variant-numeric: tabular-nums; white-space: nowrap;
}
.tap-root .tap-mnav-ch { display: grid; place-items: center; color: var(--tap-muted, #6b5b78); opacity: .7; }
.tap-root .tap-mnav-ch svg { width: 17px; height: 17px; }
/* Sign out has no icon, so its label takes the icon column too. */
.tap-root .tap-mnav-row.is-danger { grid-template-columns: minmax(0, 1fr); color: var(--tap-danger, #c0392b); }
.tap-root .tap-mnav-row.is-danger .tap-mnav-lb { font-weight: 700; }

/* ── Section page (one section, behind a back button) ─────────────────── */
.tap-root .tap-sview-bar {
	display: flex; align-items: center; gap: 10px;
	margin: 0 0 14px;
	min-height: 44px;
}
.tap-root .tap-sview-back {
	display: grid; place-items: center;
	width: 44px; height: 44px; flex: none;   /* full touch target */
	padding: 0; margin-left: -6px;
	border: 1px solid var(--tap-line, #ece6f2);
	border-radius: var(--tap-r-full);
	background: var(--tap-card, #fff);
	color: var(--tap-ink, #1e0a2e);
	cursor: pointer;
}
.tap-root .tap-sview-back:active { background: var(--tap-purple-pale, #f0e8fd); }
.tap-root .tap-sview-back:focus-visible { outline: 2px solid var(--tap-purple, #6109be); outline-offset: 2px; }
/* The registry ships one right-pointing chevron; this is the back arrow. */
.tap-root .tap-sview-back-ic { display: grid; place-items: center; transform: rotate(180deg); }
.tap-root .tap-sview-title {
	margin: 0; min-width: 0;
	font-size:calc(1.1875 * var(--tap-fs)); font-weight: 700;
	color: var(--tap-ink, #1e0a2e);
	overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.tap-root .tap-sview-title:focus { outline: none; }   /* focused only to announce */

/* ── v7.6.4 Payment method chooser ────────────────────────────────────────
   Replaces the v5.8.0 `.tap-wpay` cards. Those sat AFTER the Pay button
   behind an "— or —" divider and each carried its own CTA, so the checkout
   showed two competing primary buttons. The wallet is now a radio option
   inside the bill: one breakdown, one button.

   Native <input type=radio> is kept in the flow (not display:none) so it
   stays focusable and reachable by assistive tech; it is visually sized
   rather than replaced by a drawn pseudo-element. */
.tap-root .tap-paymethods { margin-top: 14px; }
.tap-root .tap-paymethods-hd {
	font-weight: 800; color: var(--tap-ink, #1e0a2e);
	font-size:calc(0.8125 * var(--tap-fs));
	letter-spacing: .04em; text-transform: uppercase;
	margin-bottom: 8px;
}
.tap-root .tap-paymethod {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto;
	align-items: center; gap: 12px;
	min-height: 44px;               /* touch target */
	padding: 12px 14px;
	border: 1px solid var(--tap-line, #ece6f2);
	border-radius: var(--tap-r-lg, 14px);
	background: var(--tap-card, #fff);
	cursor: pointer;
	margin-bottom: 8px;
}
.tap-root .tap-paymethod:last-child { margin-bottom: 0; }
.tap-root .tap-paymethod:has(.tap-paymethod-in:checked) {
	border-color: var(--tap-purple, #6109be);
	background: var(--tap-purple-pale, #f0e8fd);
	box-shadow: 0 0 0 1px var(--tap-purple, #6109be) inset;
}
/* :has() is unsupported on older Safari/Firefox — the row still works there,
   it just loses the selected tint. The radio dot remains the state cue. */
.tap-root .tap-paymethod-in { width: 20px; height: 20px; margin: 0; accent-color: var(--tap-purple, #6109be); flex: none; }
.tap-root .tap-paymethod-in:focus-visible { outline: 2px solid var(--tap-purple, #6109be); outline-offset: 2px; }
.tap-root .tap-paymethod-body { display: grid; gap: 2px; min-width: 0; }
.tap-root .tap-paymethod-t { font-weight: 800; color: var(--tap-ink, #1e0a2e); font-size:calc(0.9375 * var(--tap-fs)); }
.tap-root .tap-paymethod-n { color: var(--tap-muted, #6b5b78); font-size:calc(0.7813 * var(--tap-fs)); line-height: 1.4; }
.tap-root .tap-paymethod-amt {
	font-weight: 800; color: var(--tap-ink, #1e0a2e);
	font-size:calc(0.9375 * var(--tap-fs));
	font-variant-numeric: tabular-nums; white-space: nowrap;
}

/* Wallet lines injected into the bill itself when a wallet method is chosen. */
.tap-root .tap-sumrow-wallet.is-debit span:last-child { color: #1a7f4e; font-weight: 700; }
.tap-root .tap-sumrow-wallet.is-due { border-top: 1px dashed var(--tap-line, #ece6f2); font-weight: 800; }

/* Balance present but too small, and split payment is switched off: an
   explanation, never a second CTA (v7.5.10 behaviour, restyled). */
.tap-root .tap-wshort {
	margin-top: 14px; padding: 13px 15px;
	background: var(--tap-sunk, #f4f1f7);
	border: 1px solid var(--tap-line, #ece6f2);
	border-radius: var(--tap-r-lg, 14px);
}
.tap-root .tap-wshort-hd { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.tap-root .tap-wshort-t { font-weight: 800; font-size:calc(0.875 * var(--tap-fs)); color: var(--tap-ink, #1e0a2e); }
.tap-root .tap-wshort-bal { font-weight: 800; font-size:calc(0.9375 * var(--tap-fs)); font-variant-numeric: tabular-nums; color: var(--tap-ink, #1e0a2e); }
.tap-root .tap-wshort-note { margin: 7px 0 0; font-size:calc(0.8125 * var(--tap-fs)); line-height: 1.5; color: var(--tap-muted, #6b5b78); }
.tap-root .tap-wshort-topup { display: inline-block; margin-top: 9px; min-height: 44px; line-height: 44px; font-size:calc(0.8438 * var(--tap-fs)); font-weight: 800; color: var(--tap-purple, #6109be); text-decoration: underline; text-underline-offset: 3px; }

/* ── #6 De-hardcoded UI: cards, buttons, banners, grid/list ───────────── */
.tap-root .tap-pcard, .tap-root .tap-fcard, .tap-root .tap-fav-card {
	padding: var(--tap-card-pad, 14px);
	border-radius: var(--tap-card-radius, 16px);
}
.tap-root .tap-pcard-title, .tap-root .tap-fcard-title { font-size: var(--tap-card-title, 15.5px); }
.tap-root .tap-btn, .tap-root .tap-btn-cta, .tap-root .tap-book-btn-sm, .tap-root .tap-delivery-chip {
	border-radius: var(--tap-btn-radius, 999px);
}
.tap-root .tap-banner, .tap-root .tap-hero-banner, .tap-root .tap-poster img {
	height: var(--tap-banner-h-m, auto); object-fit: var(--tap-banner-fit, cover); max-width: 100%;
}
@media (min-width: 1024px) {
	.tap-root .tap-banner, .tap-root .tap-hero-banner, .tap-root .tap-poster img {
		height: var(--tap-banner-h-d, var(--tap-banner-h-m, auto));
	}
}
body.tap-listview-list .tap-root .tap-grid,
body.tap-listview-list .tap-home-root .tap-grid { grid-template-columns: 1fr !important; }
body.tap-listview-list .tap-root .tap-pcard { display: flex; gap: 14px; align-items: center; }
body.tap-listview-list .tap-root .tap-pcard .tap-pcard-thumb,
body.tap-listview-list .tap-root .tap-pcard > :first-child { flex: 0 0 112px; max-width: 112px; }

/* ── #8 General mobile hygiene: nothing exceeds the viewport ──────────── */
@media (max-width: 767px) {
 .tap-root, .tap-booking-root {
	box-sizing: border-box;
	max-width: 100%;
	overflow-x: clip;
}
	.tap-root .tap-input, .tap-root textarea.tap-input, .tap-root select.tap-input { max-width: 100%; box-sizing: border-box; }
	/* v6.9.9: rows carry name + gotra + relation now. */
	.tap-root .tap-member-row { display: grid; grid-template-columns: 1.2fr 1fr 1fr 32px; gap: 8px; align-items: center; }
	.tap-root .tap-member-row .tap-inp, .tap-root .tap-member-row .tap-input { min-width: 0; }
	.tap-root .tap-addon-card { min-width: 0; }
	.tap-root .tap-addon-bottom { flex-wrap: wrap; row-gap: 4px; }
	.tap-root h1, .tap-root h2, .tap-root h3 { overflow-wrap: anywhere; }
}

/* ═══════════════════════════════════════════════════════════════════
   v6.3.0 — VAMA-pattern detail UI (brand-variable driven, NO hardcoded
   theme colors; every hue resolves from the Brand Customizer variables
   with neutral fallbacks). Mobile-first, tablet + desktop tuned below.
   ═══════════════════════════════════════════════════════════════════ */

/* ── Hero carousel ── */
.tap-root .tap-vh { margin: 0 0 18px; }
.tap-root .tap-vh-car { position: relative; border-radius: var(--tap-card-radius, 16px); overflow: hidden; box-shadow: 0 6px 24px rgba(0,0,0,.10); }
.tap-root .tap-vh-track { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.tap-root .tap-vh-track::-webkit-scrollbar { display: none; }
.tap-root .tap-vh-slide { flex: 0 0 100%; aspect-ratio: 16/10; background-size: cover; background-position: center; scroll-snap-align: center; }
.tap-root .tap-vh-count { position: absolute; right: 10px; bottom: 10px; background: rgba(0,0,0,.55); color: #fff; font-size:calc(0.75 * var(--tap-fs)); font-weight: 700; padding: 3px 9px; border-radius: var(--tap-r-full); letter-spacing: .03em; }
.tap-root .tap-vh-all { position: absolute; right: 10px; top: 10px; border: 0; cursor: pointer; background: rgba(255,255,255,.92); color: var(--tap-ink, #1e0a2e); font-size:calc(0.75 * var(--tap-fs)); font-weight: 700; padding: 6px 11px; border-radius: var(--tap-r-full); box-shadow: 0 2px 8px rgba(0,0,0,.15); }
.tap-root .tap-vh-eyebrow { position: absolute; left: 10px; top: 10px; background: var(--tap-purple, #6109be); color: #fff; font-size:calc(0.6875 * var(--tap-fs)); font-weight: 800; letter-spacing: .06em; text-transform: uppercase; padding: 5px 10px; border-radius: var(--tap-r-full); }

/* ── Meta block ── */
.tap-root .tap-vh-meta { padding: 14px 2px 0; }
.tap-root .tap-vh-title { font-family: Fraunces, Georgia, serif; font-size: clamp(22px, 4.5vw, 34px); font-weight: 900; color: var(--tap-ink, #1e0a2e); margin: 0 0 8px; line-height: 1.15; }
.tap-root .tap-vh-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; }
.tap-root .tap-vh-chip { background: var(--tap-purple-pale, #f0e8fd); color: var(--tap-ink, #1e0a2e); font-size:calc(0.7813 * var(--tap-fs)); font-weight: 600; padding: 6px 11px; border-radius: var(--tap-r-full); }
.tap-root .tap-vh-gold { background: color-mix(in srgb, var(--tap-gold, #f99000) 16%, #fff); color: color-mix(in srgb, var(--tap-gold, #f99000) 75%, #000); }
.tap-root .tap-vh-social { font-size:calc(0.8125 * var(--tap-fs)); font-weight: 700; color: var(--tap-purple, #6109be); margin: 2px 0 8px; }
.tap-root .tap-vh-benefit { display: flex; gap: 10px; align-items: flex-start; background: color-mix(in srgb, var(--tap-gold, #f99000) 9%, #fff); border: 1px solid color-mix(in srgb, var(--tap-gold, #f99000) 30%, #fff); border-radius: var(--tap-r-md); padding: 12px 14px; font-size:calc(0.875 * var(--tap-fs)); line-height: 1.5; color: var(--tap-ink, #1e0a2e); }
.tap-root .tap-vh-benefit-ic { font-size:calc(1.125 * var(--tap-fs)); line-height: 1; margin-top: 1px; }

/* ── Style 3: Banner listing cards ── */
.tap-listview-banner .tap-root .tap-grid { display: flex; flex-direction: column; gap: 16px; }
.tap-listview-banner .tap-root .tap-pcard-banner { display: block; }
.tap-listview-banner .tap-root .tap-pcard-banner .tap-thumb { aspect-ratio: 16/9; height: auto; }
.tap-listview-banner .tap-root .tap-pcard-banner .tap-body h3 { font-size:calc(1.1875 * var(--tap-fs)); }
.tap-root .tap-date-badge { position: absolute; left: 12px; top: 12px; background: #fff; border-radius: var(--tap-r-md); padding: 6px 10px 5px; text-align: center; line-height: 1; box-shadow: 0 3px 10px rgba(0,0,0,.18); display: flex; flex-direction: column; gap: 2px; }
.tap-root .tap-db-day { font-size:calc(1.125 * var(--tap-fs)); font-weight: 900; color: var(--tap-purple, #6109be); }
.tap-root .tap-db-mon { font-size:calc(0.625 * var(--tap-fs)); font-weight: 800; letter-spacing: .08em; color: var(--tap-ink, #1e0a2e); opacity: .7; }

/* ── Featured chadhava item ── */
.tap-root .tap-chad-item.is-featured { border: 2px solid var(--tap-gold, #f99000); background: color-mix(in srgb, var(--tap-gold, #f99000) 6%, #fff); border-radius: var(--tap-r-lg); }
.tap-root .tap-chad-feat-badge { display: inline-block; background: var(--tap-gold, #f99000); color: #fff; font-size:calc(0.6875 * var(--tap-fs)); font-weight: 800; letter-spacing: .04em; padding: 3px 9px; border-radius: var(--tap-r-full); margin-bottom: 4px; }

/* ── Splash / onboarding polish (desktop centering + consistency) ── */
.tap-splash, .tap-onboard { padding: max(20px, env(safe-area-inset-top)) 20px max(20px, env(safe-area-inset-bottom)); }
.tap-ob-sheet { width: min(560px, 94vw); margin: 0 auto; }

/* ── Responsive: tablet ── */
@media (min-width: 700px) {
	.tap-root .tap-vh-slide { aspect-ratio: 16/8; }
	.tap-listview-banner .tap-root .tap-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
}

/* ── Responsive: laptop/desktop ── */
@media (min-width: 1024px) {
	.tap-root .tap-vh { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); gap: 26px; align-items: start; }
	.tap-root .tap-vh-car { position: sticky; top: 84px; }
	.tap-root .tap-vh-slide { aspect-ratio: 4/3; }
	.tap-root .tap-vh-meta { padding-top: 4px; }
	.tap-listview-banner .tap-root .tap-grid { grid-template-columns: 1fr 1fr 1fr; }
	.tap-listview-banner .tap-root .tap-pcard-banner .tap-thumb { aspect-ratio: 16/10; }
}

/* color-mix fallbacks for older browsers */
@supports not (background: color-mix(in srgb, red 10%, #fff)) {
	.tap-root .tap-vh-gold { background: var(--tap-purple-pale, #fdf3e4); color: var(--tap-gold, #b56a00); }
	.tap-root .tap-vh-benefit { background: var(--tap-purple-pale, #fdf7ee); border-color: var(--tap-gold, #f0d8b0); }
	.tap-root .tap-chad-item.is-featured { background: #fffaf2; }
}

/* v6.3.1 — fullscreen photo grid (hero "All Photos" lightbox) */
.tap-pg-ov { position: fixed; inset: 0; z-index: 99999; background: rgba(20,10,30,.94); display: flex; flex-direction: column; overscroll-behavior: contain; }
.tap-pg-bar { display: flex; align-items: center; justify-content: space-between; padding: max(14px, env(safe-area-inset-top)) 18px 12px; color: #fff; }
.tap-pg-ttl { font-family: Fraunces, Georgia, serif; font-size:calc(1.0625 * var(--tap-fs)); font-weight: 700; }
.tap-pg-x { background: rgba(255,255,255,.14); color: #fff; border: 0; width: 36px; height: 36px; border-radius: 50%; font-size:calc(1 * var(--tap-fs)); cursor: pointer; }
.tap-pg-grid { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; display: grid; grid-template-columns: 1fr; gap: 10px; padding: 4px 14px max(18px, env(safe-area-inset-bottom)); }
.tap-pg-cell { width: 100%; aspect-ratio: 4/3; background-size: cover; background-position: center; border-radius: var(--tap-r-md); }
@media (min-width: 640px) { .tap-pg-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1024px) { .tap-pg-grid { grid-template-columns: 1fr 1fr 1fr; max-width: 1100px; margin: 0 auto; width: 100%; } }

/* ═══════════════════════════════════════════════════════════════════
   v6.4.0 — Booking-screen UX fixes (reported from staging)
   1. Coupon (and any last section) was hidden behind the fixed bottom
      bar on laptops: the padding compensation only existed below
      1024px. Now every breakpoint reserves room.
   2. The sticky bar's price text could not shrink (flex child without
      min-width), so long labels pushed the row wider than the viewport
      and clipped the first characters on the left.
   3. Add-on "✓ Added" pill could overflow its card on narrow columns.
   ═══════════════════════════════════════════════════════════════════ */

/* 1 ── Never let the fixed bar cover the last section (all breakpoints) */
body.tap-canvas .tap-booking-root,
body.tap-canvas .tap-root:has(> .tap-sticky) {
	padding-bottom: calc(150px + env(safe-area-inset-bottom, 0px));
}
@media (min-width: 1024px) {
	body.tap-canvas .tap-booking-root,
	body.tap-canvas .tap-root:has(> .tap-sticky) {
		padding-bottom: 132px;
	}
}
/* Fallback for browsers without :has() — reserve room on the page itself. */
@supports not selector(:has(*)) {
	body.tap-canvas .tap-booking-root { padding-bottom: 150px; }
}
/* The coupon block is usually last — guarantee clearance and visibility. */
.tap-root .tap-section-coupon { position: relative; z-index: 1; scroll-margin-bottom: 160px; }
.tap-root .tap-section:last-of-type { margin-bottom: 8px; }

/* 2 ── Sticky bar can shrink instead of overflowing the viewport */
.tap-root .tap-sticky { max-width: 100vw; box-sizing: border-box; overflow: hidden; }
.tap-root .tap-sticky-price,
.tap-root .tap-sticky-inner { min-width: 0; }
.tap-root .tap-sticky-price,
.tap-root .tap-sticky-incl,
.tap-root .tap-sticky-total { overflow-wrap: anywhere; }
.tap-root .tap-sticky .tap-btn-cta,
.tap-root .tap-sticky .tap-btn { flex: 0 1 auto; min-width: 0; }
@media (max-width: 420px) {
	.tap-root .tap-sticky { gap: 10px; padding-left: 12px; padding-right: 12px; }
	.tap-root .tap-sticky .tap-btn-cta { min-width: 0; padding: 12px 16px; font-size:calc(0.875 * var(--tap-fs)); }
	.tap-root .tap-sticky-incl { font-size:calc(0.6563 * var(--tap-fs)); line-height: 1.35; }
}

/* 3 ── Add-on cards: the toggle pill stays inside the card, always */
.tap-root .tap-addon-card,
.tap-root .tap-addon { overflow: hidden; min-width: 0; }
.tap-root .tap-addon-bottom { flex-wrap: wrap; row-gap: 6px; column-gap: 8px; min-width: 0; }
.tap-root .tap-addon-togbtn {
	flex: 0 0 auto;
	max-width: 100%;
	white-space: nowrap;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	line-height: 1.2;
	box-sizing: border-box;
}
.tap-root .tap-addon-price-tag { min-width: 0; overflow-wrap: anywhere; }
/* Row-style add-on lists (icon left, control right) keep the control inside. */
.tap-root .tap-addon > :last-child { flex-shrink: 0; }
.tap-root .tap-addon-name,
.tap-root .tap-addon-name-txt { min-width: 0; overflow-wrap: anywhere; }

/* 4 ── Nothing on the booking screen may exceed the viewport, any size */
.tap-root, .tap-booking-root {
	box-sizing: border-box;
	max-width: 100%;
	overflow-x: clip;
}
.tap-root img, .tap-root video { max-width: 100%; height: auto; }

/* ── v6.4.0 Phase 2: participation / add-on bottom sheets ────────────── */
.tap-root .tap-sheet-trigger {
	display: flex; align-items: center; gap: 12px; width: 100%;
	background: #fff; border: 1.5px solid var(--tap-line); border-radius: var(--tap-r-lg);
	padding: 13px 14px; cursor: pointer; font: inherit; text-align: left;
	transition: border-color var(--dur-fast), box-shadow var(--dur-fast);
}
.tap-root .tap-sheet-trigger:hover { border-color: var(--tap-purple); box-shadow: var(--tap-glow); }
.tap-root .tap-st-ic { width: 40px; height: 40px; flex-shrink: 0; border-radius: var(--tap-r-md); background: var(--tap-purple-pale); display: grid; place-items: center; font-size:calc(1.1875 * var(--tap-fs)); }
.tap-root .tap-st-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.tap-root .tap-st-title { font-size:calc(0.8125 * var(--tap-fs)); font-weight: 800; color: var(--tap-ink); }
.tap-root .tap-st-value { font-size:calc(0.7813 * var(--tap-fs)); color: var(--tap-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tap-root .tap-st-go { flex-shrink: 0; font-size:calc(0.7813 * var(--tap-fs)); font-weight: 800; color: var(--tap-purple); }

.tap-sheet-ov { position: fixed; inset: 0; z-index: 99996; background: rgba(36,24,50,.5); display: flex; align-items: flex-end; justify-content: center; animation: tapSplashFade .18s ease; }
.tap-bsheet { width: 100%; max-width: 520px; background: #fff; border-radius: 26px 26px 0 0; padding: 10px 18px calc(18px + env(safe-area-inset-bottom, 0px)); max-height: 86vh; display: flex; flex-direction: column; animation: tapSheetRise .26s cubic-bezier(.22,1,.36,1); }
.tap-bsheet-grip { width: 44px; height: 5px; border-radius: 3px; background: var(--tap-line); margin: 0 auto 12px; flex-shrink: 0; }
.tap-bsheet-hd { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-shrink: 0; }
.tap-bsheet-ttl { font-family: Fraunces, Georgia, serif; font-size:calc(1.125 * var(--tap-fs)); font-weight: 700; color: var(--tap-ink); margin: 0; }
.tap-bsheet-x { background: var(--tap-line); border: 0; border-radius: 50%; width: 32px; height: 32px; cursor: pointer; font-size:calc(0.875 * var(--tap-fs)); color: var(--tap-muted); flex-shrink: 0; }
.tap-bsheet-note { font-size:calc(0.8125 * var(--tap-fs)); color: var(--tap-muted); margin: 6px 0 12px; flex-shrink: 0; }
.tap-bsheet-body { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; padding-bottom: 8px; }
.tap-bsheet-done { width: 100%; margin-top: 12px; flex-shrink: 0; }
@media (min-width: 640px) {
	.tap-sheet-ov { align-items: center; }
	.tap-bsheet { border-radius: var(--tap-r-4xl); max-height: 82vh; }
}
/* ===== END assets/css/tap-adaptive.css ===== */

/* ===== BEGIN assets/css/tap-phase2.css ===== */
/**
 * DIVSA Phase-2 — customer polish pass (v6.9.85)
 * ═══════════════════════════════════════════════════════════════════════
 * Deliberately a separate, LAST-loaded sheet: every rule here is a
 * correction to an existing rule, so keeping them together makes the pass
 * reviewable and revertible in one move. See docs/PHASE2-CUSTOMER-AUDIT.md.
 *
 * Nothing here introduces new visual language — it only fixes geometry,
 * input sizing and viewport units that were measurably wrong on mobile.
 */

/* ═══════════════════════════════════════════════════════════════════════
   P0-1 · The sticky booking CTA completely covered the bottom navigation.
   ───────────────────────────────────────────────────────────────────────
   MEASURED at 403px on a puja detail page (v6.9.84):
     .tap-sticky    top 768  bottom 873  height 104  z-index 500
     .tap-bottomnav top 800  bottom 873  height  73  z-index  90
   73px of overlap — the whole nav. elementFromPoint() at the nav's centre
   returned .tap-sticky-trust, so every nav item was unclickable and the
   only way off a detail page was browser-back.

   Both bars are `position:fixed; bottom:0` and neither knew about the
   other. tap-adaptive.css's "#13 Bottom navigation overlap" block reserved
   page padding for the pair but never actually separated them.

   Fix: dock the CTA immediately ABOVE the nav whenever the nav is on
   screen. z-index is left alone — once they no longer intersect there is
   nothing to win by reordering, and raising the nav above a payment CTA
   would be the wrong precedence if a future layout does overlap them.
   ═══════════════════════════════════════════════════════════════════════ */

:root {
	/* Rendered height of .tap-bottomnav: 1px border-top + 6px pad + 60px
	   items + 6px pad = 73px. The bar's own padding already adds the safe
	   -area inset on top of that, so it is added here too. */
	--tap-navbar-h: calc(73px + env(safe-area-inset-bottom, 0px));
	--tap-nav-clearance: 10px;
}

/* v6.9.99: one containment contract for the native-app chrome. The legacy
   shell remains supported, but current pages must not inherit a 100vw,
   content-box or second safe-area calculation. */
.tap-bottomnav {
	box-sizing: border-box;
	width: 100%;
	max-width: 100%;
	left: 0;
	right: 0;
	padding-left: max(4px, env(safe-area-inset-left, 0px));
	padding-right: max(4px, env(safe-area-inset-right, 0px));
}
.tap-has-bottomnav.tap-nav-mobile,
.tap-has-bottomnav.tap-nav-always { padding-bottom: var(--tap-navbar-h); }

/* Fixed bars are siblings, so visibility is safer than relying on z-index
   when a splash, onboarding screen or modal owns the interaction. */
html.tap-noscroll .tap-bottomnav,
html.tap-noscroll .tap-sticky,
html.tap-noscroll .tap-pwa-bar,
html.tap-noscroll .tap-wa-fab { visibility: hidden; pointer-events: none; }

/* Auth sheets and full-screen creative cannot be wider than the layout
   viewport. This is intentionally width:100%, never 100vw. */
.tap-modal-wrap,
.tap-modal,
.tap-modal-inner,
.tap-splash,
.tap-onboard,
.tap-ob-body,
.tap-ob-sheet {
	box-sizing: border-box;
	min-width: 0;
	max-width: 100%;
}
.tap-modal-wrap {
	width: 100%;
	padding-left: max(0px, env(safe-area-inset-left, 0px));
	padding-right: max(0px, env(safe-area-inset-right, 0px));
	overflow-y: auto;
	overscroll-behavior: contain;
}
.tap-modal { width: min(480px, 100%); margin-left: auto; margin-right: auto; }
.tap-modal-inner {
	width: 100%;
	padding-left: max(24px, env(safe-area-inset-left, 0px));
	padding-right: max(24px, env(safe-area-inset-right, 0px));
	padding-bottom: calc(28px + env(safe-area-inset-bottom, 0px));
}
.tap-modal input,
.tap-modal button,
.tap-auth-tabs,
.tap-auth-tab { box-sizing: border-box; max-width: 100%; min-width: 0; }
.tap-auth-tab { overflow-wrap: anywhere; }
.tap-modal-grip { width: 44px; height: 5px; margin: -12px auto 16px; border-radius: 999px; background: var(--tap-line, #ece6f2); }
.tap-modal-title { margin: 0 0 12px; padding-right: 36px; line-height: 1.2; }
.tap-modal .tap-field-label { margin-top: 2px; }
.tap-splash,
.tap-onboard {
	width: 100%;
	left: 0;
	right: 0;
	padding-left: max(20px, env(safe-area-inset-left, 0px));
	padding-right: max(20px, env(safe-area-inset-right, 0px));
}
.tap-ob-body { width: 100%; }
.tap-ob-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); min-width: 0; }
.tap-ob-card { min-width: 0; overflow-wrap: anywhere; }

@media (max-width: 599px) {
	.tap-modal-wrap { padding-left: 0; padding-right: 0; }
	.tap-modal { width: 100%; max-width: 100%; margin: 0; border-radius: var(--tap-radius-xl) var(--tap-radius-xl) 0 0; }
	.tap-modal-inner { padding-left: max(20px, env(safe-area-inset-left, 0px)); padding-right: max(20px, env(safe-area-inset-right, 0px)); }
	.tap-ob-grid .tap-ob-card:last-child:nth-child(odd) {
		grid-column: 1 / -1;
		justify-self: center;
		width: calc(50% - 6px);
	}
}

/* ═══════════════════════════════════════════════════════════════════════
   P1-2 · The admin border-radius control was mostly inert.
   ───────────────────────────────────────────────────────────────────────
   MEASURED on the listing page: driving the Brand Customizer's radius
   slider from 18px to 4px changed **3 of 56** rounded elements. 53 ignored
   it — 31 stuck at 12px (the cards) and 22 at 20px (badges and pills).

   Cause: class-tap-customizer.php:298-299 emits only `--tap-radius` and
   `--tap-radius-xl`. The other 256 border-radius declarations in the CSS
   are hardcoded px, so an operator drags the slider and the cards — the
   most visible rounded thing on the page — do not move.

   Fix: one proportional scale, all derived from the admin value. Each
   ratio is chosen so that at the shipped default (18px) the computed
   result is the value that is hardcoded today, to within a thousandth of
   a pixel. So this changes NOTHING at the default — it only makes the
   slider reach the rest of the UI, which is what it always claimed to do.

     ratio × 18px  =  the value it replaces
     0.2222 →  4px    0.7778 → 14px    1.1111 → 20px
     0.3333 →  6px    0.8889 → 16px    1.2222 → 22px
     0.4444 →  8px    1.0000 → 18px    1.5556 → 28px
     0.5556 → 10px
     0.6667 → 12px

   --tap-r-full stays a literal: a pill must remain a pill at every slider
   position, and scaling 999px would make it stop being one.
   ═══════════════════════════════════════════════════════════════════════ */

:root {
	--tap-r-2xs:  calc(var(--tap-radius, 18px) * 0.2222);
	--tap-r-3xs:  calc(var(--tap-radius, 18px) * 0.3333);
	--tap-r-xs:   calc(var(--tap-radius, 18px) * 0.4444);
	--tap-r-sm:   calc(var(--tap-radius, 18px) * 0.5556);
	--tap-r-md:   calc(var(--tap-radius, 18px) * 0.6667);
	--tap-r-lg:   calc(var(--tap-radius, 18px) * 0.7778);
	--tap-r-xl:   calc(var(--tap-radius, 18px) * 0.8889);
	--tap-r-2xl:  var(--tap-radius, 18px);
	--tap-r-3xl:  calc(var(--tap-radius, 18px) * 1.1111);
	--tap-r-4xl:  calc(var(--tap-radius, 18px) * 1.2222);
	--tap-r-5xl:  calc(var(--tap-radius, 18px) * 1.5556);
	--tap-r-full: 999px;
}

/* The nav is only on screen below 781px in `tap-nav-mobile`; `tap-nav-always`
   keeps it at every width. Mirror both conditions exactly so the CTA is never
   lifted over a nav that is not there (which would leave a floating gap). */
@media (max-width: 767.98px) {
	body.tap-has-bottomnav.tap-nav-mobile .tap-sticky {
		bottom: var(--tap-navbar-h);
		/* The nav below now owns the safe-area inset — without this the
		   inset would be counted twice and the CTA would float. */
		padding-bottom: 12px;
	}
	body.tap-has-bottomnav.tap-nav-mobile.tap-ctabar-pill .tap-sticky {
		bottom: calc(var(--tap-navbar-h) + var(--tap-nav-clearance));
	}
}

body.tap-has-bottomnav.tap-nav-always .tap-sticky {
	bottom: var(--tap-navbar-h);
	padding-bottom: 12px;
}
body.tap-has-bottomnav.tap-nav-always.tap-ctabar-pill .tap-sticky {
	bottom: calc(var(--tap-navbar-h) + var(--tap-nav-clearance));
}

/* Content clearance. The existing reservation (150px) assumed the CTA sat at
   bottom:0; now it stacks on the nav, so the page needs both. */
@media (max-width: 1023px) {
	body.tap-canvas.tap-has-bottomnav.tap-nav-mobile .tap-booking-root,
	body.tap-canvas.tap-has-bottomnav.tap-nav-mobile .tap-root:has(> .tap-sticky),
	body.tap-canvas.tap-has-bottomnav.tap-nav-always .tap-booking-root,
	body.tap-canvas.tap-has-bottomnav.tap-nav-always .tap-root:has(> .tap-sticky) {
		padding-bottom: calc(150px + var(--tap-navbar-h));
	}
}

/* The WhatsApp FAB and the toast both offset from `--nav-h` (64px), which is
   the UNUSED app-shell nav in class-tap-app-shell.php — not the 73px bar that
   actually renders. Both therefore sat ~9px too low, clipping into the nav. */
@media (max-width: 767.98px) {
	body.tap-has-bottomnav.tap-nav-mobile .tap-wa-fab {
		bottom: calc(var(--tap-navbar-h) + 12px);
	}
	body.tap-has-bottomnav.tap-nav-mobile .tap-toast {
		bottom: calc(var(--tap-navbar-h) + 12px);
	}
	/* On a detail page the CTA is between them — clear it as well so the
	   FAB never lands on the primary action. */
	body.tap-has-bottomnav.tap-nav-mobile .tap-root:has(> .tap-sticky) ~ .tap-wa-fab,
	body.tap-has-bottomnav.tap-nav-mobile:has(.tap-sticky) .tap-wa-fab,
	body.tap-has-sticky .tap-wa-fab {
		bottom: calc(var(--tap-navbar-h) + 104px + 12px);
	}
	body.tap-has-bottomnav.tap-nav-mobile:has(.tap-sticky) .tap-toast {
		bottom: calc(var(--tap-navbar-h) + 104px + 12px);
	}
}

/* ═══════════════════════════════════════════════════════════════════════
   P0-2 · Form controls under 16px made mobile browsers zoom the viewport.
   ───────────────────────────────────────────────────────────────────────
   Mobile Safari (always) and Android Chrome (in several common configs)
   zoom the layout viewport when a focused control has font-size < 16px.
   The page correctly does NOT set maximum-scale — disabling zoom would be
   a WCAG 1.4.4 failure — so the viewport STAYS zoomed after blur, and the
   next refresh renders at that scale. That is the reported "refresh auto
   zooms / layout shifts / viewport unstable" behaviour in Bug 1.

   MEASURED live: .tap-inp.tap-coupon-inp = 14px, inside checkout.
   STATIC: .tap-input 15px, .tap-hero-compact-search input 14px,
           .tap-cst-input 14px, .tap-sankalp-sacred textarea 15px.

   16px is a browser threshold, not a design choice — it is read from the
   computed style regardless of how the field looks. Padding is trimmed
   slightly on the compact fields so the control's box does not grow.
   ═══════════════════════════════════════════════════════════════════════ */

@media (max-width: 1023px) {
	.tap-root input[type="text"],
	.tap-root input[type="tel"],
	.tap-root input[type="email"],
	.tap-root input[type="number"],
	.tap-root input[type="search"],
	.tap-root input[type="password"],
	.tap-root input:not([type]),
	.tap-root select,
	.tap-root textarea,
	.tap-input,
	.tap-inp,
	.tap-cst-input,
	.tap-search-box input,
	.tap-hero-compact-search input,
	.tap-sankalp-sacred textarea {
		font-size:calc(1 * var(--tap-fs));
	}

	/* Keep the compact fields visually compact despite the larger text. */
	.tap-hero-compact-search input { padding-top: 0; padding-bottom: 0; }
	.tap-cst-input { padding: 10px 12px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   P1-3 · `vh` on sheets vs Android Chrome's dynamic toolbar.
   ───────────────────────────────────────────────────────────────────────
   REASONED, not measured — the desktop-Chrome preview has no retracting
   toolbar, so this needs a real device to confirm.

   `vh` resolves against the LARGE viewport (toolbar retracted). While the
   toolbar is shown, a 92vh sheet is taller than the visible area and its
   primary action is pushed below the fold. `dvh` tracks the live viewport.
   min() keeps the original value wherever `dvh` is unsupported, so this
   can only ever shrink an over-tall sheet — never grow one.
   ═══════════════════════════════════════════════════════════════════════ */

.tap-modal      { max-height: min(90vh, 90dvh); }
.tap-cst-sheet  { max-height: min(88vh, 88dvh); }
.tap-bsheet     { max-height: min(86vh, 86dvh); }

@media (min-width: 560px) {
	.tap-bsheet { max-height: min(82vh, 82dvh); }
}

/* ═══════════════════════════════════════════════════════════════════════
   P0-3 · Install prompt bar (TAP_PWA::boot_script).
   ───────────────────────────────────────────────────────────────────────
   Docks above the bottom nav using the same --tap-navbar-h token as the
   booking CTA, so the three never stack on each other. Only ever visible
   when the browser has fired beforeinstallprompt.
   ═══════════════════════════════════════════════════════════════════════ */

.tap-pwa-bar {
	position: fixed;
	left: 12px;
	right: 12px;
	bottom: calc(var(--tap-navbar-h, 73px) + 12px);
	z-index: 940;
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
	padding: 12px 14px;
	border-radius: var(--tap-radius, 18px);
	background: var(--tap-card, #fff);
	color: var(--tap-ink, #1e0a2e);
	border: 1px solid var(--tap-line, #ece6f2);
	box-shadow: 0 10px 34px rgba(30, 10, 46, .16);
	animation: tapPwaRise var(--dur-slow, 400ms) var(--ease-spring, cubic-bezier(.34,1.56,.64,1)) both;
}

/* A detail page already has the CTA sitting on the nav — clear that too. */
body:has(.tap-sticky) .tap-pwa-bar {
	bottom: calc(var(--tap-navbar-h, 73px) + 104px + 12px);
}

@media (min-width: 781px) {
	.tap-pwa-bar { left: auto; right: 20px; bottom: 20px; max-width: 26rem; }
	body:has(.tap-sticky) .tap-pwa-bar { bottom: 20px; }
}

.tap-pwa-bar-txt {
	flex: 1 1 12rem;
	min-width: 0;
	margin: 0;
	font-size:calc(0.875 * var(--tap-fs));
	font-weight: 700;
	line-height: 1.4;
}

.tap-pwa-bar-acts { display: flex; gap: 8px; margin-left: auto; }

.tap-pwa-bar-no,
.tap-pwa-bar-yes {
	font: inherit;
	font-size:calc(0.875 * var(--tap-fs));
	font-weight: 700;
	min-height: 44px;
	padding: 0 18px;
	border-radius: var(--tap-r-full, 999px);
	cursor: pointer;
	transition: transform var(--dur-fast, 150ms) var(--ease-out, cubic-bezier(.4,0,.2,1)),
		background var(--dur-fast, 150ms) var(--ease-out, cubic-bezier(.4,0,.2,1));
}

.tap-pwa-bar-no {
	border: 1px solid var(--tap-line, #ece6f2);
	background: transparent;
	color: var(--tap-muted, #6b5b78);
}

.tap-pwa-bar-yes {
	border: 0;
	background: var(--tap-purple, #6109be);
	color: var(--tap-cta-text, #fff);
}

.tap-pwa-bar-no:active,
.tap-pwa-bar-yes:active { transform: scale(.97); }

@keyframes tapPwaRise {
	from { opacity: 0; transform: translateY(14px); }
	to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
	.tap-pwa-bar { animation: none; }
	.tap-pwa-bar-no:active,
	.tap-pwa-bar-yes:active { transform: none; }
}

/* ═══════════════════════════════════════════════════════════════════════
   P1-5 · The "No dates available" CTA could not be tapped at all.
   ───────────────────────────────────────────────────────────────────────
   .is-disabled sets pointer-events:none, and 50-detail.js also set the
   `disabled` attribute. Between them the sticky CTA swallowed every tap:
   elementFromPoint at its centre returned .tap-sticky-inner, and the
   toast_no_dates guard behind it was unreachable dead code. The devotee
   tapped the biggest control on screen and nothing happened.

   The JS no longer sets `disabled`; this restores pointer events for that
   one case so the handler can explain itself and scroll to the notice.
   Everything else about the disabled look is untouched, and the booking
   guard still returns early, so no booking can be created from this state.
   ═══════════════════════════════════════════════════════════════════════ */

.tap-root .tap-sticky .tap-btn-cta.is-disabled[aria-disabled="true"] {
	pointer-events: auto;
	cursor: not-allowed;
}

/* ═══════════════════════════════════════════════════════════════════════
   v6.9.88 · Amount on the booking card.
   ───────────────────────────────────────────────────────────────────────
   The card showed everything except what it cost, while `total_display`
   sat unused in the API response. Set as its own row above the footer so
   it reads as a fact about the booking, not another action.
   ═══════════════════════════════════════════════════════════════════════ */

.tap-root .tap-bkcard-amt {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
	margin-top: 10px;
	padding-top: 10px;
	border-top: 1px dashed var(--tap-line, #ece6f2);
}

.tap-root .tap-bkcard-amt-l {
	font-size:calc(0.7813 * var(--tap-fs));
	font-weight: 600;
	color: var(--tap-muted, #6b5b78);
	text-transform: uppercase;
	letter-spacing: .04em;
}

.tap-root .tap-bkcard-amt-v {
	font-size:calc(1.0625 * var(--tap-fs));
	font-weight: 800;
	color: var(--tap-ink, #1e0a2e);
	/* Tabular figures so amounts align down a scrolling list. */
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

/* An unpaid draft must not read as money already spent. */
.tap-root .tap-bkcard-amt.is-due .tap-bkcard-amt-v { color: var(--tap-warn, #b4531a); }

/* ═══════════════════════════════════════════════════════════════════════
   v6.9.89 · Booking-card actions (Receipt / Modify / Sankalp).
   ───────────────────────────────────────────────────────────────────────
   The row was `flex-wrap:wrap; justify-content:flex-end`, so three buttons
   of three different intrinsic widths wrapped onto three ragged lines,
   each a different size and colour, with the date stranded on the left.
   It read as three unrelated controls rather than one set of actions.

   Now: the date gets its own line, and the actions sit in an equal-width
   grid — same height, same radius, same weight — so they scan as siblings.
   Sankalp keeps the accent because it is the one time-limited action;
   Receipt and Modify are quiet by comparison. Nothing is re-ordered and no
   button is removed: this is presentation only, so every existing handler
   and admin visibility rule still applies.
   ═══════════════════════════════════════════════════════════════════════ */

.tap-root .tap-bkcard-foot {
	display: grid;
	grid-template-columns: 1fr;
	align-items: stretch;
	justify-content: stretch;
	gap: 12px;
}

.tap-root .tap-bkcard-date {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size:calc(0.7813 * var(--tap-fs));
	white-space: nowrap;
}

.tap-root .tap-bkcard-actions {
	display: grid;
	/* Buttons share the width evenly and never wrap ragged. `auto-fit` with a
	   min track keeps one action full-width and three sensibly thirds. */
	grid-template-columns: repeat(auto-fit, minmax(104px, 1fr));
	gap: 8px;
	flex-wrap: nowrap;
	justify-content: stretch;
	width: 100%;
}

/* One consistent shape for every action in the row, whatever class the JS
   gave it. Overrides the per-button size/padding variants that produced the
   mismatched widths. */
.tap-root .tap-bkcard-actions > .tap-btn,
.tap-root .tap-bkcard-actions > button,
.tap-root .tap-bkcard-actions > a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	width: 100%;
	min-width: 0;
	min-height: 44px;
	margin: 0;
	padding: 0 12px;
	font-size: var(--tap-fs-sm, 13.5px);
	font-weight: 700;
	line-height: 1.2;
	text-align: center;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	border-radius: var(--tap-r-md, 12px);
	box-sizing: border-box;
	transition: transform var(--dur-fast, 150ms) var(--ease-out, cubic-bezier(.4,0,.2,1)),
		background var(--dur-fast, 150ms) var(--ease-out, cubic-bezier(.4,0,.2,1));
}

/* One quiet style for the whole row.
   MEASURED before this: Receipt came out peach (.tap-btn-ghost, #fbe9e2) while
   Modify and Sankalp came out lilac (.tap-btn-soft, #f3ecfd) — three sibling
   actions in two unrelated colours. The class a button happens to carry is a
   historical accident, so normalise on the container instead. */
.tap-root .tap-bkcard-actions > .tap-btn,
.tap-root .tap-bkcard-actions > button,
.tap-root .tap-bkcard-actions > a {
	/* !important is required, not lazy: tap-frontend.css:1231 declares
	   `.tap-btn-soft { background/color/border ... !important }`, which no
	   amount of specificity can beat. Scoped to this one row so it cannot
	   leak into the buttons elsewhere that rely on that rule. */
	background: var(--tap-purple-pale, #f6f1ff) !important;
	color: var(--tap-purple, #6109be) !important;
	border: 1px solid var(--tap-line, #ece6f2) !important;
}

/* Sankalp is the one action with a deadline, so it carries the accent —
   the single filled control in the row, which is what makes it read as the
   thing to do next rather than one of three equal options. */
/* v7.5.24 — the filled group now lists EVERY primary alias, not just two of
   them. It previously named .tap-btn-gold and .tap-btn-cta, so a
   .tap-btn-primary dropped into this row rendered with the quiet secondary
   fill: the one class whose whole meaning is "this is the primary action"
   was the one that did not get the accent.

   The fill is --tap-ink-accent (the contrast-safe brand shade introduced in
   v6.9.92), not the raw brand. White on the raw brand measures 1.7:1 here,
   which is why the rule below at ~line 714 already re-darkened a SUBSET of
   this list — .tap-btn-gold was not in that subset, so it kept the raw brand
   and failed. One list, one token, no subset to fall out of. */
.tap-root .tap-bkcard-actions > .tap-sankalp-btn,
.tap-root .tap-bkcard-actions > .tap-snk-btn,
.tap-root .tap-bkcard-actions > .tap-btn-primary,
.tap-root .tap-bkcard-actions > .tap-btn-xl,
.tap-root .tap-bkcard-actions > .tap-btn-green,
.tap-root .tap-bkcard-actions > .tap-btn-gold,
.tap-root .tap-bkcard-actions > .tap-btn-cta {
	background: var(--tap-ink-accent, var(--tap-purple, #6109be)) !important;
	color: var(--tap-cta-text, #fff) !important;
	border-color: transparent !important;
}

.tap-root .tap-bkcard-actions > .tap-btn:active,
.tap-root .tap-bkcard-actions > button:active { transform: scale(.97); }

@media (prefers-reduced-motion: reduce) {
	.tap-root .tap-bkcard-actions > .tap-btn:active,
	.tap-root .tap-bkcard-actions > button:active { transform: none; }
}

/* From tablet up the row has room to sit beside the date again. */
@media (min-width: 560px) {
	.tap-root .tap-bkcard-foot {
		grid-template-columns: auto 1fr;
		align-items: center;
	}
	.tap-root .tap-bkcard-actions {
		grid-auto-flow: column;
		grid-template-columns: none;
		justify-content: flex-end;
	}
	.tap-root .tap-bkcard-actions > .tap-btn,
	.tap-root .tap-bkcard-actions > button,
	.tap-root .tap-bkcard-actions > a { width: auto; padding: 0 18px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   v6.9.91 · Account IA — 10-tab scroller becomes a grid.
   ───────────────────────────────────────────────────────────────────────
   MEASURED at v6.9.88: the account screen carried 10 main tabs plus 4
   booking sub-tabs — 14 tab controls — in a horizontal scroller, so 6 of
   the 10 sections were off-screen with no affordance that they existed.
   "Overloaded nav" is an explicit anti-pattern in the UX ruleset, and
   every marketplace the devotee already uses (Amazon, Flipkart, VAMA)
   presents the account as a GRID of destinations, not a strip.

   Presentation only: the same buttons, the same `paintTab()` handlers,
   the same admin show/hide via appTabs(), and `?tab=` deep links all keep
   working. Nothing was added, removed or reordered — the row simply wraps
   into a grid so all ten are visible at once.
   ═══════════════════════════════════════════════════════════════════════ */

@media (max-width: 1023px) {
	.tap-root .tap-tabs {
		display: grid;
		grid-template-columns: repeat(auto-fit, minmax(94px, 1fr));
		gap: 8px;
		overflow: visible;      /* was a horizontal scroller */
		flex-wrap: wrap;
		/* The scroller had an edge fade to hint at overflow. There is no
		   overflow any more, and the mask clipped the outer tiles. */
		-webkit-mask-image: none;
		mask-image: none;
		padding-bottom: 0;
	}

	.tap-root .tap-tabs > .tap-tab {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
		gap: 6px;
		width: auto;
		min-width: 0;
		min-height: 76px;
		margin: 0;
		padding: 12px 6px;
		font-size:calc(0.75 * var(--tap-fs));
		font-weight: 600;
		line-height: 1.25;
		text-align: center;
		white-space: normal;
		border-radius: var(--tap-r-md, 12px);
		background: var(--tap-card, #fff);
		border: 1px solid var(--tap-line, #ece6f2);
		color: var(--tap-ink, #1e0a2e);
	}

	.tap-root .tap-tabs > .tap-tab.active {
		background: var(--tap-purple-pale, #f6f1ff);
		border-color: var(--tap-purple, #6109be);
		color: var(--tap-purple, #6109be);
	}
}

/* Bottom-nav SVG icons (v6.9.91). `.tap-bn-ic` was sized with font-size for
   emoji; an SVG needs explicit box dimensions. Emoji configs still work — the
   font-size rule underneath is untouched and applies when no SVG is present. */
.tap-root .tap-bn-ic svg,
.tap-bn-ic svg {
	width: 22px;
	height: 22px;
	display: block;
}
.tap-bn-item.is-center .tap-bn-ic svg { width: 25px; height: 25px; }

/* Icon sizing is shared by both layouts. */
.tap-root .tap-tab-ic {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: none;
}
.tap-root .tap-tab-ic svg { width: 22px; height: 22px; display: block; }

/* Desktop keeps the familiar horizontal row, icon beside the label. */
@media (min-width: 1024px) {
	.tap-root .tap-tabs > .tap-tab {
		display: inline-flex;
		align-items: center;
		gap: 7px;
	}
	.tap-root .tap-tab-ic svg { width: 17px; height: 17px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   v6.9.91 · The WhatsApp opt-in was a bare checkbox floating on the page.
   Give it the same card treatment every other control already has.
   ═══════════════════════════════════════════════════════════════════════ */

.tap-root .tap-optin {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 14px 0;
	padding: 12px 14px;
	min-height: 44px;
	border-radius: var(--tap-r-md, 12px);
	background: var(--tap-card, #fff);
	border: 1px solid var(--tap-line, #ece6f2);
	font-size:calc(0.875 * var(--tap-fs));
	cursor: pointer;
}
.tap-root .tap-optin input[type="checkbox"] { width: 20px; height: 20px; flex: none; cursor: pointer; }

/* ═══════════════════════════════════════════════════════════════════════
   v6.9.91 · WCAG 1.4.3 contrast — 7 measured failures.
   ───────────────────────────────────────────────────────────────────────
   Audited by computing WCAG relative luminance against the real rendered
   backdrop (walking ancestors for the first solid background). Results:

     3.04  .tap-bkcard-code      #9c8fa8 on #fff     needs 4.5
     3.35  .tap-tab-lb           #e24e12 on #fbe9e2  needs 4.5
     3.35  .tap-tab.active       #e24e12 on #fbe9e2  needs 4.5
     3.35  Receipt / Modify      #e24e12 on #fbe9e2  needs 4.5
     3.42  .tap-bkcard-badge     #e24e12 on #f3ecfd  needs 4.5
     3.94  Sankalp (white on brand)                  needs 4.5

   The brand colour is the OPERATOR'S choice and is not changed here.
   Instead a darker ink is DERIVED from it with color-mix(), so every
   palette — saffron, violet, gold — gets an accessible small-text tone
   automatically. Large/bold text keeps the pure brand colour, which only
   needs 3:1 and already passes.

   Note this fixes the small-text case only. Non-text contrast (icons,
   borders) and the gradient header were not evaluated: 8 elements sit on
   a gradient, which cannot be sampled from computed style — an earlier
   pass that assumed white behind them produced 8 phantom failures.
   ═══════════════════════════════════════════════════════════════════════ */

:root {
	/* ~72% brand + 28% black. Falls back to the raw brand colour where
	   color-mix() is unsupported, i.e. never worse than today. */
	--tap-ink-accent: var(--tap-purple, #6109be);
}

@supports (color: color-mix(in srgb, red 50%, black)) {
	:root {
		--tap-ink-accent: color-mix(in srgb, var(--tap-purple, #6109be) 72%, #000);
	}
}

/* Small text that sat on a pale tint of the brand. */
.tap-root .tap-tabs > .tap-tab.active,
.tap-root .tap-tab-lb,
.tap-root .tap-bkcard-badge,
.tap-root .tap-bkcard-actions > .tap-btn,
.tap-root .tap-bkcard-actions > button,
.tap-root .tap-bkcard-actions > a {
	color: var(--tap-ink-accent) !important;
}

/* The one filled control: white on pure brand measured 3.94. Darkening the
   FILL keeps the label white and the button unmistakably primary. */
.tap-root .tap-bkcard-actions > .tap-snk-btn,
.tap-root .tap-bkcard-actions > .tap-sankalp-btn,
.tap-root .tap-bkcard-actions > .tap-btn-primary,
.tap-root .tap-bkcard-actions > .tap-btn-xl,
.tap-root .tap-bkcard-actions > .tap-btn-green,
.tap-root .tap-bkcard-actions > .tap-btn-gold,
.tap-root .tap-bkcard-actions > .tap-btn-cta {
	background: var(--tap-ink-accent) !important;
	color: #fff !important;
}

/* Booking reference was mid-grey on white — 3.04. */
.tap-root .tap-bkcard-code { color: var(--tap-ink, #1e0a2e); opacity: .72; }

/* ═══════════════════════════════════════════════════════════════════════
   v6.9.92 · The customer density control barely reached the UI.
   ───────────────────────────────────────────────────────────────────────
   MEASURED by driving --tap-section-gap and --tap-card-pad and counting
   which elements moved:

     /book/          15 of 151 spaced elements responded   (10%)
     /my-bookings/    0 of 215 spaced elements responded   ( 0%)

   Cause: tap-layout.css targets `.tap-section`, `.tap-card` and `.tap-pkg`.
   The catalogue cards are `.tap-pcard` and the dashboard cards are
   `.tap-bkcard` — neither is `.tap-card`, so the padding rule matched
   nothing and only section margins moved. Same shape as the radius
   slider: a real setting wired to selectors that are not on the page.

   Rather than tokenising 288 literals into an 18-step "scale" that would
   only document the drift, the existing control is extended to the
   containers it always meant to cover. Every ratio below is chosen so the
   default values (--tap-card-pad 10px, --tap-section-gap 20px) reproduce
   TODAY'S measured pixels exactly, so nothing moves until an operator
   changes the setting:

     .tap-pcard  padding 10  = pad × 1      .tap-body   padding 12 = pad × 1.2
     .tap-pcard  gap     14  = pad × 1.4    .tap-body   gap      6 = pad × 0.6
     .tap-section mb     26  = gap × 1.3    .tap-section-scroller gap 16 = gap × 0.8
   ═══════════════════════════════════════════════════════════════════════ */

/* v7.6.4: the ratio maths multiplies --tap-card-pad-s, the SCALAR companion
   to --tap-card-pad. --tap-card-pad itself is emitted as a two-value shorthand
   ("12px 14px"), and calc() on a shorthand is invalid at computed-value time —
   the declaration resets to the property's initial value (0) instead of
   falling back down the cascade, silently and with no console error.
   Direct `padding:` use of the shorthand is correct and stays. */
.tap-root .tap-pcard {
	padding: var(--tap-card-pad, 10px);
	gap: var(--tap-card-gap, 14px);
}

.tap-root .tap-pcard .tap-body {
	padding: calc(var(--tap-card-pad-s, 10px) * 1.2);
	gap: calc(var(--tap-card-pad-s, 10px) * 0.6);
}

.tap-root .tap-section { margin-bottom: calc(var(--tap-section-gap, 20px) * 1.3); }
.tap-root .tap-section-scroller { gap: calc(var(--tap-section-gap, 20px) * 0.8); }

/* The dashboard was at 0% — its cards are .tap-bkcard, which the shipped
   rules never mentioned. tap-premium.css:637 sets padding:16px, so the ratio
   is × 1.6. (An earlier draft here guessed × 1.4 from memory and would have
   quietly shaved 2px off every booking card — checked against the source
   rather than shipped.) */
/* v7.6.4: .tap-prof-card joins its sibling CONTENT card here, so the density
   control moves both together instead of leaving the profile groups pinned at
   16px while the booking cards breathed. Its bottom padding is still trimmed
   in tap-premium.css — the fields inside carry their own bottom margin. */
.tap-root .tap-bkcard,
.tap-root .tap-prof-card { padding: calc(var(--tap-card-pad-s, 10px) * 1.6); }
/* Restated AFTER the shorthand above, which would otherwise reset all four
   sides and undo the trim declared in tap-premium.css. */
.tap-root .tap-prof-card { padding-bottom: 4px; }

/* ═══════════════════════════════════════════════════════════════════════
   P1-4 · Section tabs were below the 44×44 minimum touch target.
   MEASURED: Benefits / Process / Inclusions / Reviews = 40px high.
   ═══════════════════════════════════════════════════════════════════════ */

.tap-root .tap-info-chip,
.tap-root .tap-ptab,
.tap-root .tap-tabs > button,
.tap-root .tap-ptabs > button,
.tap-root .tap-filter-bar > button {
	min-height: 44px;
}

/* ═══════════════════════════════════════════════════════════════════════
   UX-023 · Print stylesheet (@media print).
   Hide fixed bars, floating CTAs, and popups during browser printing.
   ═══════════════════════════════════════════════════════════════════════ */
@media print {
	.tap-bottomnav,
	.tap-topstrip,
	.tap-sticky,
	.tap-wa-fab,
	.tap-pwa-bar,
	.tap-toast-region {
		display: none !important;
	}
	body {
		background: #fff !important;
		color: #000 !important;
	}
	.tap-root {
		padding-bottom: 0 !important;
	}
}

/* v6.9.99 UX pass: listing context, keyboard focus and account hub layout. */
.tap-root .tap-card-benefit {
	color: var(--tap-muted, #756b80);
	font-size:calc(0.75 * var(--tap-fs));
	line-height: 1.45;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	min-height: 34px;
}

.tap-root .tap-card-date {
	display: inline-flex;
	align-items: center;
	width: fit-content;
	padding: 4px 8px;
	border-radius: 999px;
	background: #f3edff;
	color: #5f2ca4;
	font-size:calc(0.6875 * var(--tap-fs));
	font-weight: 700;
}

.tap-root .tap-pcard[role="group"] {
	cursor: pointer;
}

.tap-root .tap-book-btn-sm:focus-visible,
.tap-root .tap-phub-stat:focus-visible {
	outline: 3px solid rgba(97, 9, 190, .32);
	outline-offset: 3px;
}

.tap-dashboard-root .tap-account-tabs {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 10px;
	overflow: visible;
}

.tap-dashboard-root .tap-account-tabs .tap-tab {
	min-height: 78px;
	padding: 10px 6px;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 6px;
	white-space: normal;
	text-align: center;
	line-height: 1.2;
}

.tap-dashboard-root .tap-account-tabs .tap-tab-ic {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 24px;
}

.tap-dashboard-root .tap-dashboard-panel {
	min-width: 0;
}

.tap-dashboard-root .tap-prof-completion {
	margin: 14px 0 18px;
	padding: 14px 16px;
	border: 1px solid #e8dcf5;
	border-radius: 16px;
	background: linear-gradient(135deg, #fbf8ff, #fffaf4);
}

.tap-dashboard-root .tap-prof-completion-row {
	display: flex;
	justify-content: space-between;
	gap: 12px;
	font-size:calc(0.8125 * var(--tap-fs));
}

.tap-dashboard-root .tap-prof-progress {
	height: 8px;
	margin: 10px 0 8px;
	border-radius: 999px;
	background: #eadff5;
	overflow: hidden;
}

.tap-dashboard-root .tap-prof-progress span {
	display: block;
	height: 100%;
	border-radius: inherit;
	background: linear-gradient(90deg, #6109be, #ee5b1a);
	transition: width .25s ease;
}

.tap-dashboard-root .tap-prof-completion p {
	margin: 0;
	color: var(--tap-muted, #756b80);
	font-size:calc(0.75 * var(--tap-fs));
	line-height: 1.45;
}

@media (min-width: 640px) {
	.tap-dashboard-root .tap-account-tabs {
		grid-template-columns: repeat(4, minmax(0, 1fr));
	}
}

@media (min-width: 1024px) {
	.tap-dashboard-root .tap-account-tabs {
		grid-template-columns: repeat(5, minmax(0, 1fr));
	}
}


/* ═══════════════════════════════════════════════════════════════════════
   v7.2.0 — UI/UX SYSTEM STABILIZATION
   Measured fixed-layer geometry, compact transaction actions, responsive
   containment, explicit consultation actions and shared interaction states.
   This layer intentionally enhances existing components/settings rather
   than replacing the white-label system.
   ═══════════════════════════════════════════════════════════════════════ */

:root {
	--tap-fixed-nav-h: 0px;
	--tap-fixed-cta-h: 0px;
	--tap-fixed-top-h: 0px;
	--tap-fixed-bottom-h: 0px;
	--tap-motion-instant: 100ms;
	--tap-motion-quick: 160ms;
	--tap-motion-standard: 220ms;
	--tap-motion-emphasized: 320ms;
	--tap-ease-standard: cubic-bezier(.2,0,0,1);
	--tap-ease-enter: cubic-bezier(0,0,0,1);
	--tap-ease-exit: cubic-bezier(.3,0,1,1);
}

/* Root/document containment: horizontal product rails may scroll internally,
   but may never widen the page itself at 320px or browser zoom. */
html, body { max-width: 100%; }
body.tap-app { overflow-x: clip; }
.tap-root,
.tap-root > *,
.tap-booking-root,
.tap-consult-root,
.tap-dashboard-root,
.tap-section,
.tap-container,
.tap-section-scroller,
.tap-hscroll,
.tap-hscroll-snap,
.tap-filter-bar,
.tap-deity-grid,
.tap-tabs,
.tap-ptabs,
.tap-cst-chiprow {
	box-sizing: border-box;
	min-width: 0;
	max-width: 100%;
}
.tap-section-scroller,
.tap-hscroll,
.tap-hscroll-snap,
.tap-filter-bar,
.tap-deity-grid,
.tap-tabs,
.tap-ptabs,
.tap-cst-chiprow {
	overscroll-behavior-inline: contain;
	-webkit-overflow-scrolling: touch;
}

/* Measured fixed layout: the CTA docks above whatever navigation is actually
   visible. Page content reserves the measured total so the final control can
   always be scrolled fully into view. */
body.tap-has-transaction-sticky .tap-sticky {
	bottom: var(--tap-fixed-nav-h, 0px) !important;
}
body.tap-has-transaction-sticky .tap-booking-root {
	padding-bottom: calc(var(--tap-fixed-nav-h, 0px) + var(--tap-fixed-cta-h, 0px) + 28px) !important;
}
.tap-toast,
.tap-toast-region .tap-toast {
	bottom: calc(var(--tap-fixed-bottom-h, 0px) + 14px) !important;
}
.tap-pwa-bar {
	bottom: calc(var(--tap-fixed-bottom-h, var(--tap-fixed-nav-h, 0px)) + 12px) !important;
}
.tap-wa-fab,
#tap-wa-float {
	box-sizing: border-box;
	position: fixed;
	right: max(16px, env(safe-area-inset-right, 0px));
	bottom: calc(var(--tap-fixed-bottom-h, var(--tap-fixed-nav-h, 0px)) + 14px) !important;
	z-index: 920;
	width: 52px;
	height: 52px;
	min-width: 52px;
	min-height: 52px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: var(--tap-wa, #25d366);
	color: #fff;
	font: inherit;
	font-size:calc(1.375 * var(--tap-fs));
	line-height: 1;
	cursor: pointer;
	box-shadow: 0 8px 24px rgba(20,80,42,.28);
}
.tap-wa-fab:focus-visible,
#tap-wa-float:focus-visible {
	outline: 3px solid var(--tap-purple, #6109be);
	outline-offset: 3px;
}

/* Customer support is contextual during a transaction. Hiding the floating
   control on compact screens prevents it from covering package/payment UI;
   the normal in-flow support actions remain available. */
@media (max-width: 780px) {
	body.tap-has-transaction-sticky .tap-wa-fab,
	body.tap-has-transaction-sticky #tap-wa-float { display: none !important; }
}
@media (min-width: 781px) {
	.tap-wa-fab,
	#tap-wa-float { bottom: 20px !important; right: 20px; }
	.tap-pwa-bar { bottom: 20px !important; }
}

/* Compact, bounded mobile transaction dock. Trust messages already exist in
   the page; repeating them in the fixed viewport created a 193px bar. */
.tap-sticky {
	box-sizing: border-box;
	width: 100%;
	max-width: 100%;
	flex-direction: column;
	align-items: stretch;
	gap: 6px;
}
.tap-sticky-inner {
	width: 100%;
	min-width: 0;
	justify-content: space-between;
}
.tap-sticky-price {
	min-width: 0;
	max-width: 52%;
}
.tap-sticky-price > * {
	max-width: 100% !important;
	overflow-wrap: anywhere;
}
.tap-sticky .tap-btn,
.tap-sticky .tap-btn-cta {
	min-height: 48px;
	max-width: 58%;
	white-space: normal;
	line-height: 1.18;
	text-align: center;
}
@media (max-width: 767px) {
	.tap-sticky {
		padding: 8px max(12px, env(safe-area-inset-right, 0px)) calc(8px + env(safe-area-inset-bottom, 0px)) max(12px, env(safe-area-inset-left, 0px));
	}
	.tap-sticky-trust,
	.tap-sticky > .tap-countdown-long { display: none !important; }
	.tap-sticky-price { font-size:calc(1.0625 * var(--tap-fs)); }
	.tap-sticky-total { font-size:calc(1.125 * var(--tap-fs)); }
	.tap-sticky .tap-btn,
	.tap-sticky .tap-btn-cta { min-width: 132px; padding: 11px 14px; font-size:calc(0.875 * var(--tap-fs)); }
	.tap-chad-sticky .tap-sticky-price { max-width: 56%; }
}
@media (max-width: 340px) {
	.tap-sticky-inner { gap: 8px; }
	.tap-sticky-price { max-width: 48%; }
	.tap-sticky .tap-btn,
	.tap-sticky .tap-btn-cta { min-width: 0; max-width: 52%; padding-left: 10px; padding-right: 10px; }
	.tap-cta-lock { display: none; }
}

/* Consistent frequent touch targets. */
.tap-topstrip-btn,
.tap-cst-sheet-x,
.tap-x,
.tap-chad-minus,
.tap-chad-plus,
.tap-pf-step button,
.tap-member-step button,
.tap-extra-step button {
	min-width: 44px !important;
	min-height: 44px !important;
}
.tap-check-row { min-height: 44px; }
.tap-check-row input[type="checkbox"],
.tap-check-row input[type="radio"] { width: 22px !important; height: 22px !important; }

/* Stable card rhythm and readable metadata. */
.tap-pcard h3,
.tap-cst-name,
.tap-bkcard-name,
.tap-il-card__title {
	overflow: hidden;
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	line-clamp: 2;
}
.tap-pcard h3,
.tap-cst-name { min-height: 2.6em; }
.tap-root .tap-caption,
.tap-root .tap-cst-chip,
.tap-root .tap-ticket-status,
.tap-root .tap-badge { font-size: max(12px, .75rem); }

/* Explicit consultation actions: preserve admin-controlled card/photo/alignment
   tokens while making the available action visible at listing level. */
.tap-cst-card { cursor: default; align-items: flex-start; }
.tap-cst-card:hover { transform: translateY(-1px); }
.tap-cst-card-actions {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 8px;
	margin-top: 12px;
}
.tap-cst-card-action {
	width: 100%;
	min-width: 0;
	min-height: 44px;
	padding: 9px 10px;
	font-size:calc(0.7813 * var(--tap-fs));
	white-space: normal;
	line-height: 1.2;
}
.tap-cst-name { margin: 0; }
@media (max-width: 380px) {
	.tap-cst-card { padding: 12px; gap: 10px; }
	.tap-cst-card-actions { grid-template-columns: 1fr; }
}

/* Button system polish using existing white-label semantic tokens. */
.tap-btn {
	transition:
		background-color var(--tap-motion-quick) var(--tap-ease-standard),
		border-color var(--tap-motion-quick) var(--tap-ease-standard),
		color var(--tap-motion-quick) var(--tap-ease-standard),
		box-shadow var(--tap-motion-standard) var(--tap-ease-standard),
		transform var(--tap-motion-quick) var(--tap-ease-standard);
}
.tap-btn:focus-visible {
	outline: 3px solid color-mix(in srgb, var(--tap-purple, #6109be) 70%, #fff);
	outline-offset: 3px;
}
.tap-btn[aria-busy="true"] { cursor: progress; }
.tap-btn[aria-busy="true"]::before {
	content: "";
	width: 1em;
	height: 1em;
	border: 2px solid currentColor;
	border-right-color: transparent;
	border-radius: 50%;
	animation: tapButtonSpin .7s linear infinite;
}
@keyframes tapButtonSpin { to { transform: rotate(360deg); } }

@media (prefers-reduced-motion: reduce) {
	.tap-btn[aria-busy="true"]::before { animation-duration: 1.4s; }
	.tap-cst-card:hover,
	.tap-wa-fab:hover { transform: none !important; }
}

/* Final narrow-viewport containment. The base bundle deliberately exposes
   booking overflow for legacy overlays; constrain only the inline axis here
   so internal rails remain scrollable without widening the document. */
.tap-root,
.tap-root.tap-booking-root,
.tap-booking-root,
.tap-consult-root,
.tap-dashboard-root {
	overflow-x: hidden !important;
	overflow-x: clip !important;
}
.tap-section-scroller,
.tap-hscroll,
.tap-hscroll-snap,
.tap-filter-bar,
.tap-deity-grid,
.tap-tabs,
.tap-ptabs,
.tap-cst-chiprow {
	contain: inline-size;
	overflow-y: hidden;
}

/* Temporary surface stacking. The install prompt occupies the first transient
   layer above navigation/checkout. Toast feedback is placed above it, while
   the global support FAB temporarily yields to the prompt. */
:root { --tap-transient-pwa-h: 0px; }
.tap-pwa-bar {
	bottom: calc(var(--tap-fixed-bottom-h, 0px) + 12px) !important;
}
.tap-toast,
.tap-toast-region .tap-toast {
	bottom: calc(var(--tap-fixed-bottom-h, 0px) + var(--tap-transient-pwa-h, 0px) + 22px) !important;
}
body.tap-has-pwa-prompt .tap-wa-fab,
body.tap-has-pwa-prompt #tap-wa-float { display: none !important; }
@media (min-width: 781px) {
	.tap-pwa-bar { bottom: 20px !important; }
	.tap-toast,
	.tap-toast-region .tap-toast {
		bottom: calc(20px + var(--tap-transient-pwa-h, 0px) + 10px) !important;
	}
}

/* Tablet/desktop transaction dock. Keep the dock compact and centred instead
   of stretching a mobile action surface across the whole browser window. */
body.tap-has-transaction-sticky .tap-wa-fab,
body.tap-has-transaction-sticky #tap-wa-float { display: none !important; }
@media (min-width: 768px) {
	.tap-sticky {
		left: 50%;
		right: auto;
		width: calc(100% - 32px);
		max-width: 720px;
		transform: translateX(-50%);
		flex-direction: row;
		align-items: center;
		border-radius: 18px 18px 0 0;
		padding: 10px 16px 12px;
	}
	.tap-sticky > .tap-countdown-long,
	.tap-sticky-trust { display: none !important; }
	.tap-sticky-inner { flex: 1 1 auto; }
	.tap-sticky .tap-btn,
	.tap-sticky .tap-btn-cta { flex: 0 1 auto; }
}
@media (min-width: 1024px) {
	.tap-sticky { max-width: 880px; }
}

/* Installation promotion must never interrupt an active booking decision.
   The prompt may appear again on catalogue, home or account surfaces. */
body.tap-has-transaction-sticky .tap-pwa-bar { display: none !important; }

/* On compact dashboard and consultation surfaces, support is already
   contextual and the floating control would cover cards or primary actions. */
@media (max-width: 780px) {
	body.tap-surface-dashboard .tap-wa-fab,
	body.tap-surface-dashboard #tap-wa-float,
	body.tap-surface-consult .tap-wa-fab,
	body.tap-surface-consult #tap-wa-float { display: none !important; }
}
/* ===== END assets/css/tap-phase2.css ===== */

/* ===== BEGIN assets/css/tap-a2z.css ===== */
/* TalentAstro v7.4.0 — final additive frontend design layer. */
.tap-app{--tap-a2z-soft:color-mix(in srgb,var(--tap-purple,#6109be) 5%,#fff);--tap-a2z-warm:color-mix(in srgb,var(--tap-gold,#f99000) 8%,#fff);--tap-a2z-line:color-mix(in srgb,var(--tap-purple,#6109be) 13%,#fff);--tap-a2z-shadow:0 12px 36px rgba(37,15,51,.08);--tap-a2z-shadow-sm:0 6px 18px rgba(37,15,51,.065);--tap-a2z-radius:clamp(16px,2.4vw,22px)}
.tap-app .tap-root h1,.tap-app .tap-root h2,.tap-app .tap-home-root h1,.tap-app .tap-home-root h2{text-wrap:balance}.tap-app .tap-root p,.tap-app .tap-home-root p{text-wrap:pretty}
.tap-app [data-primary-action=true],.tap-app .tap-sticky>.tap-btn,.tap-app .tap-sticky .tap-btn-cta,.tap-app .tap-ob-cta{min-height:48px;font-weight:800;letter-spacing:-.01em}.tap-app button:focus-visible,.tap-app a:focus-visible,.tap-app [role=link]:focus-visible{outline:3px solid color-mix(in srgb,var(--tap-purple,#6109be) 36%,transparent);outline-offset:3px}
.tap-splash{isolation:isolate;min-height:100dvh}.tap-splash-inner{max-width:min(86vw,520px)}.tap-splash-logo{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.24);box-shadow:0 16px 50px rgba(0,0,0,.18)}
.tap-onboard{align-items:center;justify-content:center;background:radial-gradient(circle at 12% 4%,color-mix(in srgb,var(--tap-gold,#f99000) 17%,transparent),transparent 36%),linear-gradient(180deg,#fff 0%,var(--tap-a2z-soft,#f7f1fc) 100%);overflow-y:auto}.tap-onboard:before{content:none}.tap-ob-skip{position:fixed;top:max(14px,env(safe-area-inset-top));right:16px;z-index:2;min-width:62px;min-height:40px;border:1px solid var(--tap-a2z-line,#e9dff1);border-radius:999px;background:rgba(255,255,255,.92);color:var(--tap-muted,#6b5b78);font-weight:750;box-shadow:var(--tap-a2z-shadow-sm)}.tap-ob-hero,.tap-ob-body{width:min(100%,620px)}.tap-ob-hero{padding-top:18px}.tap-ob-brand{color:var(--tap-purple,#6109be)}.tap-ob-hero h1{max-width:18ch;margin-inline:auto;font-size:clamp(30px,8vw,48px)}.tap-ob-hero p{max-width:46ch;margin-inline:auto}.tap-ob-grid{gap:12px}.tap-ob-card{position:relative;min-height:132px;text-align:left;padding:15px;border:1px solid var(--tap-a2z-line,#e8def0);border-radius:18px;background:rgba(255,255,255,.94);box-shadow:var(--tap-a2z-shadow-sm)}.tap-ob-card:after{content:'›';position:absolute;right:13px;top:14px;color:var(--tap-purple,#6109be);font-size:calc(1.375 * var(--tap-fs));font-weight:800}.tap-ob-card-ic{margin-bottom:12px}.tap-ob-card-lb{padding-right:24px}.tap-ob-card-ds{min-height:0}.tap-ob-inner-circle{border-radius:18px}.tap-ob-cta{border-radius:var(--tap-btn-radius);box-shadow:0 12px 28px color-mix(in srgb,var(--tap-purple,#6109be) 28%,transparent)}
.tap-home-root .tap-hero-compact{border-radius:clamp(20px,3vw,30px);box-shadow:var(--tap-a2z-shadow);min-height:var(--tap-hero-h-d,360px);display:grid;align-items:end}.tap-home-root .tap-hero-compact:after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(23,7,34,.08),rgba(23,7,34,.62));pointer-events:none}.tap-home-root .tap-hero-compact-body{position:relative;z-index:2;max-width:720px}.tap-home-root .tap-hero-compact-search{background:rgba(255,255,255,.96);box-shadow:0 16px 38px rgba(20,7,29,.2)}.tap-home-root .tap-mkb-item,.tap-home-root .tap-fcard,.tap-home-root .tap-hl-tile,.tap-home-root .tap-hl-vip,.tap-home-root .tap-testi2{border-radius:var(--tap-a2z-radius);box-shadow:var(--tap-a2z-shadow-sm);border:1px solid var(--tap-a2z-line)}.tap-home-root .tap-fcard-art{aspect-ratio:4/3}.tap-home-root .tap-fcard-body{min-height:128px}.tap-home-root .tap-trust3{background:var(--tap-a2z-warm);border:1px solid color-mix(in srgb,var(--tap-gold,#f99000) 22%,#fff);border-radius:var(--tap-a2z-radius)}
.tap-a2z-catalogue .tap-search-box{position:sticky;top:calc(var(--tap-fixed-top-h,0px) + 8px);z-index:8;background:rgba(255,255,255,.92);backdrop-filter:blur(14px);padding:6px;border:1px solid var(--tap-a2z-line);border-radius:16px;box-shadow:var(--tap-a2z-shadow-sm)}.tap-catalogue-section{margin:28px 0 8px}.tap-catalogue-section .tap-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:13px}.tap-section-viewall{border:0;background:transparent;color:var(--tap-brand-ink,var(--tap-brand-ink-safe,var(--tap-purple,#6109be)));font-size:calc(0.8125 * var(--tap-fs));font-weight:800;min-height:44px}.tap-a2z-catalogue .tap-section-scroller{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(250px,78vw);gap:14px;overflow-x:auto;scroll-snap-type:x mandatory;padding:3px 3px 17px}.tap-a2z-sale-card{position:relative;scroll-snap-align:start;border:1px solid var(--tap-a2z-line)!important;border-radius:var(--tap-a2z-radius)!important;background:#fff;box-shadow:var(--tap-a2z-shadow-sm)!important;overflow:hidden;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease}.tap-a2z-sale-card:hover{transform:translateY(-3px);box-shadow:var(--tap-a2z-shadow)!important}.tap-a2z-sale-card .tap-thumb{aspect-ratio:4/3}.tap-a2z-sale-card .tap-body{padding:15px}.tap-a2z-sale-card .tap-body h3{font-size:calc(1.0625 * var(--tap-fs));line-height:1.3;margin-bottom:7px}.tap-a2z-sale-card .tap-card-benefit{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:40px}.tap-a2z-sale-card .tap-book-btn-sm{width:100%;min-height:44px;border-radius:var(--tap-btn-radius);margin-top:12px;background:var(--tap-cta-bg,var(--tap-cta-bg-safe,var(--tap-purple,#6109be)));color:var(--tap-cta-text,#fff);border:0;font-weight:800}
.tap-a2z-detail .tap-a2z-section-card,.tap-a2z-detail>.tap-section{border:1px solid var(--tap-a2z-line);background:#fff;border-radius:var(--tap-a2z-radius);padding:clamp(16px,3.5vw,24px);box-shadow:var(--tap-a2z-shadow-sm);margin-block:14px}.tap-a2z-detail .tap-vh-title{font-size:clamp(25px,6.4vw,38px)}.tap-a2z-puja .tap-sheet-trigger{min-height:72px;box-shadow:0 5px 18px rgba(37,15,51,.04)}.tap-a2z-puja .tap-live-price{background:var(--tap-a2z-soft);border-radius:12px;margin-top:10px}.tap-a2z-puja .tap-tier-card{border-width:1.5px;border-radius:16px;min-height:112px}.tap-a2z-puja .tap-tier-card.is-sel{box-shadow:0 0 0 3px color-mix(in srgb,var(--tap-purple,#6109be) 11%,transparent)}
.tap-a2z-chadhava .tap-chad-list{display:grid;gap:12px}.tap-a2z-chadhava .tap-chad-item{min-height:132px;border:1px solid var(--tap-a2z-line);border-radius:18px;padding:14px;background:#fff;box-shadow:var(--tap-a2z-shadow-sm);align-items:center}.tap-a2z-chadhava .tap-chad-item.is-on,.tap-a2z-chadhava .tap-chad-item.has-selection{border-color:var(--tap-purple,#6109be);background:var(--tap-a2z-soft)}.tap-a2z-chadhava .tap-chad-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.tap-a2z-chadhava .tap-chad-img{width:86px;height:78px;border-radius:13px;overflow:hidden;background:var(--tap-a2z-warm)}.tap-a2z-chadhava .tap-chad-img img{width:100%;height:100%;object-fit:cover}.tap-a2z-chadhava .tap-chad-step{min-height:36px;border:1px solid var(--tap-purple,#6109be);border-radius:10px;background:#fff;overflow:hidden}.tap-a2z-chadhava .tap-chad-step button{min-width:36px;min-height:36px}.tap-a2z-healing .tap-slot{min-height:58px;border-radius:13px}.tap-a2z-detail .tap-sticky{border-top:1px solid var(--tap-a2z-line);background:rgba(255,255,255,.96);backdrop-filter:blur(18px);box-shadow:0 -14px 36px rgba(37,15,51,.11)}.tap-a2z-detail .tap-sticky-trust{display:none}.tap-a2z-detail .tap-sticky .tap-btn{border-radius:var(--tap-btn-radius)}
.tap-a2z-summary{max-width:1120px!important}.tap-a2z-summary-panel{border:1px solid var(--tap-a2z-line)!important;border-radius:clamp(18px,3vw,26px)!important;box-shadow:var(--tap-a2z-shadow)!important;padding:clamp(18px,4vw,30px)!important;background:#fff}.tap-a2z-kicker{display:inline-flex;color:var(--tap-purple,#6109be);background:var(--tap-a2z-soft);padding:5px 9px;border-radius:999px;font-size:calc(0.625 * var(--tap-fs));font-weight:900;letter-spacing:.07em;text-transform:uppercase}.tap-a2z-summary-panel .tap-summary-context{background:var(--tap-a2z-soft);border:1px solid var(--tap-a2z-line);border-radius:15px;padding:13px 15px}.tap-a2z-summary-panel .tap-summary{border:1px solid var(--tap-a2z-line);border-radius:16px;overflow:hidden}.tap-a2z-summary-panel .tap-total{background:var(--tap-a2z-soft);font-size:calc(1.0625 * var(--tap-fs))}.tap-a2z-summary-panel .tap-sumsaved{background:#eaf8f0;color:#14744f}.tap-a2z-summary-panel>.tap-btn-block{min-height:52px;border-radius:var(--tap-btn-radius);font-size:calc(1 * var(--tap-fs))}.tap-a2z-dashboard .tap-prof-card,.tap-a2z-dashboard .tap-dash-card,.tap-a2z-dashboard .tap-bkcard,.tap-a2z-dashboard .tap-wallet-card{border:1px solid var(--tap-a2z-line);border-radius:var(--tap-a2z-radius);box-shadow:var(--tap-a2z-shadow-sm)}

.tap-a2z-detail .tap-progress-bar{margin:16px 0 20px;padding:12px 14px;border:1px solid var(--tap-a2z-line);border-radius:16px;background:#fff;box-shadow:var(--tap-a2z-shadow-sm)}.tap-a2z-detail .tap-progress-step.active .tap-ps-num{box-shadow:0 0 0 4px color-mix(in srgb,var(--tap-purple,#6109be) 11%,transparent)}.tap-a2z-detail .tap-progress-step.done .tap-ps-num{background:#eaf8f0;color:#14744f;border-color:#bfe6d2}.tap-a2z-detail .tap-bsheet{border-radius:24px 24px 0 0;box-shadow:0 -18px 56px rgba(37,15,51,.2)}.tap-a2z-detail .tap-bsheet-hd{position:sticky;top:0;z-index:2;background:#fff;border-bottom:1px solid var(--tap-a2z-line)}.tap-a2z-detail .tap-bsheet-done{min-height:48px;border-radius:var(--tap-btn-radius);font-weight:800}.tap-a2z-dashboard .tap-a2z-dashboard-card,.tap-astrologer-panel-root .tap-a2z-provider-card{border:1px solid var(--tap-a2z-line)!important;border-radius:var(--tap-a2z-radius)!important;background:#fff;box-shadow:var(--tap-a2z-shadow-sm)!important}.tap-a2z-dashboard .tap-bkcard-actions .tap-btn-primary,.tap-a2z-dashboard .tap-cst-card-action,.tap-astrologer-panel-root .tap-astro-sess .tap-btn-primary{min-height:44px;border-radius:var(--tap-btn-radius);font-weight:800}.tap-astrologer-panel-root .tap-astro-presence{border:1px solid var(--tap-a2z-line);border-radius:14px;background:var(--tap-a2z-soft);padding:10px 12px}.tap-a2z-consult .tap-cst-profile-panel,.tap-a2z-consult .tap-cst-scheduler,.tap-a2z-consult .tap-cst-card{border-color:var(--tap-a2z-line);box-shadow:var(--tap-a2z-shadow-sm)}
@media(min-width:768px){.tap-ob-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.tap-a2z-catalogue .tap-section-scroller{grid-auto-columns:minmax(250px,300px)}.tap-a2z-catalogue .tap-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.tap-a2z-chadhava .tap-chad-list{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:1024px){.tap-a2z-catalogue .tap-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.tap-a2z-catalogue .tap-section-scroller{grid-auto-flow:initial;grid-template-columns:repeat(4,minmax(0,1fr));overflow:visible}.tap-a2z-summary-panel{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr);column-gap:28px;align-items:start}.tap-a2z-summary-panel>.tap-a2z-kicker,.tap-a2z-summary-panel>h2,.tap-a2z-summary-panel>h2+div,.tap-a2z-summary-panel>.tap-summary-context,.tap-a2z-summary-panel>.tap-summary-section-title,.tap-a2z-summary-panel>.tap-summary{grid-column:1}.tap-a2z-summary-panel>.tap-btn-block,.tap-a2z-summary-panel>.tap-btn-block~div,.tap-a2z-summary-panel>p{grid-column:2}}
@media(max-width:767.98px){.tap-onboard{justify-content:flex-start;padding-top:max(58px,env(safe-area-inset-top))}.tap-ob-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.tap-ob-card{min-height:126px;padding:13px}.tap-home-root .tap-hero-compact{min-height:var(--tap-hero-h-m,330px)}.tap-a2z-catalogue .tap-grid{display:grid;grid-template-columns:1fr;gap:14px}.tap-a2z-sale-card{display:grid!important;grid-template-columns:122px minmax(0,1fr);min-height:190px}.tap-a2z-sale-card .tap-thumb{height:100%;min-height:190px;aspect-ratio:auto}.tap-a2z-sale-card .tap-body{padding:13px;min-width:0}.tap-a2z-sale-card .tap-body h3{font-size:calc(0.9688 * var(--tap-fs))}.tap-a2z-sale-card .tap-card-benefit{font-size:calc(0.75 * var(--tap-fs));min-height:34px}.tap-a2z-sale-card .tap-book-btn-sm{min-height:44px;margin-top:8px;font-size:calc(0.8125 * var(--tap-fs))}.tap-a2z-detail{padding-bottom:calc(var(--tap-fixed-bottom-h,76px) + 80px)!important}.tap-a2z-detail .tap-a2z-section-card,.tap-a2z-detail>.tap-section{padding:15px;border-radius:17px}.tap-a2z-chadhava .tap-chad-item{min-height:118px}.tap-a2z-chadhava .tap-chad-img{width:66px;height:66px;font-size:calc(1.625 * var(--tap-fs))}.tap-a2z-summary-panel{border-radius:18px!important;padding:17px!important}}
/* ═══ v7.5.8 — Chadhava offering card ═════════════════════════════════════
   The quantity stepper is position:absolute inside .tap-chad-right, designed
   to overhang a product photo the way a grocery app's ADD button does. With
   no photo uploaded the "image" falls back to a single emoji glyph in an 82px
   box, so the stepper overhung it by 82px — measured — and the card read as
   two broken outlines stacked on each other.

   Stacked instead of overlapped: image on top, stepper directly beneath,
   both centred in the same column. Works identically whether the operator has
   uploaded a real photo or not, which is the actual variable here. */
.tap-a2z-chadhava .tap-chad-right{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;position:static}
.tap-a2z-chadhava .tap-chad-step{position:static;transform:none;margin:0;background:#fff;border:1.5px solid var(--tap-purple,#6109be);border-radius:10px;overflow:hidden;display:inline-flex;align-items:center}
.tap-a2z-chadhava .tap-chad-step button{min-width:36px;min-height:36px;background:transparent;border:0;color:var(--tap-purple,#6109be);font-weight:800;font-size:calc(1 * var(--tap-fs));cursor:pointer}
.tap-a2z-chadhava .tap-chad-img{width:74px;height:74px;border-radius:14px;display:grid;place-items:center;font-size:calc(1.875 * var(--tap-fs));line-height:1;flex:0 0 auto}
.tap-a2z-chadhava .tap-chad-img img{width:100%;height:100%;object-fit:cover;border-radius:14px}
.tap-a2z-chadhava .tap-chad-item{align-items:center;gap:14px}
/* REGRESSION FIX (mine, v7.5.8→v7.5.10). tap-premium.css sets
   `.tap-chad-qty { color:#fff }` — correct when the stepper sat on the solid
   green Chadhava bar. v7.5.8 made the stepper white to unify the CTA colour
   and left the count white on white: the number was in the DOM, 20px wide,
   and completely invisible. Exactly the failure the old green-bar comment in
   tap-premium.css warned about, reintroduced from the other direction. */
.tap-a2z-chadhava .tap-chad-qty{color:var(--tap-ink,#1e0a2e);font-weight:800;font-size:calc(1.0625 * var(--tap-fs));min-width:26px;text-align:center;font-variant-numeric:tabular-nums}
/* The selected count is the number the devotee is tracking, so it gets the
   brand colour and a soft chip once it is above zero — countable at a glance
   rather than a grey digit between two buttons. */
.tap-a2z-chadhava .tap-chad-item.is-on .tap-chad-qty,
.tap-a2z-chadhava .tap-chad-item.has-selection .tap-chad-qty{color:var(--tap-purple,#6109be)}
/* ── v7.6.4: flattened FEATURE cards need a foreground too ────────────────
   `.tap-a2z-dashboard-card` repaints the profile-hub header and the wallet
   card white, but their text is still the #fff that only works on the violet
   gradient — so on this theme the profile header rendered as an EMPTY WHITE
   BOX. Present since v7.6.3 and invisible to every automated check, because
   the text is in the DOM and only the paint is wrong.
   Restate the foreground for the flattened variant. */
.tap-a2z-dashboard .tap-phub-card,
.tap-a2z-dashboard .tap-wallet-card{color:var(--tap-ink,#1e0a2e)}
.tap-a2z-dashboard .tap-phub-name,
.tap-a2z-dashboard .tap-phub-stat-num,
.tap-a2z-dashboard .tap-phub-uid-val,
.tap-a2z-dashboard .tap-wallet-bal{color:var(--tap-ink,#1e0a2e)}
.tap-a2z-dashboard .tap-phub-meta,
.tap-a2z-dashboard .tap-phub-stat-lbl,
.tap-a2z-dashboard .tap-phub-uid-lbl,
.tap-a2z-dashboard .tap-wallet-lbl,
.tap-a2z-dashboard .tap-wallet-note{color:var(--tap-muted,#6b5b78)}
.tap-a2z-dashboard .tap-phub-avatar,
.tap-a2z-dashboard .tap-phub-tier{background:var(--tap-purple-pale,#f0e8fd);color:var(--tap-purple,#6109be)}
.tap-a2z-dashboard .tap-phub-stat.has-div{border-right-color:var(--tap-a2z-line,#e6dfe4)}
.tap-a2z-dashboard .tap-phub-uid{background:var(--tap-a2z-soft,#f4f1f7);border-color:var(--tap-a2z-line,#e6dfe4)}

/* v7.6.4: the a2z theme only needs to reconcile the chooser with its own line
   colour — the structure now lives in tap-adaptive.css. The old `.tap-wpay`
   rules went with the cards they styled. */
.tap-a2z-summary-panel .tap-paymethod{border-color:var(--tap-a2z-line,#e6dfe4);border-radius:15px}
.tap-a2z-summary-panel .tap-wshort{background:var(--tap-sunk,#f4f1f7);border-color:var(--tap-a2z-line,#e6dfe4);border-radius:15px}

/* Meta chips: inline SVG sits on the text baseline without shifting it. */
.tap-a2z-detail .tap-vh-chip{display:inline-flex;align-items:center;gap:5px}
.tap-a2z-detail .tap-vh-chip-ic{display:inline-flex;opacity:.7;flex:0 0 auto}
/* "Add Extra Members" is a label — one line, and NOT truncated.
   Measured at 390px: the label needs 136px but the middle column was handed
   only 125px, so nowrap alone just turned the wrap into "Add Extra Mem…".
   Reclaim the difference from the two fixed columns instead of clipping the
   text: the leading icon is decorative (36px is ample now that the card has
   no second line) and the gaps tighten. 36 + 136 + 134 + 20 = 326 inside a
   334px content box, so it fits with room to spare.
   flex-basis:auto so the middle column asks for its CONTENT width rather than
   starting at 0 and being squeezed. The ellipsis stays as the last-resort
   fallback for a longer translation — it should never be reached in English. */
.tap-pf-card{gap:10px}
.tap-pf-family .tap-pf-ic{width:36px;height:36px;flex:0 0 36px;font-size:calc(1.0625 * var(--tap-fs))}
.tap-pf-family .tap-pf-mid{flex:1 1 auto;min-width:0}
.tap-pf-name-1line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;letter-spacing:-.005em}
/* Measured at 390px: card content box 330px = icon 36 + mid 135 + step 132 +
   2×13 gap. The step spent 20px of that on internal gaps between its own three
   parts (44 + 24 + 44 + 10 + 10), which is also why it read as three floating
   controls rather than one. Closing that gap returns the 20px to the label —
   which needs 137 and now gets 155 — and turns the stepper into a single
   segmented pill, matching the offering-card stepper on the same screen.

   Selectors are .tap-root-prefixed because tap-premium.css owns these at
   ".tap-root .tap-pf-step" (0,2,0) — a bare ".tap-pf-step" (0,1,0) silently
   loses and the gap stays 10px. */
.tap-root .tap-pf-step{gap:0;display:inline-flex;align-items:center;border:1.5px solid var(--tap-a2z-line,#e6dfe4);border-radius:11px;overflow:hidden;background:#fff}
.tap-root .tap-pf-step .tap-pf-count{min-width:24px;text-align:center;font-variant-numeric:tabular-nums;font-weight:800;color:var(--tap-ink,#1e0a2e)}
.tap-root .tap-pf-step button{width:auto;height:auto;min-width:44px;min-height:44px;border:0;border-radius:0;background:transparent;color:var(--tap-purple,#6109be);font-weight:800;font-size:calc(1 * var(--tap-fs));cursor:pointer}
.tap-root .tap-pf-step button:disabled{opacity:.4;cursor:default}
.tap-pf-step-plus[aria-disabled="true"]{opacity:.55}
/* Optional short description under an offering title (admin-configurable).
   Clamped to two lines so a long one cannot push the card out of rhythm. */
.tap-a2z-chadhava .tap-chad-desc{margin-top:3px;font-size:calc(0.7813 * var(--tap-fs));line-height:1.45;color:var(--tap-muted,#6b5b78);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

/* ═══ v7.5.1 — detail-page content: Benefits / Process / Inclusions ═══════
   These three read as generic paragraphs. Each now gets the shape its content
   actually has: a tab strip that looks selectable, a numbered rail for a real
   sequence, and a tick list for "what you get". */

/* Tab strip — a scroll rail with an edge fade so it is obvious more exists,
   and a selected state carried by weight + fill, not colour alone. */
.tap-a2z-detail .tap-info-sec{position:relative}
.tap-a2z-detail .tap-info-chips{display:flex;gap:8px;overflow-x:auto;scrollbar-width:none;padding:2px 22px 12px 2px;-webkit-mask-image:linear-gradient(90deg,#000 88%,transparent);mask-image:linear-gradient(90deg,#000 88%,transparent)}
.tap-a2z-detail .tap-info-chips::-webkit-scrollbar{display:none}
.tap-a2z-detail .tap-info-chip{display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;min-height:44px;padding:0 15px;border-radius:999px;border:1.5px solid var(--tap-a2z-line);background:#fff;color:var(--tap-muted,#6b5b78);font-size:calc(0.875 * var(--tap-fs));font-weight:700;white-space:nowrap;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease}
.tap-a2z-detail .tap-info-chip .tap-chip-ic{display:inline-flex;opacity:.75}
.tap-a2z-detail .tap-info-chip:hover{border-color:color-mix(in srgb,var(--tap-purple,#6109be) 40%,#fff)}
.tap-a2z-detail .tap-info-chip.is-on{background:var(--tap-purple,#6109be);border-color:var(--tap-purple,#6109be);color:#fff;font-weight:800}
.tap-a2z-detail .tap-info-chip.is-on .tap-chip-ic{opacity:1}
.tap-a2z-detail .tap-info-chip:focus-visible{outline:3px solid color-mix(in srgb,var(--tap-purple,#6109be) 40%,transparent);outline-offset:2px}
.tap-a2z-detail .tap-info-panel:focus-visible{outline:2px solid color-mix(in srgb,var(--tap-purple,#6109be) 34%,transparent);outline-offset:4px;border-radius:10px}

/* Process — a numbered rail. The connector is what turns four separate rows
   into one visible sequence; ::before is drawn behind the numerals so it never
   crosses a digit. Numbering is kept because the order is real information. */
.tap-a2z-detail .tap-steps-rail{list-style:none;margin:0;padding:0;position:relative;display:grid;gap:0}
.tap-a2z-detail .tap-steps-rail .tap-step-row{position:relative;display:grid;grid-template-columns:34px minmax(0,1fr);gap:14px;padding:0 0 20px;align-items:start}
.tap-a2z-detail .tap-steps-rail .tap-step-row:last-child{padding-bottom:0}
.tap-a2z-detail .tap-steps-rail .tap-step-row:not(:last-child):before{content:'';position:absolute;left:17px;top:34px;bottom:2px;width:2px;background:linear-gradient(180deg,color-mix(in srgb,var(--tap-purple,#6109be) 34%,#fff),var(--tap-a2z-line));border-radius:2px}
.tap-a2z-detail .tap-steps-rail .tap-step-n{position:relative;z-index:1;width:34px;height:34px;display:grid;place-items:center;border-radius:50%;background:var(--tap-a2z-soft);border:1.5px solid color-mix(in srgb,var(--tap-purple,#6109be) 30%,#fff);color:var(--tap-purple,#6109be);font-weight:800;font-size:calc(0.875 * var(--tap-fs));font-variant-numeric:tabular-nums}
.tap-a2z-detail .tap-steps-rail .tap-step-t{font-weight:750;font-size:calc(0.9375 * var(--tap-fs));line-height:1.35;color:var(--tap-ink,#1e0a2e)}
.tap-a2z-detail .tap-steps-rail .tap-step-d{margin-top:3px;font-size:calc(0.8438 * var(--tap-fs));line-height:1.55;color:var(--tap-muted,#6b5b78)}

/* Inclusions — a tick list. The mark is a filled disc so it reads as
   "confirmed included" at a glance rather than a bullet. */
.tap-a2z-detail .tap-incl-check{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.tap-a2z-detail .tap-incl-check li{display:grid;grid-template-columns:22px minmax(0,1fr);gap:11px;align-items:start;font-size:calc(0.9063 * var(--tap-fs));line-height:1.5;color:var(--tap-ink,#1e0a2e)}
.tap-a2z-detail .tap-incl-tick{width:22px;height:22px;display:grid;place-items:center;border-radius:50%;background:#eaf8f0;color:#14744f;margin-top:1px}
.tap-a2z-detail .tap-incl-tick .tap-i{width:13px;height:13px;stroke-width:2.4}
@media(min-width:768px){.tap-a2z-detail .tap-incl-check{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 22px}}

/* Countdown — segmented tiles. Tabular figures in a fixed-width box stop the
   line reflowing every second, which the single-run-of-text version did. */
.tap-cd-hero .tap-countdown-long{display:flex;flex-wrap:wrap;align-items:center;gap:10px;justify-content:center}
.tap-cd-label{font-size:calc(0.6875 * var(--tap-fs));font-weight:900;letter-spacing:.09em;text-transform:uppercase;color:var(--tap-muted,#6b5b78)}
.tap-cd-tiles{display:inline-flex;align-items:flex-start;gap:4px}
.tap-cd-seg{display:grid;justify-items:center;gap:2px;min-width:46px;padding:6px 6px 5px;border-radius:11px;background:var(--tap-a2z-soft);border:1px solid var(--tap-a2z-line)}
.tap-cd-num{font-size:calc(1.1875 * var(--tap-fs));font-weight:800;line-height:1;font-variant-numeric:tabular-nums;color:var(--tap-ink,#1e0a2e);font-style:normal}
.tap-cd-unit{font-size:calc(0.5938 * var(--tap-fs));font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--tap-muted,#6b5b78);font-style:normal}
.tap-cd-sep{align-self:center;margin-top:-8px;color:var(--tap-a2z-line);font-weight:800}
.tap-countdown-long.urgent .tap-cd-seg{background:color-mix(in srgb,var(--tap-gold,#f99000) 14%,#fff);border-color:color-mix(in srgb,var(--tap-gold,#f99000) 40%,#fff)}
.tap-countdown-long.urgent .tap-cd-num{color:#8a4b00}

/* Sticky bar price — it carried its own opaque white fill with square corners,
   so beside the rounded CTA it read as a text input the devotee could type in.
   The bar underneath is already white and blurred; the price only needs
   typographic weight, not a panel of its own. */
/* ═══ v7.5.5 — the booking bar ═════════════════════════════════════════════
   Price and CTA both read as generic: a bare number beside a plain pill. The
   bar is the last thing between a devotee and a payment, so it gets a caption
   the amount can hang off, one dominant brand-filled action with a direction
   cue, and a real pressed state. ONE colour for every vertical — Puja, VIP
   Puja, Chadhava and Healing all resolve to the tenant's brand token. */
.tap-a2z-detail .tap-sticky .tap-btn-cta,
.tap-a2z-chadhava .tap-sticky .tap-btn-cta,
.tap-a2z-healing .tap-sticky .tap-btn-cta{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:52px;padding:0 20px;border:0;border-radius:var(--tap-btn-radius);background:var(--tap-cta-bg,var(--tap-cta-bg-safe,var(--tap-purple,#6109be)));color:var(--tap-cta-text,#fff);font-size:calc(0.9688 * var(--tap-fs));font-weight:800;letter-spacing:-.005em;box-shadow:0 8px 22px -8px color-mix(in srgb,var(--tap-purple,#6109be) 70%,transparent);transition:transform .14s ease,box-shadow .14s ease,filter .14s ease}
.tap-a2z-detail .tap-sticky .tap-btn-cta:hover{filter:brightness(1.06)}
.tap-a2z-detail .tap-sticky .tap-btn-cta:active{transform:translateY(1px) scale(.985);box-shadow:0 4px 12px -6px color-mix(in srgb,var(--tap-purple,#6109be) 70%,transparent)}
.tap-a2z-detail .tap-sticky .tap-btn-cta .tap-cta-lock{display:inline-flex;opacity:.9}
.tap-a2z-detail .tap-sticky .tap-btn-cta .tap-cta-go{display:inline-flex;opacity:.75;margin-left:-2px}
.tap-a2z-detail .tap-sticky .tap-btn-cta.is-disabled{background:var(--tap-sunk,#f1ecf5);color:var(--tap-muted,#6b5b78);box-shadow:none}
.tap-a2z-detail .tap-sticky .tap-btn-cta.is-disabled .tap-cta-go{display:none}
/* "Total" caption above the amount — the number alone gave the devotee nothing
   to anchor it to, and on a two-line bar it read as a stray figure. */
.tap-a2z-detail .tap-sticky .tap-sticky-price:before{content:attr(data-cap);display:block;font-size:calc(0.625 * var(--tap-fs));font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--tap-muted,#6b5b78);line-height:1}
@media(prefers-reduced-motion:reduce){.tap-a2z-detail .tap-sticky .tap-btn-cta{transition:none}}

/* Root cause: tap-premium.css styles `.tap-root .tap-sticky, .tap-root
   .tap-sticky-price` in ONE grouped selector, so the price block — a CHILD of
   the bar — is given the bar's own chrome a second time: white fill, backdrop
   blur, top border and drop shadow. That draws a panel inside a panel, and at
   190px wide with square corners beside a rounded CTA it reads as a text input.
   tap-premium already carries a narrow `.tap-chad-sticky .tap-sticky-price`
   override, so this was known on the Chadhava bar and fixed only there. */
.tap-a2z-detail .tap-sticky .tap-sticky-price{background:transparent!important;border:0!important;border-radius:0;box-shadow:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;padding:0;min-width:0;display:grid;align-content:center;justify-items:start;line-height:1.15}
.tap-a2z-detail .tap-sticky .tap-sticky-price>div{font-size:calc(1.25 * var(--tap-fs));font-weight:800;color:var(--tap-ink,#1e0a2e);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.tap-a2z-detail .tap-sticky .tap-sticky-inner{gap:12px;align-items:center}

/* Reveal — everything is visible by default; JS arms the hidden state only
   when it can also guarantee the reveal. Never hide content behind an
   animation that might not run. */
.tap-reveal-armed{opacity:0;transform:translateY(9px)}
.tap-reveal-armed.tap-reveal-in{opacity:1;transform:none;transition:opacity .3s cubic-bezier(.25,.46,.45,.94) var(--tap-reveal-d,0ms),transform .3s cubic-bezier(.25,.46,.45,.94) var(--tap-reveal-d,0ms)}
@media(prefers-reduced-motion:reduce){.tap-reveal-armed{opacity:1!important;transform:none!important;transition:none!important}}

/* Staging-only OTP notice. It is a status, not an error, so it reads in the
   gold accent rather than borrowing the red error box and overriding it inline. */
.tap-test-otp{margin-bottom:10px;padding:10px 14px;border:1px solid color-mix(in srgb,var(--tap-gold,#f99000) 42%,#fff);border-radius:var(--tap-radius-sm,10px);background:color-mix(in srgb,var(--tap-gold,#f99000) 12%,#fff);color:#6d5200;font-size:calc(0.8125 * var(--tap-fs));font-weight:800;text-align:center;letter-spacing:.02em;font-variant-numeric:tabular-nums}
/* 44x44 minimum on every OTP box, and a focus ring that survives the custom
   border — six 1-character inputs are the easiest place to miss both. */
.tap-otp-boxes input{min-width:44px;min-height:48px;font-variant-numeric:tabular-nums}
.tap-otp-boxes input:focus-visible{outline:3px solid color-mix(in srgb,var(--tap-purple,#6109be) 40%,transparent);outline-offset:2px}
@media(max-width:359px){.tap-ob-grid{grid-template-columns:1fr}.tap-a2z-sale-card{grid-template-columns:108px minmax(0,1fr)}.tap-otp-boxes input{min-width:38px}}@media(prefers-reduced-motion:reduce){.tap-a2z-sale-card,.tap-ob-card,.tap-ob-cta{transition:none!important;animation:none!important}}

/* ─────────────────────────────────────────────────────────────────────────
   v7.5.18 — ONE BUTTON SYSTEM.

   Before this block the same logical action rendered four different ways
   depending on which screen it happened to be on:

     .tap-btn-primary / .tap-btn-xl  purple→red gradient        (tap-premium)
     .tap-btn-cta                    gradient + 999px pill      (tap-frontend)
     .tap-btn-cta (on a2z detail)    solid brand + 15px radius  (tap-a2z)
     .tap-btn-gold                   GOLD gradient, brown text  (tap-premium)
     .tap-btn-green                  solid semantic success     (tap-premium)

   The gold one was the worst offender because of WHERE it sits: it is the
   "Pay ₹… securely" button. The single most important click in the product
   was the one button that never carried the operator's brand colour — it was
   painted from --grad-gold, a fixed orange/yellow ramp, on a white-label
   platform whose whole promise is that the tenant picks the colour. Green had
   the same flaw from the other side: it was wired to --tap-ok, the SEMANTIC
   SUCCESS token, so "this succeeded" and "buy this" said the same thing.

   Radii were hardcoded four times (12/13/14/15px) while Layout Studio →
   Button style was quietly writing --tap-btn-radius that nothing honoured.

   The rule now: a primary action is SOLID BRAND, --tap-cta-text on top, and
   every button — primary, secondary and ghost alike — takes its radius,
   weight and padding from the operator's tokens. The alias class names are
   kept so no call site breaks, but they are aliases, not variants: prefer
   .tap-btn-primary in new code.

   Deliberately NOT unified: .tap-btn-wa keeps WhatsApp green. That is another
   company's brand mark and recolouring it would misrepresent the channel; it
   is aligned on geometry only.
   ───────────────────────────────────────────────────────────────────────── */
/* Contrast-safe brand shade.

   White text on the raw tenant brand (#e24e12) measures 3.94:1 — under the
   4.5:1 WCAG 1.4.3 minimum, and a 15px label does not qualify for the 3:1
   large-text allowance. So the filled buttons cannot use the raw brand.

   v6.9.92 had ALREADY solved exactly this and introduced --tap-ink-accent
   (72% brand + 28% black, with an @supports fallback to the raw brand) for
   the dashboard's brand-coloured text and its one filled control. These
   aliases deliberately point AT that token rather than defining a second,
   slightly-different dark shade: two derived shades would have put the
   dashboard's buttons on one colour and every other page's on another, which
   is the exact class of bug this block exists to remove.

   Declared on .tap-app (the body class) as well as .tap-root, because the
   home and onboarding screens render under .tap-home-root, not .tap-root —
   declaring on .tap-root alone would leave those buttons falling through to
   the raw brand and quietly re-introduce the split. */
.tap-app,
.tap-root{
	--tap-cta-bg-safe:var(--tap-ink-accent,var(--tap-purple,#6109be));
	--tap-brand-ink-safe:var(--tap-ink-accent,var(--tap-purple,#6109be));
}
.tap-root .tap-btn-primary,
.tap-root .tap-btn-cta,
.tap-root .tap-btn-xl,
.tap-root .tap-btn-gold,
.tap-root .tap-btn-green{
	background:var(--tap-cta-bg,var(--tap-cta-bg-safe));
	color:var(--tap-cta-text,#fff);
	border:0;
	border-radius:var(--tap-btn-radius);
	/* 800 everywhere, not var(--tap-btn-weight): the sticky bars already
	   force 800 on the primary action, so deferring to the token here left
	   the SAME button at 700 inside a card and 800 in the sticky bar. The
	   weight is part of what makes a primary action read as primary, so it
	   is fixed for this tier; the secondary tier below keeps the token. */
	font-weight:800;
	box-shadow:0 8px 22px -8px color-mix(in srgb,var(--tap-purple,#6109be) 70%,transparent);
	transition:transform .14s ease,box-shadow .14s ease,filter .14s ease;
}
.tap-root .tap-btn-primary:hover,
.tap-root .tap-btn-cta:hover,
.tap-root .tap-btn-xl:hover,
.tap-root .tap-btn-gold:hover,
.tap-root .tap-btn-green:hover{
	background:var(--tap-cta-bg,var(--tap-cta-bg-safe));
	filter:brightness(1.06);
	box-shadow:0 10px 26px -8px color-mix(in srgb,var(--tap-purple,#6109be) 78%,transparent);
}
.tap-root .tap-btn-primary:active,
.tap-root .tap-btn-cta:active,
.tap-root .tap-btn-xl:active,
.tap-root .tap-btn-gold:active,
.tap-root .tap-btn-green:active{
	transform:translateY(1px) scale(.985);
	box-shadow:0 4px 12px -6px color-mix(in srgb,var(--tap-purple,#6109be) 70%,transparent);
}
/* The secondary tier shares the geometry so a row of mixed buttons lines up. */
.tap-root .tap-btn-ghost,
.tap-root .tap-btn-soft,
.tap-root .tap-btn-secondary,
.tap-root .tap-btn-wa{
	border-radius:var(--tap-btn-radius);
	font-weight:var(--tap-btn-weight,700);
}
/* Brand-coloured LABEL on a light fill — needs the darker of the two shades.
   .tap-btn-soft is authored with !important in tap-phase2, so this has to
   match it to land at all. */
.tap-root .tap-btn-ghost,
.tap-root .tap-btn-secondary{
	color:var(--tap-brand-ink,var(--tap-brand-ink-safe));
}
.tap-root .tap-btn-soft{
	color:var(--tap-brand-ink,var(--tap-brand-ink-safe))!important;
}
/* Touch target: WCAG 2.5.5 / the 44px rule, on every button in the app. */
.tap-root .tap-btn{min-height:44px}
.tap-root .tap-btn-sm{min-height:44px}
@media(prefers-reduced-motion:reduce){
	.tap-root .tap-btn-primary,.tap-root .tap-btn-cta,.tap-root .tap-btn-xl,
	.tap-root .tap-btn-gold,.tap-root .tap-btn-green{transition:none}
	.tap-root .tap-btn-primary:active,.tap-root .tap-btn-cta:active,.tap-root .tap-btn-xl:active,
	.tap-root .tap-btn-gold:active,.tap-root .tap-btn-green:active{transform:none}
}

/* ─────────────────────────────────────────────────────────────────────────
   v7.5.30 — DESKTOP tier for splash + onboarding.

   Both screens were authored mobile-first and then simply centred on desktop:
   at 1440px the onboarding hero and body were still capped at 620px, so the
   four choice cards computed to 136px each. A 136px card holding a serif
   title and a two-line description is a phone card being shown on a monitor —
   it reads as unfinished rather than focused, and it is the FIRST screen a
   devotee sees.

   This does not stretch the mobile layout; it gives the cards a desktop size
   and lets the copy breathe, while keeping the composition centred and well
   inside the audit's 1200–1280px content ceiling.
   ───────────────────────────────────────────────────────────────────────── */
@media (min-width:1024px){
	.tap-onboard .tap-ob-hero,
	.tap-onboard .tap-ob-body{width:min(100%,880px)}
	.tap-onboard .tap-ob-grid{gap:18px}
	.tap-onboard .tap-ob-card{min-height:164px;padding:20px}
	.tap-onboard .tap-ob-card-lb{font-size:calc(1.125 * var(--tap-fs))}
	.tap-onboard .tap-ob-card-ds{font-size:calc(0.8438 * var(--tap-fs));line-height:1.45}
	.tap-onboard .tap-ob-card-ic{margin-bottom:14px}
	/* The hero headline is clamped to 8vw, which at 1440px resolves far larger
	   than the 48px ceiling was ever meant to allow on a wide screen. */
	.tap-onboard .tap-ob-hero h1{font-size:clamp(32px,3.4vw,44px);max-width:22ch}
	.tap-onboard .tap-ob-hero p{max-width:58ch}
	/* Splash: the mark is sized for a phone; on a monitor it is a speck. */
	.tap-splash-logo{width:104px;height:104px;font-size:calc(3.25 * var(--tap-fs))}
	.tap-splash-brand{font-size:calc(2.125 * var(--tap-fs))}
	.tap-splash-tag{font-size:calc(1 * var(--tap-fs))}
}

/* v7.5.34 — the featured card's CTA. Geometry only: fill, radius, weight and
   the 44px target all come from the one button system above, so this cannot
   drift away from every other primary button in the product. Placed as a block
   at the foot of the card so it sits identically whether the card has an
   image, a price, a temple line or a rating. */
.tap-home-root .tap-fcard{display:flex;flex-direction:column}
.tap-home-root .tap-fcard .tap-fcard-body{flex:1 1 auto}
.tap-home-root .tap-fcard-cta{
	display:flex;align-items:center;justify-content:center;
	margin:10px 14px 14px;text-decoration:none;font-size:calc(0.8125 * var(--tap-fs));
}

/* ─────────────────────────────────────────────────────────────────────────
   v7.5.36 — close the hole in the one-button system: overlays.

   Every unification rule above is scoped `.tap-root .tap-btn-*`. The sign-in
   modal, however, is appended to document.body — OUTSIDE .tap-root — so none
   of it applied there. Measured on the live sign-in screen: "Send OTP" was
   painted with the RAW brand at 3.94:1 while the identical .tap-btn-primary
   everywhere else resolved to the contrast-safe shade at 6.71:1. The most
   important button on the login screen was the one button the system missed.

   Re-scoping to .tap-app (the body class) instead of .tap-root covers the page
   AND anything portalled out of it. Same specificity (0,2,0) and later in the
   file, so it simply extends the existing rules rather than fighting them.
   ───────────────────────────────────────────────────────────────────────── */
.tap-app .tap-btn-primary,
.tap-app .tap-btn-cta,
.tap-app .tap-btn-xl,
.tap-app .tap-btn-gold,
.tap-app .tap-btn-green{
	background:var(--tap-cta-bg,var(--tap-cta-bg-safe));
	color:var(--tap-cta-text,#fff);
	border:0;
	border-radius:var(--tap-btn-radius);
	font-weight:800;
}
.tap-app .tap-btn-ghost,
.tap-app .tap-btn-secondary{color:var(--tap-brand-ink,var(--tap-brand-ink-safe))}
.tap-app .tap-btn-soft{color:var(--tap-brand-ink,var(--tap-brand-ink-safe))!important}

/* The sign-in screen's own brand-filled controls were outside the system too.
   Tabs measured 3.94:1, channel chips 3.94:1 — both white-on-raw-brand. */
.tap-app .tap-auth-tab.active,
.tap-app .tap-chip.is-active{
	background:var(--tap-cta-bg,var(--tap-cta-bg-safe));
	color:var(--tap-cta-text,#fff);
}
/* Brand-coloured TEXT on white: "Continue as Guest" was 3.31:1. */
.tap-app .tap-resend{color:var(--tap-brand-ink,var(--tap-brand-ink-safe))}

/* Touch targets on the sign-in screen (WCAG 2.5.5). Measured: tabs 43px,
   channel chips 36px, "Continue as Guest" 23px. */
.tap-app .tap-auth-tab{min-height:44px}
.tap-app .tap-modal .tap-chip{min-height:44px}
.tap-app .tap-resend{min-height:44px;display:inline-flex;align-items:center}

/* iOS zooms the page when a focused input is under 16px. This project has
   already shipped one bug from exactly that (sub-16px inputs); the sign-in
   fields were still at 15px. */
.tap-app .tap-modal input,
.tap-app .tap-modal select,
.tap-app .tap-modal textarea{font-size:calc(1 * var(--tap-fs))}

/* v7.5.36 — --tap-muted resolves to rgb(138,106,79) on this brand, which is
   2.98:1 on white: it fails 1.4.3 wherever it carries real text rather than
   decoration. Scoped to the sign-in hint, which is instructional copy telling
   a devotee what "Continue as Guest" costs them — the one place on that screen
   where being hard to read has a consequence. Left as a targeted fix, not a
   global --tap-muted change, because that token is used decoratively in many
   places and re-tuning it globally needs its own measured pass. */
.tap-app .tap-auth-hint{color:color-mix(in srgb,var(--tap-muted,#6b5b78) 62%,#000)}

/* v7.5.36 — the guest-note copy was a hardcoded #888 at 12px: 2.98:1 on white.
   It is the line that explains what a devotee gives up by continuing as a
   guest, so it is exactly the wrong sentence to make hard to read. #6b6b6b
   clears 4.5:1 at this size while staying visibly secondary to the body copy. */
.tap-app .tap-guest-note p{color:#666}

/* v7.5.37 — inline stroke icons sitting beside a text label.
   Emoji carried their own baseline and spacing; an inline SVG does not, so
   without this the icon sat on the text baseline and the label lost its gap.
   flex + a shared gap keeps icon and label optically centred at any size. */
.tap-app .tap-auth-tab,
.tap-app .tap-fcard-temple,
.tap-app .tap-temple-loc{display:inline-flex;align-items:center;gap:6px}
.tap-app .tap-auth-tab{justify-content:center}
.tap-app .tap-i{flex:0 0 auto;vertical-align:middle}

/* ── Icon system (v7.6.0) ──────────────────────────────────────────────────
   The emoji sweep replaced 276 OS-painted glyphs with one registry. Three
   shapes can now come out of a single icon slot — an inline SVG, an operator's
   uploaded image, or a literal text glyph — and all three have to sit on the
   same optical line beside a label, or the replacement looks worse than what
   it replaced.

   `.tap-ilbl` is the wrapper the renderers emit so callers stop hand-rolling
   the icon+label concatenation (half of them used to forget it, which is why
   some icons sat on the text baseline and others did not). */
.tap-app .tap-i,
.tap-root .tap-i,
.tap-home-root .tap-i{flex:0 0 auto;vertical-align:middle}
.tap-i-img{object-fit:contain;display:inline-block}
/* A text glyph has font metrics an SVG does not: line-height:1 stops it
   inflating the row it sits in, and the flex box re-centres it. */
.tap-i-text{display:inline-flex;align-items:center;justify-content:center;line-height:1;font-style:normal;font-weight:400}
.tap-ilbl{display:inline-flex;align-items:center;gap:6px;min-width:0}
.tap-ilbl>span{min-width:0}
/* Bottom navigation and card art size icons from a variable so an operator's
   uploaded PNG lands at exactly the size the shipped SVG occupies. */
.tap-bnav-icon .tap-i,
.tap-topnav-ic .tap-i{width:var(--tap-nav-ic,24px);height:var(--tap-nav-ic,24px)}
.tap-bnav-icon,.tap-topnav-ic{display:inline-flex;align-items:center;justify-content:center}

/* ── Section layout + device visibility (v7.6.0) ───────────────────────────
   Shared by the homepage per-section settings and by [tap_services] /
   [tap_collection], so "carousel" means one thing in this product.

   DEVICE VISIBILITY IS CSS, NOT PHP, ON PURPOSE. Branching server-side would
   let a page cache serve the first visitor's device layout to everyone — a
   silent, unreproducible failure. The breakpoint is TAP_Device::BP_DESKTOP
   (1024px), the same line the navigation already switches on, so a section set
   to "mobile only" disappears exactly where the bottom bar gives way to the
   desktop header. Keep the two in step. */
/* TWO mechanisms, because there are two situations and one rule cannot serve
   both — found by measuring, after each single-rule attempt broke the other case:

   1. The class sits on an element that IS content (the shortcode's own
      <section>). It must stay a normal box, or it loses its padding and its
      .tap-root styling context. Only the media query applies.
   2. TAP_Section_Config::wrap() receives arbitrary section HTML and has to add
      a <div>. In a WordPress block theme an unknown <div> is treated as
      ordinary constrained content — it took a 1265px column down to 645px and
      halved every card inside it. `.tap-devwrap` removes that box from layout
      so the wrapper can only ever do its one job.

   display:none still wins in case 2: it applies to the box `contents` erases. */
.tap-devwrap{display:contents}
@media (max-width:1023.98px){ .tap-only-desktop{display:none !important} }
@media (min-width:1024px){ .tap-only-mobile{display:none !important} }

/* v7.6.0 REGRESSION FIX. The emoji sweep replaced the live indicator's red
   circle emoji with an empty <span class="tap-pulse-dot"> carrying only an
   animation — and no rule ever gave that class a size, colour or shape, so the
   "Live Seva Preparation" strip lost its indicator entirely. An emoji brings
   its own glyph; a span brings nothing. Every emoji-to-element swap has to add
   the box the glyph used to be.
   Sized and coloured to match .tap-live-dot, the equivalent indicator
   elsewhere in the product, rather than inventing a third look. */
.tap-pulse-dot{display:inline-block;flex:0 0 auto;width:8px;height:8px;border-radius:50%;
  background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 22%,transparent)}
@media (prefers-reduced-motion:reduce){ .tap-pulse-dot{animation:none !important} }

.tap-lay{display:grid;gap:14px}
.tap-lay-list{grid-template-columns:1fr}
.tap-lay-grid{grid-template-columns:1fr}
/* Carousel is a horizontal snap rail, matching the featured strip the homepage
   already uses — not a JS slider. No dependency, works without script, and the
   scrollbar is the affordance. */
.tap-lay-carousel{grid-auto-flow:column;grid-auto-columns:minmax(250px,78vw);
  overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:14px}
.tap-lay-carousel>*{scroll-snap-align:start}
@media (min-width:768px){
  .tap-lay-grid.tap-lay-c2,.tap-lay-grid.tap-lay-c3,.tap-lay-grid.tap-lay-c4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .tap-lay-carousel{grid-auto-columns:minmax(250px,300px)}
}
@media (min-width:1024px){
  .tap-lay-grid.tap-lay-c3{grid-template-columns:repeat(3,minmax(0,1fr))}
  .tap-lay-grid.tap-lay-c4{grid-template-columns:repeat(4,minmax(0,1fr))}
  .tap-lay-carousel{grid-auto-flow:column;overflow-x:auto}
}
/* .tap-fcard ships `width:230px` — correct for the featured rail it was drawn
   for, wrong in a grid cell, where it left a 230px card sitting in a 283px
   track with a ragged gutter down the right of every row. Found by measuring
   the rendered page, not by reading the CSS: the rule lives in tap-frontend.css
   and nothing about the new markup hints at it. The track (or the row) owns the
   width in every layout here. */
.tap-lay>.tap-fcard{width:100%;height:100%}

/* The shortcode can land inside a theme page with its own container, so it
   never assumes full-bleed. */
.tap-svc-shortcode{padding:8px 0 4px}
.tap-svc-shortcode .tap-fcard{height:100%}
@media (prefers-reduced-motion:reduce){ .tap-lay-carousel{scroll-behavior:auto} }

/* ══ Responsive & compatibility pass (v7.6.1) ═════════════════════════════
   Findings from an automated sweep at 375/480/768/1024/1280/1440 across the
   home, catalogue and shortcode surfaces. Hit areas only — no visual redesign:
   where a control is deliberately small, the TARGET grows and the paint does
   not. */

/* ── Hero scrim: covered 198px of a 360px hero ────────────────────────────
   `.tap-hero-compact` gained `display:grid; align-items:end` in v7.5.x for the
   bottom-aligned body. That turned the pre-existing `:after` scrim into a grid
   ITEM, and `align-items:end` beat its `bottom:0`, so the darkening gradient
   stopped partway down and left a hard horizontal band across the hero — the
   one visible in the reported screenshot. `place-self:stretch` puts it back
   over the whole box. `align-self:stretch` alone is NOT enough (measured: still
   198px); the height:auto is what releases the inset-derived size. */
.tap-home-root .tap-hero-compact:after{place-self:stretch;height:auto;width:auto}

/* ── Touch targets (WCAG 2.5.8 / 2.5.5) ──────────────────────────────────
   Measured under 44px at one or more breakpoints. Chips take a real min-height,
   matching `.tap-info-chip` which the detail page already holds at 44 — this is
   alignment with the existing system, not a new decision. */
.tap-app .tap-festival-chip,
.tap-root .tap-festival-chip,
.tap-home-root .tap-festival-chip{min-height:44px;display:inline-flex;align-items:center;gap:6px}
.tap-app .tap-search-sug,
.tap-root .tap-search-sug,
.tap-home-root .tap-search-sug{min-height:44px;display:inline-flex;align-items:center}

/* Text actions ("See all ›", "View all"). The LABEL keeps its size; the row it
   sits in grows to a thumb-sized target. */
.tap-root .tap-sec-action,
.tap-home-root .tap-sec-action,
.tap-root .tap-view-all,
.tap-home-root .tap-view-all,
.tap-root .tap-section-viewall{min-height:44px;display:inline-flex;align-items:center}

/* Icon buttons keep their drawn size and gain an invisible hit area, so the
   card art is untouched while the thumb target reaches 44px. */
.tap-root .tap-fcard-heart,
.tap-home-root .tap-fcard-heart{position:absolute;isolation:isolate}
.tap-root .tap-fcard-heart:before,
.tap-home-root .tap-fcard-heart:before{content:"";position:absolute;top:50%;left:50%;
  width:44px;height:44px;transform:translate(-50%,-50%);border-radius:50%}
.tap-root .tap-search-submit,
.tap-home-root .tap-search-submit{min-height:44px;min-width:44px}

/* 43px is not 44px. The card CTA sat one pixel under at three breakpoints. */
.tap-root .tap-fcard-cta,
.tap-home-root .tap-fcard-cta{min-height:44px}

/* ── iOS zoom floor ───────────────────────────────────────────────────────
   Safari zooms the page when a focused field is under 16px, which on a booking
   form reads as the layout breaking. The app already holds this inside modals;
   this closes the remaining fields (hero search, filter inputs). */
.tap-root input,.tap-root select,.tap-root textarea,
.tap-home-root input,.tap-home-root select,.tap-home-root textarea{font-size:max(16px,1rem)}

/* ══ The plugin must never force horizontal scroll on a host theme ═════════
   THE BUG: on a 375px viewport the page scrolled to 596px. Proven ours, not
   the theme's — a plain page with no shortcode measured 375px clean, and
   hiding the TAP root alone dropped 596 -> 375. Reproduced on both Twenty
   Twenty-Five and Twenty Twenty-Three.

   THE MECHANISM: `.tap-root` already carried `max-width:100%; overflow-x:clip`
   (tap-adaptive). `clip` is not `hidden`. It suppresses PAINTING of the
   overflow but does NOT make the element a scroll container, so the content's
   min-content width still propagates outward — and a block theme sizing its
   content wrapper to fit that intrinsic width grew to 596px, taking the whole
   document with it. Every TAP element then measured "fine" relative to its
   already-inflated parent, which is why per-element overflow checks found
   nothing for several passes.

   THE FIX: `contain:inline-size` states that the element's inline size does not
   depend on its contents — already true, since max-width:100% governs it. The
   intrinsic width can no longer leak to an ancestor. Measured against four
   alternatives; it is the only one that worked:
       contain:inline-size  596 -> 375   <-- this
       min-width:0          596 -> 596
       overflow-x:hidden    596 -> 596
       width:100%           596 -> 596
   Inline-size containment does NOT imply layout or paint containment, so
   position:sticky headers and absolutely positioned children are unaffected.
   Horizontal rails keep their own overflow-x:auto and still scroll. */
.tap-root,
.tap-home-root,
.tap-booking-root,
.tap-dashboard-root,
.tap-consult-root,
.tap-astrologer-panel-root{contain:inline-size}

/* Review stars are now per-review, so an unrated review shows none and a
   4-star review shows four. The old markup printed five glyphs on every card
   regardless of what anyone actually gave. */
.tap-root .tap-testi2-stars{display:inline-flex;gap:2px;line-height:1}
.tap-root .tap-star{color:var(--tap-a2z-line,#e0d6ec)}
.tap-root .tap-star.is-on{color:var(--tap-gold,#f99000)}
.tap-root .tap-testi2-src{margin-top:6px;font-size:.75rem;color:var(--tap-muted,#6b5b78)}

/* ══════════════════════════════════════════════════════════════════════════
   MOBILE-FIRST FLUID LAYER (v7.6.1)

   SCOPE, STATED HONESTLY. The component CSS in this product is 636 fixed-px
   font-sizes and 453 fixed-px paddings across five stylesheets. Converting all
   of them to fluid units would change how every screen looks at every
   intermediate width — that is a redesign, and the brief for this work says
   preserve the existing UI. So this layer does the part that is both safe and
   genuinely missing:

     - every clamp() MINIMUM is the value measured on a 375px phone today, so
       mobile is pixel-identical and nothing regresses on the highest-priority
       breakpoint;
     - the maximum is the value the design already reaches at >=1280px, so the
       desktop end is unchanged too;
     - what changes is the MIDDLE — sizes now interpolate smoothly instead of
       jumping at a media-query edge, and the two values that never scaled at
       all (container gutter, section rhythm) now do.

   Every ramp uses the accessible `rem + vw` form rather than raw vw. A pure-vw
   font-size ignores the user's browser text-size setting entirely, which fails
   WCAG 1.4.4; including a rem term keeps zoom working.

   Measured endpoints this layer reproduces (375px -> 1280px):
     hero h1        24 -> 34    (was a media-query step)
     hero sub       14 -> 17    (was 14 flat at every width)
     section title  22 -> 32    (was a step)
     container pad  16 -> 32    (was 16 flat, phone gutters on a 1440 display)
     section rhythm 48 -> 72    (was 48 flat)
   ══════════════════════════════════════════════════════════════════════════ */
.tap-root,.tap-home-root,.tap-booking-root,.tap-dashboard-root,.tap-consult-root{
  /* One place to retune the scale. Consumed below; safe to override per-site. */
  --tap-fluid-gutter : clamp(1rem, 0.59rem + 1.77vw, 2rem);
  --tap-fluid-section: clamp(3rem, 2.38rem + 2.65vw, 4.5rem);
  --tap-fluid-h1     : clamp(1.5rem, 1.24rem + 1.10vw, 2.125rem);
  --tap-fluid-h2     : clamp(1.375rem, 1.12rem + 1.10vw, 2rem);
  --tap-fluid-lead   : clamp(0.875rem, 0.80rem + 0.33vw, 1.0625rem);
  --tap-fluid-gap    : clamp(0.75rem, 0.6rem + 0.66vw, 1.25rem);
}

/* Container: the gutter was 16px from a 320px phone to a 1440px monitor. */
.tap-root .tap-container,
.tap-home-root .tap-container{
  padding-left:var(--tap-fluid-gutter);
  padding-right:var(--tap-fluid-gutter);
  width:100%;
  box-sizing:border-box;
}

/* Vertical rhythm: 48px between sections reads as cramped past ~1024px. */
.tap-home-root .tap-home-section{
  padding-top:var(--tap-fluid-section);
  padding-bottom:var(--tap-fluid-section);
}

/* Type. Endpoints match today's design; only the interpolation is new. */
.tap-home-root .tap-hero-compact-title{font-size:var(--tap-fluid-h1);line-height:1.15}
.tap-home-root .tap-hero-compact-sub{font-size:var(--tap-fluid-lead);line-height:1.5}
.tap-root .tap-sec-title,
.tap-home-root .tap-sec-title{font-size:var(--tap-fluid-h2);line-height:1.2}

/* ── Responsive images ────────────────────────────────────────────────────
   Only three `img{max-width:100%}` rules existed across the whole frontend, so
   any image an operator uploads at its natural size could push a layout wider
   than its column. This makes it universal inside the app roots and keeps the
   aspect ratio. */
.tap-root img,.tap-root video,.tap-root svg:not(.tap-i),
.tap-home-root img,.tap-home-root video,
.tap-booking-root img,.tap-dashboard-root img,.tap-consult-root img{
  max-width:100%;
  height:auto;
}
/* An <img> with width/height attributes keeps its ratio while scaling. */
.tap-root img[width][height],.tap-home-root img[width][height]{height:auto}

/* ── Responsive tables ────────────────────────────────────────────────────
   A table has an intrinsic minimum width and will happily push a phone layout
   sideways. It scrolls inside its own box instead — the standard treatment,
   and the only one that does not hide data. */
.tap-root table,.tap-dashboard-root table{width:100%;border-collapse:collapse}
.tap-root .tap-table-wrap,.tap-dashboard-root .tap-table-wrap{
  overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;
}

/* ── Modals and sheets on a phone ─────────────────────────────────────────
   dvh rather than vh so the mobile browser's collapsing address bar does not
   leave the action button under the fold, plus the home-indicator inset. */
@supports (height:100dvh){
  .tap-app .tap-modal,.tap-app .tap-bsheet{max-height:min(92dvh,calc(100dvh - 1rem))}
}
.tap-app .tap-bsheet,.tap-app .tap-sticky{padding-bottom:max(0px,env(safe-area-inset-bottom))}

/* ── Forms ────────────────────────────────────────────────────────────────
   Fields fill their column and never exceed it, on every screen. */
.tap-root .tap-input,.tap-root input[type=text],.tap-root input[type=tel],
.tap-root input[type=email],.tap-root input[type=number],.tap-root select,
.tap-root textarea{width:100%;max-width:100%;box-sizing:border-box}

/* ── Long content must wrap, not stretch ──────────────────────────────────
   A single unbroken string (a long temple name, a pasted URL) sets a grid
   track's min-content width and can widen the whole row. */
.tap-root .tap-fcard-name,.tap-root .tap-testi2-quote,.tap-root .tap-sec-title,
.tap-home-root .tap-fcard-name,.tap-home-root .tap-testi2-quote{overflow-wrap:anywhere}

/* ══════════════════════════════════════════════════════════════════════════
   FULL-WIDTH MOBILE — the wasted side gutters (v7.6.2)

   REPORTED: dead space down both sides of every page on a phone.

   ROOT CAUSE, measured on a 375px viewport (hero card was 255px — 32% of the
   screen lost to stacked horizontal padding, 60px per side):

     wp-site-blocks        375   pad 0        theme
     entry-content         375   pad 30px     THEME content padding
     .tap-root             315   pad 14px     OURS  (tap-premium, <=767px)
     .tap-container        287   pad 16px     OURS  (tap-frontend)
     .tap-hero-compact     255   pad 20px     card's own inner padding

   So it is TWO faults, not one:
     1. we apply a horizontal gutter at TWO nested levels — the root AND the
        container — which double-pads every page that uses both;
     2. we never opt out of the host theme's content padding, so the theme's
        gutter is added on top of our two.

   FIX
     - the CONTAINER is the single owner of the horizontal gutter;
     - the ROOT carries none, unless it has no container inside it (the SPA
       roots render their own markup), in which case it takes the gutter itself
       so nothing is left flush against the screen edge;
     - the root negates the host theme's padding using the WordPress-standard
       `--wp--style--root--padding-*` custom properties. Deliberately NOT the
       `margin-inline: calc(50% - 50vw)` viewport trick: 100vw includes the
       scrollbar, so on desktop that technique reintroduces the horizontal
       scroll this codebase just spent a sprint removing. The custom properties
       are scrollbar-safe and fall back to 0px on a theme that does not define
       them, which is exactly today's behaviour — so a non-block theme is
       unaffected rather than broken.
   ══════════════════════════════════════════════════════════════════════════ */
.tap-root,
.tap-home-root,
.tap-booking-root,
.tap-dashboard-root,
.tap-consult-root,
.tap-astrologer-panel-root{
  padding-left:0;
  padding-right:0;
  /* margins handled by the corrected block below */
}

/* The one gutter. Fluid: 16px on a phone (unchanged) up to 32px on a desktop,
   where 16px looked like a phone layout stretched wide. */
.tap-root .tap-container,
.tap-home-root .tap-container,
.tap-booking-root .tap-container,
.tap-dashboard-root .tap-container{
  padding-left:var(--tap-fluid-gutter);
  padding-right:var(--tap-fluid-gutter);
  max-width:var(--tap-content-max, 1120px);
  margin-left:auto;
  margin-right:auto;
  width:100%;
  box-sizing:border-box;
}

/* A root that renders no .tap-container (the JS surfaces build their own
   markup) still needs the gutter, or its content sits on the screen edge.
   :has() is progressive: a browser without it keeps today's behaviour. */
@supports selector(:has(*)){
  .tap-root:not(:has(.tap-container)),
  .tap-booking-root:not(:has(.tap-container)),
  .tap-dashboard-root:not(:has(.tap-container)),
  .tap-consult-root:not(:has(.tap-container)),
  .tap-astrologer-panel-root:not(:has(.tap-container)){
    padding-left:var(--tap-fluid-gutter);
    padding-right:var(--tap-fluid-gutter);
  }
}
/* Without :has(), keep a gutter on the SPA roots specifically — they are the
   ones that never contain a .tap-container. */
@supports not selector(:has(*)){
  .tap-booking-root,.tap-dashboard-root,.tap-consult-root{
    padding-left:var(--tap-fluid-gutter);
    padding-right:var(--tap-fluid-gutter);
  }
}

/* ── Full-bleed, corrected (v7.6.2b) ──────────────────────────────────────
   The first attempt above zeroed our own double padding (60px -> 46px per
   side) but the negative margins computed to 0 and the theme's gutter stayed.
   Three separate reasons, each found by measuring rather than reasoning:

     1. `calc(-1 * var(--x))` was dropped as invalid; `calc(0px - var(--x))`
        is the portable form.
     2. `max-width:100%` (tap-adaptive/phase2) caps the element at its
        containing block, so a negative margin cannot widen it. Needs
        `max-width:none`.
     3. `contain:inline-size` — added earlier to stop content leaking width to
        the theme — ALSO freezes the element against negative margins. It needs
        an explicit `width` to have a definite size to contain.

   With all three addressed the root spans the viewport, but bleeding into the
   parent's padding made the PARENT scroll by exactly that padding (31px). The
   theme's content wrapper therefore clips horizontally — `clip`, not `hidden`,
   so it never becomes a scroll container and sticky/fixed children still work.
   `:has()` scopes it to a wrapper that actually contains one of our roots, so
   a theme's other pages are untouched.

   Result at 375px: content 255px -> 343px, 68% -> 91% of the screen, 0 overflow.  */
.tap-root,
.tap-home-root,
.tap-booking-root,
.tap-dashboard-root,
.tap-consult-root,
.tap-astrologer-panel-root{
  box-sizing:border-box;
  max-width:none;
  width:calc(100% + var(--wp--style--root--padding-left, 0px) + var(--wp--style--root--padding-right, 0px));
  /* !important is deliberate and load-bearing. Without it these lose to an
     earlier layer of our OWN stylesheets and compute to 0 — measured: the
     identical declaration applies with it and is dropped without it. */
  margin-left:calc(0px - var(--wp--style--root--padding-left, 0px)) !important;
  margin-right:calc(0px - var(--wp--style--root--padding-right, 0px)) !important;
}

@supports selector(:has(*)){
  :where(.entry-content,.wp-block-post-content,.site-main,main,article,.content-area):has(> .tap-root),
  :where(.entry-content,.wp-block-post-content,.site-main,main,article,.content-area):has(> .tap-home-root),
  :where(.entry-content,.wp-block-post-content,.site-main,main,article,.content-area):has(> .tap-booking-root),
  :where(.entry-content,.wp-block-post-content,.site-main,main,article,.content-area):has(> .tap-dashboard-root),
  :where(.entry-content,.wp-block-post-content,.site-main,main,article,.content-area):has(> .tap-consult-root){
    overflow-x:clip;
  }
}

/* Desktop keeps its measured reading width — the CONTAINER caps and centres it
   now that the root is full-bleed. Same result as the old root max-width, but
   the full-bleed root lets a section paint edge to edge behind it. */
.tap-root .tap-container,
.tap-home-root .tap-container,
.tap-booking-root .tap-container,
.tap-dashboard-root .tap-container,
.tap-consult-root .tap-container{
  max-width:var(--tap-content-max, 1120px);
  margin-left:auto;
  margin-right:auto;
}

/* ══════════════════════════════════════════════════════════════════════════
   FLUID TYPE BASE (v7.6.3) — the one knob for 638 font-sizes

   Every fixed-px font-size in the frontend stylesheets is now expressed as a
   RATIO of this base: `font-size:14px` became
   `font-size:calc(0.875 * var(--tap-fs))`. The whole type system therefore
   scales together and keeps its hierarchy exactly — a 24px heading stays
   exactly 1.714x a 14px body at every viewport.

   THE BASE IS ON OUR ROOTS, NOT ON `html`.
   Setting `html{font-size:clamp(...)}` is the usual recipe and it is the wrong
   choice for a plugin: it rescales the HOST THEME's typography too, on a site
   that is not ours. Scoping the base to the app roots means nothing outside
   DIVSA changes.

   THE RANGE: 16px at 375px -> 18px at 1440px (+12.5%).
   Deliberately modest. Before this, body copy, buttons, chips and labels were
   the SAME pixel size on a 375px phone and a 1440px monitor — measured, not
   assumed — so the app read as a phone layout stretched wide. 12.5% is enough
   to fix that without re-proportioning the design.

   The 375px end is unchanged, so the mobile layout that was just verified
   stays pixel-identical.

   The `rem` term keeps browser text-size settings working (a pure-vw ramp
   ignores them and fails WCAG 1.4.4). --tap-fs-max lets an operator or a
   future site retune the top of the range without touching any component.
   ══════════════════════════════════════════════════════════════════════════ */
.tap-root,
.tap-home-root,
.tap-booking-root,
.tap-dashboard-root,
.tap-consult-root,
.tap-astrologer-panel-root,
.tap-app .tap-modal,
.tap-app .tap-bsheet,
.tap-app .tap-toast,
.tap-bottom-nav,
.tap-bn,
.tap-topnav,
.tap-site-footer{
  --tap-fs: clamp(1rem, 0.957rem + 0.188vw, var(--tap-fs-max, 1.125rem));
}

/* Fixed-height boxes that contain text must be able to grow with it, or the
   type conversion turns them into clipping boxes. Height becomes a floor. */
.tap-root .tap-btn,
.tap-root .tap-btn-sm,
.tap-root .tap-chip,
.tap-root .tap-tab,
.tap-home-root .tap-btn{min-height:44px;height:auto}

/* v7.6.3 REGRESSION FIX from the fluid-type conversion.
   `.tap-chad-step` (the chadhava quantity stepper) is a fixed 36px box with
   overflow:hidden. Once its digits scaled with --tap-fs the content grew past
   36px and was clipped. Height becomes a floor rather than a ceiling — the
   same treatment already applied to buttons and chips. Caught by the clipping
   scan, not by eye. */
.tap-root .tap-chad-step,
.tap-a2z-chadhava .tap-chad-step{height:auto;min-height:40px;overflow:visible}
.tap-root .tap-chad-step button,
.tap-a2z-chadhava .tap-chad-step button{height:auto;min-height:40px;line-height:1}
.tap-root .tap-chad-qty{line-height:1.1}
/* ===== END assets/css/tap-a2z.css ===== */

/* ===== BEGIN assets/css/tap-shell.css ===== */
/**
 * Canonical application shell width contract.
 *
 * This is a source module consumed by assets/css/tap-app.css. It is not
 * enqueued separately. Width ownership belongs to .tap-app-shell; component
 * roots are JS mount points and may no longer decide the page canvas.
 */
.tap-app-shell {
  --tap-shell-gutter: clamp(12px, 2vw, 24px);
  box-sizing: border-box;
  display: block;
  inline-size: 100%;
  max-inline-size: 100%;
  min-inline-size: 0;
  margin-inline: 0;
}

/* One invariant override replaces the historic 720/1160/1280 root rules. */
.tap-app .tap-app-shell > .tap-root,
.tap-app .tap-app-shell > .tap-home-root,
.tap-app .tap-app-shell > .tap-booking-root,
.tap-app .tap-app-shell > .tap-dashboard-root,
.tap-app .tap-app-shell > .tap-consult-root,
.tap-app .tap-app-shell > .tap-astrologer-panel-root {
  box-sizing: border-box;
  inline-size: 100% !important;
  max-inline-size: none !important;
  margin-inline: 0 !important;
  min-inline-size: 0;
}

/* Embedded mode: Elementor, Gutenberg or the active theme owns the container. */
.tap-app-shell--host {
  inline-size: 100%;
  max-inline-size: 100%;
  margin-inline: 0;
}

/* Contained mode: an explicit centred measure, never a left-aligned half page. */
.tap-app-shell--contained {
  inline-size: min(
    var(--tap-content-max, 1160px),
    calc(100% - (2 * var(--tap-shell-gutter)))
  );
  max-inline-size: calc(100% - (2 * var(--tap-shell-gutter)));
  margin-inline: auto;
}

/* Full mode inside the plugin canvas uses all available canvas width. */
.tap-app-shell--full {
  inline-size: 100%;
  max-inline-size: none;
  margin-inline: 0;
}

/* Explicit full-bleed breakout for a TAP-owned site embedded in a narrow theme
   wrapper. This is deterministic mode selection, not viewport guessing. */
body:not(.tap-canvas) .tap-app-shell--full {
  inline-size: 100vw;
  max-inline-size: 100vw;
  margin-inline: calc(50% - 50vw);
}

@supports (width: 100dvw) {
  body:not(.tap-canvas) .tap-app-shell--full {
    inline-size: 100dvw;
    max-inline-size: 100dvw;
    margin-inline: calc(50% - 50dvw);
  }
}

body.tap-width-full {
  overflow-x: clip;
}

@media (max-width: 359px) {
  .tap-app-shell { --tap-shell-gutter: 8px; }
}

/* ── Reading measure (v7.7.3) ───────────────────────────────────────────────
   .tap-app-shell owns the CANVAS width. Nothing owned the READING width, and
   that gap is the "left-heavy / blank right side" report.

   Measured on /book/?puja=3933 at a 1521px viewport BEFORE this rule:
     .tap-progress-bar   1437px
     .tap-vh (hero)      1437px
     .tap-section  x4     840px   <- pinned LEFT, ~600px dead to the right
     .tap-notice-warn    1437px
     .tap-sticky         1489px
   Five blocks, four widths, one of them left-aligned.

   Cause: the v5.0.1 desktop layer caps `.tap-booking-root > .tap-section` at
   840px WITH `margin-inline:auto`, but tap-premium.css then declared
   `.tap-root .tap-section{margin:26px 0}`. Equal specificity (0,2,0) and later
   in the concat order, so the shorthand re-zeroed the inline margins and the
   cap survived without its centring. Handing width ownership to .tap-app-shell
   in v7.7.2 neutralised the ROOT rules but never retired that SECTION cap, so
   the canvas went edge-to-edge while the sections stayed 840px hard left.
   The shorthand is fixed at source; this establishes the single measure.

   Applies to every top-level block, so progress bar, hero, sections, notices
   and the pay bar share ONE column in all three shell modes.

   Inert below the measure: max-inline-size exceeds the viewport and there is
   no free space for auto margins to distribute, so phone layout is unchanged. */
.tap-app-shell > .tap-root > *:not(.tap-sticky),
.tap-app-shell > .tap-home-root > *:not(.tap-sticky),
.tap-app-shell > .tap-booking-root > *:not(.tap-sticky),
.tap-app-shell > .tap-dashboard-root > *:not(.tap-sticky),
.tap-app-shell > .tap-consult-root > *:not(.tap-sticky) {
  max-inline-size: var(--tap-content-max, 1160px);
  /* !important is load-bearing, for the same reason the v7.6.2b full-bleed
     block needs it: `.tap-root *{margin:0}` wins over this selector in
     practice even though this one is more specific. MEASURED on the live page,
     not reasoned about — without !important getComputedStyle().marginLeft is
     `0px` and the block stays hard left; with it the same block reports
     `138.4px` and centres. max-inline-size applied correctly either way, which
     is what made the failure look like a centring bug rather than a cascade
     one. Do not "clean this up" without re-measuring. */
  margin-inline: auto !important;
}

/* ── Catalogue surfaces take the canvas (v7.7.4) ───────────────────────────
   A LISTING is a grid, not prose. Capping the home/services catalogue at the
   reading measure left ~170px dead on each side of a 1501px canvas, which is
   the "home page listing is not full width" report. Detail surfaces are prose
   plus a form and keep the measure; catalogue surfaces take the whole canvas.

   This distinction is exactly what the three shell modes were meant to
   express, but `TAP_Layout::shell_mode()` resolves ONE mode for the entire
   site (option `container_mode`, default auto -> host/full), so every surface
   on a given site gets the same answer. `TAP_App_Shell::wrap()` already emits
   a per-surface class and nothing consumed it — this does.

   MEASURED on the live home page: .tap-container 1160px -> 1501px, zero
   horizontal scroll. !important for the same cascade reason documented above. */
.tap-app-shell--surface-home > .tap-root > *:not(.tap-sticky),
.tap-app-shell--surface-services > .tap-root > *:not(.tap-sticky) {
  max-inline-size: none !important;
}

.tap-app-shell--surface-home .tap-container,
.tap-app-shell--surface-services .tap-container {
  /* The a2z layer caps this with the PHYSICAL `max-width`; overriding only the
     logical property would leave the physical one in force. Set both. */
  max-width: none !important;
  max-inline-size: none !important;
}

/* ── Stacked mobile gutters (v7.7.5) ──────────────────────────────────────
   MEASURED on live at a real 375px viewport (device emulation, not a resized
   window — window resizing never changed the viewport and produced false
   "all clear" readings before):

     375  .elementor-widget-wrap   padding 10/10   <- the HOST's gutter
     355  .tap-app-shell           padding 0
     355  .tap-root                padding 0
     355  .tap-container           padding 15.25   <- OURS, a SECOND gutter
     325  .tap-fcard               padding 14      <- card inner (legitimate)
     295  content = 79% of the screen

   `.tap-root .tap-container{padding:var(--tap-fluid-gutter)}` assumes it is
   the only gutter. Embedded in Elementor/a theme it is the second one, so the
   phone lost 30px of card width to padding nobody asked for — this is the same
   stacked-gutter defect as v7.6.2, in a different element.

   The shell already owns the outer gutter, so inside a shell the container
   only needs enough inset to keep cards off a hard edge when the host supplies
   none. 6px measured: card L25->L16, art 295->314px.

   Deliberately NOT zero: on a host with no padding of its own, zero would put
   card borders flush against the screen edge. */
@media (max-width: 767px) {
  .tap-app-shell .tap-container {
    padding-inline: 6px;
  }
}

/* ── Card image fills the card (v7.7.6) ───────────────────────────────────
   The card carried its inset on the CARD, so the image sat inside that inset
   with a visible border of card background on all sides. Measured at 375px:
   card 325px wide, image only 295px.

   The inset moves to the text body. The image then spans the full card and,
   because .tap-fcard already has overflow:hidden and a radius, it clips to the
   rounded corners instead of needing its own.

   No calc() negative margin is used: `calc(-1 * var(--x))` is dropped as
   invalid (v7.6.2 measured this), and pulling the image out with a negative
   margin would also fight the card's overflow. Removing the padding is the
   change that actually holds. */
.tap-root .tap-fcard,
.tap-home-root .tap-fcard {
  /* !important, MEASURED: `.tap-root .tap-fcard{padding:var(--tap-card-pad,14px)}`
     ties on specificity (0,2,0) and wins. Without !important this rule applied
     and changed nothing — art stayed L15 W295. With it: L1 W323 in a 325px
     card. Third place in this codebase where that is true; do not remove it
     without re-measuring. */
  padding-inline: 0 !important;
}

.tap-root .tap-fcard > .tap-fcard-art,
.tap-home-root .tap-fcard > .tap-fcard-art {
  width: 100%;
  display: block;
}

.tap-root .tap-fcard > .tap-fcard-body,
.tap-home-root .tap-fcard > .tap-fcard-body {
  /* The inset the card just gave up — text still needs it, the image does not. */
  padding-inline: var(--tap-card-pad-s, 14px) !important;
}

/* ── Bottom sheet becomes a dialog on laptops (v7.7.6) ────────────────────
   MEASURED at 1440x900 with the package sheet open:
     .tap-sheet-ov   L0    W1440  (backdrop — correct, it should cover)
     .tap-bsheet     L32   W1376  <- the PANEL, 96% of the screen
     .tap-bsheet-hd / -body / CTA  all stretched to 1340px

   A bottom sheet is a phone idiom: it is full-width because a phone IS the
   sheet's width. On a laptop the same rule produced a 1376px-wide panel
   holding one title, one note and one button — the "sheet is covering the
   whole page" report.

   `.tap-cst-sheet` already solved this for the consult flow with
   `max-width:560px`; this brings the booking sheet to the same contract:
   centred dialog above 768px, untouched bottom sheet below it.

   After: panel L440 W560, vertically centred, backdrop still full-screen. */
@media (min-width: 768px) {
  .tap-sheet-ov {
    align-items: center;
    padding: 24px;
  }

  .tap-bsheet {
    max-width: 560px;
    margin-inline: auto;
    /* Bottom sheets round only their top corners because the bottom edge is
       off-screen. A centred dialog has four visible corners. */
    border-radius: 22px;
  }
}

/* The pay bar is position:fixed — docked, not in flow — so it keeps its own
   width and aligns its CONTENT to the same measure instead. */
.tap-root .tap-sticky > .tap-sticky-inner {
  max-inline-size: var(--tap-content-max, 1160px);
  margin-inline: auto;
}

/* ── Floating-launcher collision (v7.7.3) ──────────────────────────────────
   The pay bar docks at z-index 500; the WhatsApp launcher (Join.chat) sits at
   z-index 9000 and is bottom-right. Measured: the two rects intersect at every
   width, so a chat button covered the primary checkout CTA. Dock the bar above
   the launcher and lift the launcher clear of the bar's height. */
.tap-root .tap-sticky {
  z-index: 9100;
}

@supports selector(:has(*)) {
  body:has(.tap-root .tap-sticky) .joinchat {
    bottom: calc(var(--tap-sticky-h, 72px) + 16px);
  }
}
/* ===== END assets/css/tap-shell.css ===== */
