:root{
    /* the footer trademark and copyright marks: the logo’s own ink on a light
       ground, the brand crimson on a dark one */
    --mark:#230a4d;
    /* A flat, temperature-free ground.

       The old #eef1f8 was a cool pale blue chosen to sit under the daylight
       gradient that has now gone. Neutral rather than warm on purpose: the
       panels are already cream, and a warm ground under warm panels leaves
       nothing to tell them apart except the border. With the ground taking no
       side, the panels carry all the warmth on the page and read as lit,
       which is the job the gradient used to do badly. */
    --bg:#f2f2f0; --surface:#fffdf9; --surface-2:#faf6ee; --surface-3:#f3ecdd;
    --ink:#230a4d; --ink-body:#3a3157; --muted:#6f6789;
    --brand:#d72e47; --brand-deep:#b0203a; --gold:#b4832a;
    --learn-ink:#96702a; --learn-line:rgba(180,131,42,.38);
     --brand-soft:rgba(215,46,71,.10);--sel:#2e1063;--sel-deep:#230a4d;--on-sel:#fff;--sel-soft:rgba(35,10,77,.10); --gold-soft:rgba(180,131,42,.14); --ok:#1f8a5b;
    /* Mixed from the ground above, not from the old blue — a translucent bar
       tinted a colour the page no longer contains reads as a smear. */
    --bg-glass:rgba(242,242,240,.72);
    --fill-strong:#230a4d; --on-strong:#fff;
    --line:rgba(35,10,77,.12); --line-strong:rgba(35,10,77,.22); --void:#a49fb5;
    --sh-1:0 1px 2px rgba(35,10,77,.05);
    --sh-2:0 3px 10px rgba(35,10,77,.05),0 14px 34px rgba(35,10,77,.06);
    --sh-3:0 10px 34px rgba(35,10,77,.10),0 24px 60px rgba(35,10,77,.08);
    --r-sm:9px; --r:14px; --r-lg:20px;
    --font-display:'Poppins','Tiro Devanagari Hindi',sans-serif;
    --font-body:'Inter','Tiro Devanagari Hindi',system-ui,sans-serif;
    --font-mono:'JetBrains Mono','Tiro Devanagari Hindi',ui-monospace,monospace;
  }
  html[data-theme="dark"]{
    --mark:#f0546c;
    --sel:#d13048;--sel-deep:#a11529;--on-sel:#fff;--sel-soft:rgba(240,84,108,.16);
    /* Navy. The previous ground was #1b1633 — an indigo that leaned purple and
       fought the crimson brand rather than sitting under it. This is blue-led:
       every surface steps up in lightness on the same hue, which is what makes
       elevation legible, and the crimson and gold read cleanly against it.
       Contrast measured on all pairs: the tightest is muted text on the
       deepest surface at 4.85:1, still clear of the 4.5 body text asks. */
    --bg:#0c1626; --surface:#132139; --surface-2:#1a2b47; --surface-3:#223458;
    --ink:#eef3fb; --ink-body:#c6d2e6; --muted:#94a3be;
    --brand:#f0546c; --brand-deep:#e8455f; --gold:#e0ad4e;
    --learn-ink:#e6b862; --learn-line:rgba(224,173,78,.34);
     --brand-soft:rgba(240,84,108,.15); --gold-soft:rgba(224,173,78,.14); --ok:#3fb984;
    --bg-glass:rgba(12,22,38,.72);
    --fill-strong:#eef3fb; --on-strong:#0c1626;
    --line:rgba(198,210,230,.13); --line-strong:rgba(198,210,230,.24); --void:#6c7c99;
    --sh-1:0 1px 2px rgba(0,0,0,.42);
    --sh-2:0 3px 10px rgba(0,0,0,.34),0 14px 34px rgba(0,0,0,.40);
    --sh-3:0 10px 34px rgba(0,0,0,.48),0 24px 60px rgba(0,0,0,.48);
  }
  /* The dark override that used to sit here is gone: body now takes var(--bg)
     flat in both themes, so restating it for dark said nothing. */
  *{box-sizing:border-box}
  /* The same guard as on body. Body's overflow only reaches the viewport by
     propagation, and only while html's own overflow is visible — stating it
     here does not depend on that rule holding. `clip` rather than `hidden`
     because hidden would make this a scroll container and break the sticky
     mode tabs. */
  html{-webkit-text-size-adjust:100%;overflow-x:clip}
  body{
    margin:0;
    /* One element wider than the phone dragged the WHOLE document sideways —
       appbar, tabs and every panel shifted with it, so the layout looked
       broken far away from whatever was actually too wide. `clip` stops that
       without creating a scroll container, which matters here: `hidden` would
       make body a scroll container and break the sticky mode tabs. Browsers
       without `clip` simply keep today's behaviour rather than losing the
       tabs. This is a backstop, not a licence — anything genuinely too wide is
       still fixed at source, because clipped content is unreachable content. */
    overflow-x:clip;
    /* One flat colour, both themes.

       Light mode used to carry a three-layer sky — a warm sun top-right, cool
       air top-left, over a vertical fade. It was pretty on an empty page and a
       problem on a full one: this app is mostly panels, and a ground that
       changes hue underneath them meant the same cream card read warm at the
       top of the screen and cool at the bottom, with the panel edges appearing
       to shift colour as you scrolled. Dark mode had already been flattened
       for the same reason; this brings light into line rather than leaving the
       two themes on different principles. */
    background:var(--bg);
    color:var(--ink-body); font-family:var(--font-body); line-height:1.55; min-height:100vh; font-size:15.5px;
    -webkit-font-smoothing:antialiased;
    overflow-anchor:none;
  }
  .wrap{max-width:1240px;margin:0 auto;padding:28px 28px 80px}

  .topbar{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:24px}
  /* ============================================================================
     SECTION SWITCHER — "calibration scale"
     Rationale: nine bordered boxes in a row always reads as generic, and boxes
     force equal widths, which is what makes "KP" look empty beside "Bhrigu
     Nandi Nadi". So: no boxes. Labels sit on a shared hairline baseline and
     size to their own content. The active section is marked by a single
     2px brand rule sitting ON that baseline — one precise mark, not a fill.
     ========================================================================= */

  .modes{
    display:flex; flex-wrap:nowrap; justify-content:flex-start; align-items:stretch;
    gap:0; margin:18px calc(-1 * clamp(10px,1.35vw,22px)) 0; padding:0;
    /* it rides with the sticky app-bar, so it must never introduce its own
       scroll frame vertically — only sideways */
    overflow-y:hidden; overscroll-behavior-x:contain; flex-shrink:0;
    width:calc(100% + 2 * clamp(10px,1.35vw,22px));
    background:transparent; border:0; border-radius:0; box-shadow:none;
    /* the shared baseline every label sits on */
    border-bottom:1px solid var(--line);
    overflow-x:auto; scrollbar-width:none; -ms-overflow-style:none;
    scroll-snap-type:x proximity;
  }
  .modes::-webkit-scrollbar{display:none}

  .mode-btn{
    appearance:none; cursor:pointer; position:relative;
    flex:1 1 auto;                     /* share the row; min-width keeps labels intact */
    min-width:max-content;
    scroll-snap-align:start;
    display:inline-flex; align-items:center; gap:7px;
    padding:0 clamp(10px,1.35vw,22px); height:42px; margin:0;
    background:transparent; border:0; border-radius:0;
    color:var(--muted);
    font-family:var(--font-body); font-size:12.5px; font-weight:600;
    letter-spacing:.005em; line-height:1; white-space:nowrap;
    transition:color .18s ease, background .18s ease;
  }


  /* the indicator: a rule that grows from the centre, sitting on the baseline */
  .mode-btn::after{
    content:""; position:absolute; left:50%; right:50%; bottom:-1px; height:3px; z-index:1;
    background:var(--brand); border-radius:2px 2px 0 0;
    transition:left .22s cubic-bezier(.32,.72,.3,1), right .22s cubic-bezier(.32,.72,.3,1),
               background .18s ease;
  }

  .mode-ico{
    display:flex; align-items:center; justify-content:center;
    width:15px; height:15px; flex:0 0 auto;
    opacity:.55; transition:opacity .18s ease, color .18s ease;
  }
  .mode-ico svg{width:100%; height:100%; display:block}
  .mode-lbl{display:inline-block; line-height:1; white-space:nowrap}

  /* ---- states ---------------------------------------------------------- */
  .mode-btn:hover{color:var(--ink-body)}
  .mode-btn:hover .mode-ico{opacity:.85}
  .mode-btn:hover::after{left:38%; right:38%; background:var(--line-strong)}

  .mode-btn[aria-selected="true"]{
    /* Same reasoning as the subtabs: a heavier weight makes the label wider,
       so selecting a mode nudged every mode after it along. The underline,
       the wash and the colour carry the emphasis without touching metrics. */
    color:var(--ink);
    background:linear-gradient(180deg,transparent 0%,var(--sel-soft) 100%);
  }
  .mode-btn[aria-selected="true"] .mode-ico{opacity:1; color:var(--sel)}
  .mode-btn[aria-selected="true"]::after{
    left:0; right:0; height:3px; background:var(--sel);
    box-shadow:0 -1px 10px -1px var(--sel);
  }

  .mode-btn:focus-visible{outline:none; color:var(--ink)}
  .mode-btn:focus-visible::after{left:12%; right:12%; background:var(--gold)}

  /* dark theme: the indicator carries more weight against a dark ground */
  html[data-theme="dark"] .mode-btn[aria-selected="true"]::after{
    box-shadow:0 -1px 14px 0 rgba(240,84,108,.55);
  }
  html[data-theme="dark"] .mode-ico{opacity:.5}
  html[data-theme="dark"] .mode-btn[aria-selected="true"] .mode-ico{opacity:1}

  /* Devanagari sets smaller at the same px and needs looser tracking */
  html[lang="hi"] .mode-btn{font-size:13.5px; letter-spacing:0}

  @media(prefers-reduced-motion:reduce){
    .mode-btn,.mode-btn::after,.mode-ico{transition:none}
  }

  /* ---- ≤600px ---------------------------------------------------------- */
  @media(max-width:600px){
    .modes{
      margin:12px -13px 0; padding:0 13px;
      -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 14px,#000 calc(100% - 14px),transparent 100%);
      mask-image:linear-gradient(90deg,transparent 0,#000 14px,#000 calc(100% - 14px),transparent 100%);
    }
    .mode-btn{flex:0 0 auto; min-width:0; height:42px; padding:0 13px; font-size:12.5px}

    .mode-ico{width:16px; height:16px}
  }

  /* ---- ≤380px: labels only; the icons stop earning their space ---------- */
  @media(max-width:380px){
    /* Under 380px there is not enough room for a label and its value on one
       line; stacking beats compressing both until neither reads. */
    .gc-row{flex-direction:column;align-items:flex-start;gap:1px}
    .gc-v{text-align:left}
    .gc-name{font-size:15.5px}
    .dsys button{font-size:11px;padding:0 10px}

    .mode-btn{height:40px; padding:0 11px; font-size:12px; gap:0}
    .mode-ico{display:none}
  }

  .appbar{position:sticky;top:0;z-index:60;display:flex;align-items:center;gap:10px 16px;flex-wrap:wrap;
    margin:-26px -22px 22px;padding:14px 22px 12px;border-bottom:1px solid transparent;
    transition:background .22s ease,box-shadow .22s ease,border-color .22s ease;
    /* Held on its own compositor layer. Without this the backdrop-filter added
       by .stuck is re-sampled every frame and the bar visibly shudders as the
       page moves under it. */
    will-change:transform;transform:translateZ(0);backface-visibility:hidden}
  .appbar .modes{flex:1 1 100%;order:3}
  .appbar .brand{flex:0 1 auto;order:1;min-width:0}
  .appbar .tb-right{flex:0 0 auto;order:2;margin-left:auto;display:flex;align-items:center;gap:12px;flex-wrap:nowrap}
  
  .appbar.stuck{background:var(--bg-glass);-webkit-backdrop-filter:saturate(1.5) blur(13px);backdrop-filter:saturate(1.5) blur(13px);box-shadow:0 6px 22px rgba(35,10,77,.12);border-bottom-color:var(--line)}
  .brand{display:flex;align-items:center;gap:14px}
  .brand a{display:flex;align-items:center;line-height:0;min-width:0}
  .brand-logo{height:auto;width:auto;max-height:34px;max-width:100%;display:block}
  /* A stray selector sat between these with no declaration block, so the rule
     below it parsed as "html[data-theme=dark] html[data-theme=dark] .brand-logo.drk"
     — an <html> inside an <html>, which can never match. The dark logo was
     therefore never shown; only the light one being hidden made it look as
     though the swap worked. */
  html[data-theme="dark"] .brand-logo.lite{display:none}
  html[data-theme="dark"] .brand-logo.drk{display:block}
  html:not([data-theme="dark"]) .brand-logo.drk{display:none}
  /* Learn and the language toggle sit side by side in the toolbar and are the
     same kind of thing — a pill you press. They were drawn to different
     heights (40 vs content-sized ~34), which read as a misalignment. Both now
     take one number, so a change to either cannot desynchronise them. */
  .lang{display:flex;flex:0 0 auto;height:var(--ctl-h,34px);border:1px solid var(--line-strong);border-radius:999px;overflow:hidden;background:var(--surface);box-shadow:var(--sh-1)}
  .lang button{appearance:none;border:0;background:transparent;color:var(--muted);font-family:var(--font-body);font-weight:600;font-size:13px;padding:0 16px;height:100%;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s}
  .lang button[aria-pressed="true"]{background:var(--sel);color:var(--on-sel)}
  .tb-right{display:flex;align-items:center;gap:12px}

  /* ---- the toolbar, and what happens to it on a phone ------------------

     Seven controls used to sit in this row and the responsive rules dealt
     with it by shrinking: labels dropped at 760px, icons hidden, buttons
     squeezed to 30px squares by 345px. Seven 30px targets in a row is not a
     toolbar anyone can hit.

     Now only the two things people reach for constantly stay out — the
     language pill and the light/dark switch — and the rest fold into a menu.

     .tb-more is display:contents above the breakpoint, so on a laptop the
     controls are laid out by .tb-right exactly as before and every existing
     `.tb-right .learn-btn` rule still matches. Nothing was cloned into a
     second copy, so the ids and their handlers are untouched. */
  .tb-more{display:contents}
  .tb-burger{display:none}

  /* DOM order changed when the wrapper went in, so the row order is now
     stated rather than inherited from the source. */
  .tb-right .learn-btn{order:1}
  .tb-right .consult-btn{order:2}
  .tb-right .community-btn{order:3}
  .tb-right .lang{order:3}
  .tb-right #ioBtn{order:4}
  .tb-right #themeBtn{order:5}
  .tb-right #acctBtn{order:6}
  .tb-right #logoutBtn{order:7}
  .tb-right .tb-burger{order:8}
  .tb-right .acct-mob{display:none}

  @media(max-width:700px){
    .appbar .tb-right{position:relative}
    /* My account, in the bar, just before the language switch. */
    .tb-right .acct-mob{display:grid;place-items:center;order:2}
    .tb-more #acctBtn{display:none !important}
    /* Matches the pill shape and shadow of the controls beside it rather than
       inventing a squared-off button of its own. */
    .tb-burger{
      display:grid;place-items:center;flex:0 0 auto;
      width:var(--ctl-h,34px);height:var(--ctl-h,34px);
      border:1px solid var(--line-strong);border-radius:999px;
      background:var(--surface);color:var(--ink-body);cursor:pointer;
      box-shadow:var(--sh-1);transition:.15s;
    }
    .tb-burger svg{width:17px;height:17px}
    .tb-burger:hover{border-color:var(--brand);color:var(--brand)}
    .tb-burger:active{transform:scale(.94)}
    .tb-burger[aria-expanded="true"]{
      border-color:var(--brand);color:var(--brand);background:var(--brand-soft);
    }

    /* The panel. Positioned off .tb-right, which is why that gets relative.
       Surface, hairline and shadow all come from the same tokens the cards in
       the engine use, so it reads as part of the product rather than as an
       operating-system menu that happens to be on top of it. */
    .tb-more{
      display:block;position:absolute;top:calc(100% + 10px);right:0;
      min-width:236px;padding:7px;border-radius:var(--r);
      background:var(--surface);border:1px solid var(--line);
      box-shadow:var(--sh-3);
      z-index:80;opacity:0;visibility:hidden;transform:translateY(-8px) scale(.98);
      transform-origin:top right;
      transition:opacity .18s ease,transform .18s cubic-bezier(.2,.8,.3,1),visibility .18s;
    }
    .tb-more.open{opacity:1;visibility:visible;transform:none}

    /* ---- destinations ----

       Learn and Consult keep their gold and crimson in here. They were being
       flattened to plain grey text rows, which is what made the menu look
       like a browser context menu rather than part of the engine: the two
       things in it worth pressing were the two that had been stripped of
       every mark of being worth pressing.

       They are the same pills as on a wide toolbar, laid out full width. */
    .tb-more .learn-btn{
      display:flex !important;align-items:center;justify-content:flex-start !important;
      width:100% !important;min-width:0 !important;max-width:none !important;
      height:44px !important;min-height:44px !important;
      padding:0 14px !important;gap:11px !important;
      border:1px solid var(--gold) !important;border-radius:11px !important;
      background:var(--gold-soft) !important;color:var(--gold) !important;
      font-size:13.5px !important;font-weight:600;text-align:left;
      box-shadow:none;transition:.16s;
    }
    .tb-more .learn-btn+.learn-btn{margin-top:6px}
    .tb-more .learn-btn:hover{background:var(--gold) !important;color:var(--on-strong) !important}
    .tb-more .consult-btn{
      border-color:var(--brand) !important;
      background:var(--brand-soft) !important;color:var(--brand) !important;
    }
    .tb-more .consult-btn:hover{background:var(--brand) !important;color:#fff !important}
    .tb-more .community-btn{
      border-color:transparent !important;
      background:var(--brand) !important;color:#fff !important;
    }
    .tb-more .community-btn:hover{background:var(--brand-deep) !important;color:#fff !important}
    .tb-more .learn-btn .ic{display:block !important;width:18px !important;height:18px !important;flex:0 0 auto}
    .tb-more .learn-btn span{display:inline !important;font-size:13.5px !important}

    /* ---- utilities ----

       Quiet by comparison, and on purpose: hide inputs, light/dark, account
       and log out are switches, not places to go. A hairline separates the
       two kinds so the eye does not read six equal options. */
    .tb-more .theme-toggle{
      display:flex !important;align-items:center;justify-content:flex-start !important;
      width:100% !important;min-width:0 !important;max-width:none !important;
      height:42px !important;min-height:42px !important;
      padding:0 14px !important;gap:11px !important;
      border:0 !important;border-radius:10px;background:none !important;
      box-shadow:none !important;
      color:var(--ink-body);font-size:13.5px;font-weight:500;text-align:left;
      transition:background .14s,color .14s;
    }
    .tb-more .theme-toggle:hover{background:var(--surface-2) !important;color:var(--ink) !important}
    .tb-more .theme-toggle:active{transform:none}
    .tb-more .theme-toggle .ic{display:block !important;width:18px !important;height:18px !important;flex:0 0 auto;opacity:.8}
    .tb-more .theme-toggle::after{content:attr(title);white-space:nowrap}
    .tb-more #logoutBtn{color:var(--brand)}
    .tb-more #logoutBtn:hover{background:var(--brand-soft) !important;color:var(--brand) !important}

    .tb-more #ioBtn{position:relative;margin-top:11px}
    .tb-more #ioBtn::before{
      content:"";position:absolute;left:8px;right:8px;top:-6px;
      height:1px;background:var(--line);
    }
    /* #ioBtn keeps two icons and swaps them by state; only ever show one. */
    .tb-more #ioBtn .ic-expand{display:none !important}
    .tb-more #ioBtn[aria-pressed="true"] .ic-expand{display:block !important}
    .tb-more #ioBtn[aria-pressed="true"] .ic-collapse{display:none !important}
  }
  .theme-toggle{appearance:none;width:40px;height:40px;flex:0 0 auto;border:1px solid var(--line-strong);border-radius:999px;background:var(--surface);color:var(--ink-body);cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--sh-1);transition:.15s}
  .theme-toggle:hover{border-color:var(--brand);color:var(--brand)}
  .theme-toggle:active{transform:scale(.94)}
  .theme-toggle .ic{width:19px;height:19px}
  .theme-toggle .ic-sun{display:none}
  html[data-theme="dark"] .theme-toggle .ic-moon{display:none}
  html[data-theme="dark"] .theme-toggle .ic-sun{display:block}

  /* Learn — the notes live outside the engine, so this is a link and not a
     mode. Gold rather than the crimson accent, and the only labelled control
     in the right-hand cluster: it should read as an invitation sitting beside
     the utilities, not as another switch among them. */
  .learn-btn{
    display:inline-flex;align-items:center;justify-content:center;gap:8px;flex:0 0 auto;
    height:var(--ctl-h,34px);padding:0 16px;
    border:1px solid var(--gold);border-radius:999px;
    background:var(--gold-soft);color:var(--gold);
    font-family:var(--font-body);font-size:13px;font-weight:600;
    text-decoration:none;white-space:nowrap;
    box-shadow:var(--sh-1);transition:.15s;
  }
  .learn-btn .ic{width:18px;height:18px;flex:0 0 auto}
  .learn-btn .lb-star{opacity:.75;transition:opacity .2s,transform .3s;transform-origin:12px 4.7px}
  .learn-btn:hover{background:var(--gold);color:var(--on-strong);border-color:var(--gold);
    transform:translateY(-1px);box-shadow:0 4px 14px -4px var(--gold)}
  .learn-btn:hover .lb-star{opacity:1;transform:rotate(90deg)}
  .learn-btn:active{transform:translateY(0) scale(.97)}
  .learn-btn:focus-visible{outline:2px solid var(--gold);outline-offset:3px}

  /* ---- Community, told apart from Learn ----

     These two sat side by side as identical gold outlines, which made the pair
     read as one control printed twice: same shape, same weight, same colour,
     and only the word distinguishing them. They are not the same kind of
     thing. Learn is a library that does not change. Community is people
     talking, right now.

     So Community takes the brand colour and a filled treatment, because a
     place where something is happening should look live, and Learn keeps the
     quieter outline. That also matches the rest of the app, where crimson is
     what you press and gold is what you read. */
  .community-btn{
    border-color:transparent;
    background:linear-gradient(135deg,var(--brand),var(--brand-deep));
    color:#fff;
    box-shadow:0 2px 10px -3px var(--brand);
  }
  .community-btn:hover{
    background:linear-gradient(135deg,var(--brand-deep),var(--brand));
    color:#fff;border-color:transparent;
    transform:translateY(-1px);box-shadow:0 6px 18px -5px var(--brand);
  }
  .community-btn:active{transform:translateY(0) scale(.97)}
  .community-btn:focus-visible{outline:2px solid var(--brand);outline-offset:3px}

  /* The speech bubble leans in on hover, the way a head turns toward a
     conversation. Small enough to be felt rather than watched. */
  .community-btn .ic{transition:transform .25s cubic-bezier(.34,1.56,.64,1)}
  .community-btn:hover .ic{transform:translateX(-1px) rotate(-8deg)}

  /* A live board earns a dot. Shown only when the community has something
     waiting, so it means something when it is there. */
  .community-btn .cb-live{
    width:6px;height:6px;border-radius:50%;background:#fff;flex:0 0 auto;
    box-shadow:0 0 0 0 rgba(255,255,255,.6);animation:cbPulse 2.4s ease-out infinite}
  @keyframes cbPulse{
    0%{box-shadow:0 0 0 0 rgba(255,255,255,.55)}
    70%{box-shadow:0 0 0 6px rgba(255,255,255,0)}
    100%{box-shadow:0 0 0 0 rgba(255,255,255,0)}}

  @media(prefers-reduced-motion:reduce){
    .learn-btn:hover,.community-btn:hover{transform:none}
    .community-btn:hover .ic{transform:none}
    .community-btn .cb-live{animation:none}
  }
  html[lang="hi"] .learn-btn{font-size:14px}

  /* Consult — the same shape as Learn because they are the same kind of thing:
     a way out of the engine into something the engine cannot do by itself.
     Crimson rather than gold, so the pair read as two destinations and not as
     one control with a duplicate. */
  .consult-btn{
    border-color:var(--brand,#e04a63);
    background:var(--brand-soft,rgba(224,74,99,.10));
    color:var(--brand,#e04a63);
  }
  .consult-btn:hover{
    background:var(--brand,#e04a63);color:#fff;border-color:var(--brand,#e04a63);
  }
  /* A third colour, for the same reason Consult is not gold: three controls
     in one colour read as one control repeated. */
  .community-btn{
    border-color:var(--sel,#2e1063);
    background:var(--sel-soft,rgba(35,10,77,.10));
    color:var(--sel,#2e1063);
  }
  .community-btn:hover{
    background:var(--sel,#2e1063);color:var(--on-sel,#fff);border-color:var(--sel,#2e1063);
  }
  .community-btn:focus-visible{outline:2px solid var(--sel,#2e1063);outline-offset:3px}
  /* No dark-theme repaint. It used to turn gold here, which is exactly what
     made the two buttons indistinguishable on the dark app. */
  .consult-btn .cb-dot{transition:transform .25s}
  .consult-btn:hover .cb-dot{transform:scale(1.22);transform-origin:12px 15px}
  .consult-btn:focus-visible{outline:2px solid var(--brand,#e04a63);outline-offset:3px}

  .grid.io-hidden{grid-template-columns:minmax(0,1fr)}
  .grid.io-hidden #input-col{display:none}
  #ioBtn .ic-expand{display:none}
  #ioBtn.on .ic-collapse{display:none}
  #ioBtn.on .ic-expand{display:block}

  header{position:relative;border:0;padding:6px 0 26px;margin-bottom:26px}
  header::after{content:"";position:absolute;left:0;bottom:0;height:3px;width:100%;border-radius:3px;
    background:linear-gradient(90deg,var(--brand) 0,var(--brand) 20%,var(--gold) 20%,var(--gold) 30%,var(--line) 30%,var(--line) 100%)}
  .eyebrow{font-family:var(--font-mono);font-size:12.7px;letter-spacing:.3em;text-transform:uppercase;color:var(--brand);margin:0 0 10px;font-weight:700}
  .eyebrow:empty{display:none}
  .wordmark{font-family:var(--font-display);font-weight:700;font-size:clamp(30px,6vw,54px);line-height:.96;margin:0;letter-spacing:-.015em;color:var(--ink)}
  .wordmark .dot{color:var(--brand)}
  .sub{color:var(--ink-body);margin:14px 0 0;max-width:62ch;font-size:15px;line-height:1.6}

  /* ===== Section nav: always-visible card grid, no hidden/scrolled-off items ===== */
  
  
  
  
  
  
  
  
  
  
  @media(min-width:601px) and (max-width:900px){
  }

  .grid{display:grid;grid-template-columns:minmax(0,340px) minmax(0,1fr);gap:38px;align-items:stretch;margin-top:22px}
  #input-col{align-self:start}
  #input-col,#input-col>.panel,.output-wrapper{min-width:0}
  @media(max-width:860px){.grid{grid-template-columns:minmax(0,1fr)}}

  .panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:22px 24px;box-shadow:var(--sh-2);transition:box-shadow .18s ease,border-color .18s ease}
  .panel:hover{box-shadow:var(--sh-3);border-color:var(--line-strong)}
  .panel h2{font-family:var(--font-display);font-size:16px;letter-spacing:-.005em;text-transform:none;color:var(--ink);margin:0 0 22px;font-weight:600;padding-left:0;position:relative}
  .panel h2::before{content:none}
  .panel:not(.hidden) + .panel:not(.hidden){margin-top:28px}
  /* ===== sub-navigation: clear segmented control instead of a cramped text row ===== */
  .subtabs{
    /* 12px padding either side plus an 8px gap gives the same 32px between
       one label and the next as the old 14+4+14 did — but the selected pill
       now has 8px of clear air around it instead of 4, so it stops crowding
       the labels beside it. Only the pill has a visible edge, so that gap is
       the one the eye actually measures. */
    display:flex; gap:8px; flex-wrap:nowrap; overflow-x:auto;
    scroll-snap-type:x proximity;
    margin:0 0 18px; justify-content:flex-start;
    /* A pill inside a pill needs the ends kept clear. The container is 42px
       tall, so its corner radius is 21; the buttons are 32px, radius 16. At
       the button's top edge the container's inner edge has already curved in
       to about 7.4px, so 8px of padding left under a pixel of clearance and
       the first tab bled through the corner. 14px puts it comfortably on the
       straight part of the edge. */
    padding:5px 13px;
    border:1px solid var(--line); border-radius:999px;
    background:var(--surface-3,var(--surface-2));
    box-shadow:inset 0 1px 2px rgba(35,10,77,.06);
    position:sticky; top:var(--appbar-h,64px); z-index:45;
    /* sticky needs a non-clipping ancestor chain */
    isolation:isolate;
    scrollbar-width:none; -ms-overflow-style:none;
    transition:box-shadow .2s ease, background .2s ease;
  }
  .subtabs::-webkit-scrollbar{display:none}

  /* ===== horizontal tab bars on a laptop =====

     These bars scroll, but every one of them hid its scrollbar, which is the
     right call on a phone — you swipe, and a bar permanently showing a
     scrollbar looks broken. On a desktop it leaves nothing at all: no
     scrollbar, no arrows, and a tab sliced in half at the right edge that
     looks like a rendering fault rather than an invitation to scroll. There
     is no swipe to discover, and shift+wheel is not something most people
     know.

     So on pointer devices only, the bars get a real scrollbar, a fade at
     whichever end has more content behind it, and buttons to step along.
     Touch is left exactly as it was. */
  @media (hover:hover) and (pointer:fine){
    .subtabs, .nu-tabs, .modes, .acct-tabs{
      scrollbar-width:thin;
      scrollbar-color:var(--line-strong) transparent;
      -ms-overflow-style:auto;
    }
    .subtabs::-webkit-scrollbar,
    .nu-tabs::-webkit-scrollbar,
    .modes::-webkit-scrollbar,
    .acct-tabs::-webkit-scrollbar{display:block;height:7px}
    .subtabs::-webkit-scrollbar-track,
    .nu-tabs::-webkit-scrollbar-track,
    .modes::-webkit-scrollbar-track,
    .acct-tabs::-webkit-scrollbar-track{background:transparent}
    .subtabs::-webkit-scrollbar-thumb,
    .nu-tabs::-webkit-scrollbar-thumb,
    .modes::-webkit-scrollbar-thumb,
    .acct-tabs::-webkit-scrollbar-thumb{
      background:var(--line-strong);border-radius:99px;
      border:2px solid transparent;background-clip:content-box;
    }
    .subtabs:hover::-webkit-scrollbar-thumb,
    .nu-tabs:hover::-webkit-scrollbar-thumb,
    .modes:hover::-webkit-scrollbar-thumb,
    .acct-tabs:hover::-webkit-scrollbar-thumb{background:var(--muted);background-clip:content-box}
    /* Room for the scrollbar inside the pill, so it does not sit on top of
       the tabs or crowd the rounded ends. */
    .subtabs{padding-bottom:10px}
    .nu-tabs{padding-bottom:14px}

    /* The fade says "there is more this way". Applied to the scroller's own
       box, and only on the side that actually has content off-screen — a
       permanent fade on both ends would dim the first and last tab even when
       the whole bar fits. */
    .tabscroll-more-right{
      -webkit-mask-image:linear-gradient(to right,#000 calc(100% - 34px),transparent 100%);
              mask-image:linear-gradient(to right,#000 calc(100% - 34px),transparent 100%);
    }
    .tabscroll-more-left{
      -webkit-mask-image:linear-gradient(to left,#000 calc(100% - 34px),transparent 100%);
              mask-image:linear-gradient(to left,#000 calc(100% - 34px),transparent 100%);
    }
    .tabscroll-more-both{
      -webkit-mask-image:linear-gradient(to right,transparent 0,#000 34px,#000 calc(100% - 34px),transparent 100%);
              mask-image:linear-gradient(to right,transparent 0,#000 34px,#000 calc(100% - 34px),transparent 100%);
    }

    /* Step buttons, sitting just outside the bar's ends. Hidden unless there
       is somewhere to go in that direction. */
    /* Fixed, not absolute. These bars are position:sticky, and a sticky
       element only sticks while its containing block is on screen — so
       wrapping one in a short relative div to hang buttons off would stop it
       sticking at all. Positioning against the viewport instead leaves the
       bars untouched. */
    .tabscroll-btn{
      position:fixed;z-index:46;
      width:28px;height:28px;border-radius:50%;cursor:pointer;
      display:flex;align-items:center;justify-content:center;
      border:1px solid var(--line-strong);background:var(--surface);
      color:var(--ink);font:600 14px/1 var(--font-body);
      box-shadow:0 2px 8px -2px rgba(20,10,40,.45);
      opacity:0;pointer-events:none;transition:opacity .15s ease,background .15s ease;
    }
    .tabscroll-btn.on{opacity:1;pointer-events:auto}
    .tabscroll-btn:hover{background:var(--surface-3)}
    .tabscroll-btn:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
    .tabscroll-wrap{position:relative}
  }
  /* The container is a full pill, so its corner curves inward and anything
     sitting in that curve is clipped by it. Rather than tune the padding to
     the millimetre, the end tabs are given their own margin and the scroll
     snapping is told to honour it — so the first tab cannot be brought under
     the corner by any width, zoom level or scroll position. */
  .subtabs{scroll-padding-inline:13px}
  .subtabs button:first-child{margin-left:2px}
  .subtabs button:last-child{margin-right:2px}
  .nu-tabs.stuck{box-shadow:0 8px 20px -12px rgba(20,10,40,.45)}
  .subtabs.stuck{background:var(--bg-glass,var(--surface-2));-webkit-backdrop-filter:saturate(1.5) blur(12px);backdrop-filter:saturate(1.5) blur(12px);box-shadow:0 8px 20px -12px rgba(20,10,40,.45)}
  .subtabs button{
    appearance:none; border:0; background:transparent; color:var(--muted);
    font-family:var(--font-body); font-size:12.5px; font-weight:600;
    letter-spacing:.005em; text-transform:none;
    display:inline-flex; align-items:center; justify-content:center;
    height:32px; padding:0 12px; cursor:pointer; border-radius:999px;
    white-space:nowrap; flex:0 0 auto; scroll-snap-align:start;
    transition:color .15s ease, background .15s ease, box-shadow .15s ease;
  }
  .subtabs button:hover{color:var(--ink)}
  .subtabs button:hover:not([aria-selected="true"]){color:var(--ink);background:var(--surface);box-shadow:var(--sh-1)}
  .subtabs button[aria-selected="true"]{
    /* Weight and tracking deliberately unchanged from the unselected state.

       This used to jump to 700 and .01em on selection, which makes the label
       physically wider — so choosing a tab widened its button and pushed
       every tab to its right along. The gaps looked unequal because they
       were, and they moved every time you clicked. The pill and the colour
       carry the emphasis; the text metrics stay put. */
    color:var(--on-sel);
    background:linear-gradient(180deg,var(--sel) 0%,var(--sel-deep) 100%);
    box-shadow:
      0 1px 2px color-mix(in srgb,var(--sel-deep) 55%,transparent),
      0 4px 12px -2px color-mix(in srgb,var(--sel) 45%,transparent),
      inset 0 1px 0 rgba(255,255,255,.24);
  }
  .subtabs button[aria-selected="true"]:hover{
    background:linear-gradient(180deg,var(--sel) 0%,var(--sel-deep) 100%);
  }

  label{display:block;font-size:11px;letter-spacing:.07em;color:var(--muted);margin:0 0 6px;text-transform:uppercase;font-weight:600}
  .field{margin-bottom:16px;position:relative}
  input,select{width:100%;min-width:0;background:var(--surface);border:1px solid var(--line-strong);color:var(--ink);font-family:var(--font-body);font-size:14.5px;padding:11px 13px;border-radius:var(--r-sm);font-weight:500;transition:border-color .15s,box-shadow .15s,background .15s}
  /* Chrome reserves room for spin buttons inside a number field, and that is
     what was cutting the last digit off latitude and longitude — 14px of the
     box gone to arrows nobody uses at a step of 0.0001. */
  input[type=number]{-moz-appearance:textfield;appearance:textfield}
  input[type=number]::-webkit-outer-spin-button,
  input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
  input:hover,select:hover{border-color:var(--void)}
  input:focus,select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
  input:focus,select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);background:var(--surface)}
  input[type="number"]{font-family:var(--font-mono)}
  input[type="date"],input[type="time"]{cursor:pointer}
  input[type="date"]::-webkit-calendar-picker-indicator,input[type="time"]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:.75;padding:2px}
  input[type="date"]:hover::-webkit-calendar-picker-indicator,input[type="time"]:hover::-webkit-calendar-picker-indicator{opacity:1}
  html[data-theme="dark"] input[type="date"]::-webkit-calendar-picker-indicator,html[data-theme="dark"] input[type="time"]::-webkit-calendar-picker-indicator{filter:invert(1) brightness(1.4)}
  /* custom time picker */
  .tp-wrap{position:relative}
  .tp-input{cursor:pointer;font-family:var(--font-mono);letter-spacing:.04em}
  .tp-ic{position:absolute;right:11px;top:50%;transform:translateY(-50%);width:19px;height:19px;color:var(--brand);pointer-events:auto;cursor:pointer;opacity:.85}
  .tp-ic svg{width:100%;height:100%;display:block}
  .tp-pop{position:absolute;z-index:70;top:calc(100% + 6px);left:0;width:100%;min-width:220px;background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-lg);box-shadow:var(--sh-3);padding:12px;animation:tpIn .13s ease}
  @keyframes tpIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
  .tp-head{text-align:center;margin-bottom:10px}
  .tp-disp{font-family:var(--font-display);font-size:26px;font-weight:800;color:var(--ink);letter-spacing:.02em}
  .tp-cols{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  .tp-col-lbl{font-family:var(--font-mono);font-size:10.3px;letter-spacing:.12em;text-transform:uppercase;color:var(--brand);font-weight:700;text-align:center;margin-bottom:6px}
  .tp-scroll{height:150px;overflow-y:auto;display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:2px;scrollbar-width:thin;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-2)}
  .tp-cell{appearance:none;border:none;background:transparent;font-family:var(--font-mono);font-size:16.1px;font-weight:600;color:var(--ink-body);padding:8px 0;border-radius:var(--r-sm);cursor:pointer;transition:.1s}
  .tp-cell:hover{background:var(--brand-soft);color:var(--brand-deep)}
  .tp-mer{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:10px}
  .tp-mer button{appearance:none;border:1px solid var(--line);background:transparent;font-family:var(--font-mono);font-size:13px;font-weight:700;letter-spacing:.08em;color:var(--ink-body);padding:9px 0;border-radius:var(--r-sm);cursor:pointer;transition:.15s}
  .tp-mer button:hover{background:var(--brand-soft);color:var(--brand-deep);border-color:var(--brand)}
  .tp-mer button.sel{background:var(--fill-strong);color:var(--on-strong);border-color:transparent}
  .tp-cell.sel{background:var(--fill-strong);color:var(--on-strong)}
  .tp-done{margin-top:10px;width:100%;appearance:none;border:none;background:var(--brand);color:#fff;font-family:var(--font-body);font-size:13px;font-weight:700;padding:10px;border-radius:var(--r);cursor:pointer}
  .tp-done:hover{background:var(--brand-deep)}
  /* custom date picker */
  .dp-wrap{position:relative}
  /* "1976-02-28" in mono needs 91px; the box gave it 87. The .03em tracking
     cost about 4px across ten characters — precisely the shortfall — and the
     38px reserved for the calendar icon was more than the icon uses. Both
     trimmed, so the last digit is no longer clipped. */
  .dp-input{cursor:pointer;font-family:var(--font-mono);letter-spacing:0;padding-right:32px}
  .dp-ic{position:absolute;right:11px;top:50%;transform:translateY(-50%);width:19px;height:19px;color:var(--brand);cursor:pointer;opacity:.85}
  .dp-ic svg{width:100%;height:100%;display:block}
  .dp-pop{position:absolute;z-index:70;top:calc(100% + 6px);left:0;min-width:260px;max-width:300px;background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-lg);box-shadow:var(--sh-3);padding:12px;animation:tpIn .13s ease}
  .dp-head{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-bottom:10px}
  .dp-head2{font-family:var(--font-mono);font-size:13.8px;font-weight:700;color:var(--brand);text-align:center;margin-bottom:10px;letter-spacing:.06em}
  .dp-nav{appearance:none;border:1px solid var(--line-strong);background:var(--surface-2);color:var(--brand);font-size:16px;line-height:1;width:30px;height:30px;border-radius:8px;cursor:pointer;flex:0 0 auto}
  .dp-nav:hover{background:var(--brand);color:#fff;border-color:var(--brand)}
  .dp-title{display:flex;gap:4px}
  .dp-mbtn,.dp-ybtn{appearance:none;border:none;background:transparent;font-family:var(--font-display);font-size:15px;font-weight:700;color:var(--ink);cursor:pointer;padding:6px 8px;border-radius:8px;transition:.1s}
  .dp-mbtn:hover,.dp-ybtn:hover{background:var(--brand-soft);color:var(--brand-deep)}
  .dp-wd{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}
  .dp-wd span{text-align:center;font-family:var(--font-mono);font-size:10.9px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
  .dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
  .dp-cell{appearance:none;border:none;background:transparent;font-family:var(--font-body);font-size:13px;font-weight:600;color:var(--ink-body);aspect-ratio:1/1;border-radius:8px;cursor:pointer;transition:.1s;display:flex;align-items:center;justify-content:center}
  .dp-cell.empty{pointer-events:none}
  .dp-cell:hover{background:var(--brand-soft);color:var(--brand-deep)}
  .dp-cell.today{box-shadow:inset 0 0 0 1.5px var(--brand-soft)}
  .dp-cell.sel{background:var(--fill-strong);color:var(--on-strong)}
  .dp-mgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
  .dp-mcell{appearance:none;border:1px solid var(--line);background:var(--surface-2);font-family:var(--font-body);font-size:13px;font-weight:600;color:var(--ink-body);padding:12px 0;border-radius:8px;cursor:pointer;transition:.1s}
  .dp-mcell:hover{border-color:var(--brand);color:var(--brand)}
  .dp-mcell.sel{background:var(--fill-strong);color:var(--on-strong);border-color:var(--fill-strong)}
  .dp-yscroll{height:200px;overflow-y:auto;display:grid;grid-template-columns:repeat(3,1fr);gap:5px;scrollbar-width:thin}
  .dp-ycell{appearance:none;border:1px solid var(--line);background:var(--surface-2);font-family:var(--font-mono);font-size:14.9px;font-weight:600;color:var(--ink-body);padding:9px 0;border-radius:8px;cursor:pointer;transition:.1s}
  .dp-ycell:hover{border-color:var(--brand);color:var(--brand)}
  .dp-ycell.sel{background:var(--fill-strong);color:var(--on-strong);border-color:var(--fill-strong)}
  input:hover,select:hover{border-color:var(--void)}
  input:focus,select:focus{outline:none;border-color:var(--brand);background:var(--surface);box-shadow:0 0 0 3px var(--brand-soft)}
  .row-2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  .row-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
  .check{display:flex;align-items:center;gap:9px;margin-top:4px}
  .check input{width:auto}
  .check label{margin:0;text-transform:none;font-size:12.5px;color:var(--ink-body);font-weight:500}

  /* city search dropdown */
  .place-wrap{position:relative}
  .place-wrap>input{padding-right:40px}
  .place-clear{position:absolute;top:50%;right:8px;transform:translateY(-50%);width:25px;height:25px;padding:0;border:1px solid var(--line-strong);border-radius:50%;background:var(--surface);color:var(--muted);font-size:16px;line-height:1;display:none;align-items:center;justify-content:center;cursor:pointer;z-index:5}
  .place-clear:hover{background:var(--brand);border-color:var(--brand);color:#fff}
  .place-clear:active{transform:translateY(-50%) scale(.9)}
  .cresults{position:absolute;left:0;right:0;top:100%;z-index:50;background:var(--surface);border:1px solid var(--line-strong);border-top:0;border-radius:0 0 6px 6px;max-height:230px;overflow-y:auto;box-shadow:0 12px 26px rgba(35,10,77,.14)}
  .cresult{padding:10px 12px;cursor:pointer;font-size:14px;border-bottom:1px solid var(--line)}
  .cresult:last-child{border-bottom:0}
  .cresult:hover,.cresult.active{background:var(--surface-2)}
  .cresult small{color:var(--muted);font-size:12px}
  .hint{font-size:11.5px;color:var(--muted);margin-top:5px}

  /* summary chips */
  .chips{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-bottom:8px}
  @media(max-width:460px){.chips{grid-template-columns:1fr}}
  .chip{background:linear-gradient(180deg,var(--surface),var(--surface-2));border:1px solid var(--line);border-radius:var(--r-sm);padding:12px 14px;position:relative;overflow:hidden}
  .chip::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--gold);opacity:.55}
  .chip .k{font-family:var(--font-body);font-size:11.5px;letter-spacing:.02em;text-transform:none;color:var(--muted);font-weight:600}
  .chip .v{font-family:var(--font-display);font-size:18px;color:var(--ink);margin-top:4px;font-weight:600;line-height:1.2}
  .chip .v small{font-family:var(--font-body);font-size:12px;color:var(--brand);font-weight:600}
  .wholine{font-family:var(--font-display);font-size:20px;color:var(--ink);margin:0 0 4px;font-weight:600}
  .whometa{font-size:12.5px;color:var(--muted);margin:0 0 16px}

  /* chart */
  .stage{display:block;text-align:center;padding:16px;background:radial-gradient(circle at 50% 38%,var(--surface-2),var(--surface));border:1px solid var(--line);border-radius:var(--r);margin:4px 0 8px}
  /* Scrollbars inside panels: slim, themed, and only visible when the pointer is
     near. The browser default is a heavy grey bar that fights the cream surfaces. */
  .scroll, .cresults, .kp-tw, .chat-log, #cwPickerList, #acctChartList,
  .acct-modal, .acct-card, .pw-modal, .ga-overlay, #ga-content{
    scrollbar-width:thin; scrollbar-color:var(--line-strong) transparent;
  }
  .scroll::-webkit-scrollbar, .cresults::-webkit-scrollbar, .kp-tw::-webkit-scrollbar,
  .chat-log::-webkit-scrollbar, #cwPickerList::-webkit-scrollbar,
  #acctChartList::-webkit-scrollbar, .acct-modal::-webkit-scrollbar,
  .acct-card::-webkit-scrollbar, .pw-modal::-webkit-scrollbar,
  .ga-overlay::-webkit-scrollbar, #ga-content::-webkit-scrollbar{
    width:9px; height:9px;
  }
  .scroll::-webkit-scrollbar-track, .cresults::-webkit-scrollbar-track,
  .kp-tw::-webkit-scrollbar-track, .chat-log::-webkit-scrollbar-track,
  #cwPickerList::-webkit-scrollbar-track, #acctChartList::-webkit-scrollbar-track,
  .acct-modal::-webkit-scrollbar-track, .acct-card::-webkit-scrollbar-track,
  .pw-modal::-webkit-scrollbar-track, .ga-overlay::-webkit-scrollbar-track,
  #ga-content::-webkit-scrollbar-track{ background:transparent; }
  .scroll::-webkit-scrollbar-thumb, .cresults::-webkit-scrollbar-thumb,
  .kp-tw::-webkit-scrollbar-thumb, .chat-log::-webkit-scrollbar-thumb,
  #cwPickerList::-webkit-scrollbar-thumb, #acctChartList::-webkit-scrollbar-thumb,
  .acct-modal::-webkit-scrollbar-thumb, .acct-card::-webkit-scrollbar-thumb,
  .pw-modal::-webkit-scrollbar-thumb, .ga-overlay::-webkit-scrollbar-thumb,
  #ga-content::-webkit-scrollbar-thumb{
    background:var(--line-strong); border-radius:99px;
    border:2.5px solid transparent; background-clip:content-box;
  }
  .scroll:hover::-webkit-scrollbar-thumb, .cresults:hover::-webkit-scrollbar-thumb,
  .kp-tw:hover::-webkit-scrollbar-thumb, .chat-log:hover::-webkit-scrollbar-thumb{
    background:var(--void); background-clip:content-box;
  }
  .scroll::-webkit-scrollbar-corner, .cresults::-webkit-scrollbar-corner,
  .kp-tw::-webkit-scrollbar-corner{ background:transparent; }
    .bnn-r{display:inline-block;font-size:9.5px;font-weight:700;color:var(--brand);
    border:1px solid var(--brand);border-radius:4px;padding:0 3px;vertical-align:1px;margin-left:3px}
  .bnn-hit td{background:var(--brand-soft)}
  .chart-box{position:relative;width:100%;max-width:400px;aspect-ratio:1/1;margin:0 auto;contain:layout paint}
  .chart-box>svg{position:absolute;inset:0;width:100%;height:100%;display:block}
  svg{max-width:100%;height:auto}
  .chart-frame{fill:var(--surface);stroke:var(--ink);stroke-width:2.4;stroke-linejoin:round;pointer-events:none;filter:drop-shadow(0 2px 6px rgba(35,10,77,.10))}
  .chart-line{stroke:var(--ink);stroke-width:1.15;fill:none;opacity:.42;stroke-linecap:round;pointer-events:none}
  /* The ascendant mark on the fixed-sign charts. Brand colour so it reads as
     a statement about the chart rather than another grid line. */
  .lagna-tick{font-family:var(--font-mono);font-size:10px;font-weight:700;
    fill:var(--brand);letter-spacing:.02em}
  .house-num{fill:var(--muted);font-family:var(--font-mono);font-size:13px;dominant-baseline:middle;text-anchor:middle;font-weight:700;pointer-events:none}
  /* cusp numbers — only drawn for charts whose houses are cuspal (KP/Placidus),
     where the house cannot be counted off the lagna */
  .cusp-num{fill:var(--brand);font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;dominant-baseline:middle;font-weight:700;opacity:.85;pointer-events:none}
  .pl-row{font-family:var(--font-mono);font-size:17px;font-weight:700;dominant-baseline:middle;pointer-events:none}
  .house-region{fill:transparent;stroke:transparent;cursor:pointer;pointer-events:all;transition:fill .12s}
  .house-region:hover{fill:var(--brand-soft)}
  .pl-chip{pointer-events:all;cursor:pointer}
  .pl-row-deg{font-size:15.5px}
  .pl{fill:var(--ink)} .pl-sun{fill:var(--gold)} .pl-lagna{fill:var(--brand)} .pl-up{fill:#2f9e8f} .pl-kara{fill:#7a3ea6}
  .pl-deg{fill:var(--muted);font-size:11px;font-weight:700}
  .pl-retro{fill:var(--brand);font-size:10px;font-weight:700}
  .pl-comb{fill:#c98a1e;font-size:10px;font-weight:700}
  .chart-opts{display:flex;gap:18px;flex-wrap:wrap;margin:2px 0 10px;justify-content:center}
  .opt{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink-body);cursor:pointer;font-weight:500}
  input[type=checkbox]{appearance:none;-webkit-appearance:none;margin:0;padding:0;flex:0 0 auto;width:18px;height:18px;min-width:18px;border:1.5px solid var(--line-strong);border-radius:5px;background:var(--surface-2);cursor:pointer;position:relative;vertical-align:middle;transition:background .12s,border-color .12s}
  input[type=checkbox]:hover{border-color:var(--brand)}
  input[type=checkbox]:checked{background:var(--brand);border-color:var(--brand)}
  input[type=checkbox]:checked::after{content:"";position:absolute;left:5px;top:1px;width:4px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
  input[type=checkbox]:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
  .mk-note{font-size:12px;color:var(--muted);margin:10px 0 0;text-align:center}
  .mk-note b{color:var(--brand)} .mk-note i{color:#c98a1e;font-style:normal} .mk-note u{color:#2f9e8f;text-decoration:none} .mk-note s{color:#1f8a5b;text-decoration:none}
  .varga-pick{text-align:center;margin:2px 0 16px}
  .varga-hint{font-family:var(--font-body);font-size:12.5px;letter-spacing:.01em;text-transform:none;color:var(--muted);font-weight:600;margin:0 0 10px}
  .varga-select{display:inline-block;position:relative;max-width:340px;width:100%}
  .varga-select::after{content:"▾";position:absolute;right:16px;top:50%;transform:translateY(-50%);color:var(--brand);font-size:13px;pointer-events:none}
  .varga-select select{-webkit-appearance:none;appearance:none;width:100%;text-align:center;text-align-last:center;font-family:var(--font-display);font-weight:600;font-size:16px;color:var(--ink);background:linear-gradient(180deg,var(--surface),var(--surface-2));border:1px solid var(--line);border-radius:999px;padding:12px 34px;box-shadow:none;cursor:pointer;transition:border-color .15s,box-shadow .15s}
  .varga-select select:hover{border-color:var(--brand)}
  .varga-select select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
  .varga-info-btn{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin-top:12px;padding:0;border:1px solid var(--line);background:var(--surface);color:var(--brand);border-radius:50%;cursor:pointer;box-shadow:none;transition:.15s;vertical-align:middle}
  .varga-info-btn svg{width:17px;height:17px}
  .varga-info-btn:hover{background:var(--brand);color:#fff;border-color:var(--brand)}
  .varga-info-btn:active{transform:scale(.94)}
  .cstyle-toggle{display:flex;justify-content:center;gap:4px;margin:2px 0 10px;background:var(--surface-2);border-radius:999px;padding:4px;border:1px solid var(--line)}
  .cstyle-toggle button{appearance:none;border:0;background:transparent;color:var(--muted);font-family:var(--font-body);font-size:12.5px;font-weight:600;letter-spacing:.01em;text-transform:none;padding:7px 16px;border-radius:999px;cursor:pointer;transition:.15s;box-shadow:none;flex:1}
  .cstyle-toggle button:hover{color:var(--ink)}
  .cstyle-toggle button[aria-selected="true"]{background:var(--sel);color:var(--on-sel);border-color:var(--sel);box-shadow:var(--sh-1)}
  .upa-legend{color:var(--ink-body)}
  .upa-legend b{color:#2f9e8f}
  /* panchang / chogadiya / hora */
  .psubh{font-family:var(--font-display);font-size:13.5px;letter-spacing:0;text-transform:none;color:var(--ink);margin:24px 0 12px;font-weight:600;padding-left:12px;position:relative}
  .psubh::before{content:"";position:absolute;left:0;top:1px;bottom:1px;width:3px;border-radius:2px;background:var(--brand)}
  .psubh-good{color:var(--ok)} .psubh-good::before{background:var(--ok)}
  .psubh-bad{color:var(--brand)} .psubh-bad::before{background:var(--brand)}
  .pdet{margin-top:16px;border-top:1px solid var(--line)}
  .pdet>summary{cursor:pointer;font-family:var(--font-mono);font-size:12.7px;letter-spacing:.12em;text-transform:uppercase;color:var(--brand);font-weight:700;padding:10px 0;list-style:none}
  .pdet>summary::-webkit-details-marker{display:none}
  .pdet>summary::before{content:"▸  ";color:var(--muted)}
  .pdet[open]>summary::before{content:"▾  "}
  .pdim{color:var(--muted)}
  .pgrid,.cgrid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  @media(max-width:560px){.pgrid,.cgrid{grid-template-columns:1fr}}
  /* flex-wrap so a long value drops to its own line instead of being pushed
     out of the row: a flex item defaults to min-width:auto, so the date could
     neither shrink nor wrap and simply ran past the edge of the panel. */
  .prow{display:flex;flex-wrap:wrap;justify-content:space-between;gap:4px 12px;align-items:baseline;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);padding:11px 14px;transition:border-color .14s,box-shadow .14s}
  .prow:hover{border-color:var(--line-strong);box-shadow:var(--sh-1)}
  .prow .pk{font-family:var(--font-mono);font-size:12.1px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);font-weight:700;white-space:nowrap}
  .prow .pv{font-family:var(--font-display);font-size:15px;color:var(--ink);font-weight:600;text-align:right;line-height:1.35;
    /* min-width:0 is what actually lets it shrink; the rest lets a long date
       break rather than overflow. */
    min-width:0;flex:1 1 auto;overflow-wrap:anywhere}
  .prow .pv .pend{font-family:var(--font-mono);font-size:11.5px;color:var(--brand);font-weight:700;white-space:nowrap;margin-left:7px;letter-spacing:.02em}
  .prow .pv .pseq{opacity:.72;font-size:.94em}
  .prow .pv .pday{opacity:.7;font-family:var(--font-mono);font-size:10.5px}
  .prow .pv .psub{color:var(--muted);font-weight:500}
  .pnum{display:inline-block;min-width:18px;font-family:var(--font-mono);font-size:12.7px;color:var(--brand);font-weight:700;margin-right:6px;text-align:right}
  .pv.nat-good{color:#1f8a5b} .pv.nat-bad{color:var(--brand-deep)}
  .crow,.hrow{display:flex;justify-content:space-between;align-items:center;gap:10px;border:1px solid var(--line);border-left-width:4px;border-radius:var(--r-sm);padding:11px 13px;background:var(--surface-2);transition:box-shadow .14s,transform .1s}
  .crow:hover,.hrow:hover{box-shadow:var(--sh-1)}
  .crow .cn,.hrow .hn{font-family:var(--font-display);font-size:15px;color:var(--ink);font-weight:600}
  .crow .ct,.hrow .ht{font-family:var(--font-mono);font-size:13.8px;color:var(--ink-body);font-weight:700}
  .nat2-0{border-left-color:#1f8a5b} .nat2-1{border-left-color:var(--muted)} .nat2-2{border-left-color:var(--brand)}
  .legend{display:flex;flex-wrap:wrap;gap:5px 14px;margin:14px 2px 2px;font-family:var(--font-mono);font-size:12.7px;color:var(--muted);font-weight:700}
  .legend b{color:var(--ink)}
  .legend .lg-sun b{color:var(--gold)} .legend .lg-la b{color:var(--brand)}

  .scroll{overflow-x:auto;overscroll-behavior-x:contain;padding-bottom:2px;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent 100%);mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent 100%)}
  .scroll:hover,.scroll:focus-within{-webkit-mask-image:none;mask-image:none}
  table{width:100%;border-collapse:collapse;margin-top:8px;min-width:520px}
  th,td{text-align:left;padding:11px 9px;border-bottom:1px solid var(--line);font-size:13.5px;vertical-align:middle}
  th{font-family:var(--font-mono);font-size:12.1px;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);font-weight:700;border-bottom:1.5px solid var(--line-strong)}
  tbody tr{transition:background .12s}
  tbody tr:hover{background:var(--surface-2)}
  td.name{font-family:var(--font-display);font-size:16px;color:var(--ink);font-weight:600}
  td.deg{font-family:var(--font-mono);color:var(--brand-deep);white-space:nowrap;font-weight:700}
  td.dim{color:var(--ink-body);font-size:12.5px}
  td.house{font-family:var(--font-mono);color:var(--brand);text-align:center;font-weight:700;font-size:17.2px}
  td.retro{font-family:var(--font-mono);text-align:center;color:var(--brand);font-weight:700}
  .gg-pos{white-space:nowrap}
  .ps-sign{color:var(--ink);font-weight:600}
  .ps-deg{font-family:var(--font-mono);color:var(--brand-deep);font-weight:700;font-size:14.4px;margin-left:3px}
  .nl{color:var(--gold);font-weight:700}
  /* planets view toggle */
  .gv-toggle{display:inline-flex;border:1px solid var(--line-strong);border-radius:999px;overflow:hidden;margin:0 0 14px;box-shadow:var(--sh-1)}
  .gv-toggle button{appearance:none;border:none;background:var(--surface);color:var(--muted);font-family:var(--font-mono);font-size:11.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:8px 18px;cursor:pointer;transition:.12s;display:flex;align-items:center;gap:6px}
  .gv-toggle button svg{width:15px;height:15px}
  .gv-toggle button+button{border-left:1px solid var(--line-strong)}
  .gv-toggle button:hover{color:var(--brand)}
  .gv-toggle button.on{background:var(--sel);color:var(--on-sel)}
  /* planets — card grid */
  .gcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(288px,1fr));gap:12px}
  .gcard{border:1px solid var(--line);border-radius:14px;background:var(--surface-2);padding:15px 17px;box-shadow:var(--sh-1);transition:border-color .12s,box-shadow .12s}
  .gcard:hover{border-color:var(--brand);box-shadow:var(--sh-2)}
  .gc-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
  .gc-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
  .gc-lead{display:flex;align-items:center;gap:11px;min-width:0}
  .gc-glyph{width:36px;height:36px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:20px;line-height:1;background:var(--surface);border:1.5px solid var(--gcol,var(--line-strong));color:var(--gcol,var(--ink));box-shadow:var(--sh-1)}
  .gc-name{font-family:var(--font-display);font-size:19px;font-weight:700;color:var(--brand-deep);cursor:pointer;display:inline-flex;align-items:center;gap:6px;border-bottom:1.5px dotted var(--brand);transition:color .12s}
  .gc-name::after{content:"›";font-family:var(--font-body);font-size:17px;color:var(--brand);opacity:.7;transition:transform .12s}
  .gc-name:hover{color:var(--brand)}
  .gc-name:hover::after{transform:translateX(2px)}
  .gc-state{font-family:var(--font-mono);font-size:10.5px;font-weight:700;color:var(--brand);text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}
  .gc-pos{margin:5px 0 11px;padding-bottom:11px;border-bottom:1px solid var(--line)}
  .gc-rows{display:flex;flex-direction:column;gap:9px}
  .gc-row{display:flex;align-items:center;justify-content:space-between;gap:12px}
  .gc-k{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);flex:0 0 auto}
  .gc-v{text-align:right;font-size:14.5px;color:var(--ink-body);font-weight:600;min-width:0}
  .gc-v .nak-tap{font-size:14.5px}
  .gc-v.gc-lord{color:var(--gold-deep,#b8860b);font-weight:700}
  /* planets — table */
  .gtbl{width:100%;border-collapse:collapse;min-width:580px;margin-top:6px}
  .gtbl th{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);font-weight:700;text-align:left;padding:10px 9px;border-bottom:1.5px solid var(--line-strong);white-space:nowrap}
  .gtbl td{padding:11px 9px;border-bottom:1px solid var(--line);font-size:13.6px;vertical-align:middle;white-space:nowrap}
  .gtbl tbody tr:last-child td{border-bottom:none}
  .gtbl tbody tr:hover{background:var(--surface-2)}
  .gtbl .ps-sign{font-weight:600}
  .gt-name{font-family:var(--font-display);font-size:16px;color:var(--brand-deep);font-weight:700;cursor:pointer;white-space:nowrap;border-bottom:1.5px dotted var(--brand);display:inline-block}
  .gt-name:hover{color:var(--brand)}
  .gtbl .nak-tap{white-space:nowrap}
  .gtbl .nl{color:var(--gold-deep,#b8860b);font-weight:700}
  .gtbl .retro{font-family:var(--font-mono);color:var(--brand);font-weight:700;font-size:11.5px}
  .gtbl td.gt-pada{text-align:center}
  .kara{font-family:var(--font-mono);font-weight:700;color:var(--ink);letter-spacing:.02em}
  .dasha-now{background:rgba(215,46,71,.08)}
  .dasha-now td:first-child{position:relative}
  .dasha-now td:first-child::before{content:"▸";color:var(--brand);position:absolute;left:-2px}

  /* dasha drill-down explorer */
  .dsub{margin:-6px 0 14px;padding:11px 13px;background:var(--surface-2);
    border:1px solid var(--line);border-radius:var(--r-sm)}
  .dsub-row{display:flex;align-items:center;gap:11px;flex-wrap:wrap}
  .dsub-row+.dsub-row{margin-top:9px;padding-top:9px;border-top:1px solid var(--line)}
  .dsub-lbl{font-size:12px;color:var(--muted);font-weight:600;min-width:62px}
  .dvar{display:inline-flex;gap:3px;padding:3px;background:var(--surface);
    border:1px solid var(--line);border-radius:99px}
  .dvar button{appearance:none;border:0;background:transparent;color:var(--muted);
    font-family:var(--font-body);font-size:12.5px;font-weight:600;padding:6px 14px;
    border-radius:99px;cursor:pointer;transition:.15s}
  .dvar button:hover:not([aria-pressed="true"]){color:var(--ink)}
  .dvar button[aria-pressed="true"]{background:var(--sel);color:var(--on-sel)}
  .dsys{display:inline-flex;gap:3px;margin:0 0 16px;padding:4px;
    border:1px solid var(--line);border-radius:999px;background:var(--surface-2)}
  .dsys button{appearance:none;border:0;background:transparent;color:var(--muted);
    font-family:var(--font-body);font-size:12px;font-weight:600;letter-spacing:.005em;
    height:30px;padding:0 15px;border-radius:999px;cursor:pointer;white-space:nowrap;
    transition:color .15s ease,background .15s ease}
  .dsys button:hover:not([aria-pressed="true"]){color:var(--ink)}
  .dsys button[aria-pressed="true"]{background:var(--sel);color:var(--on-sel)}
  .rect-ev{margin:16px 0;padding:14px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r)}
  .rect-ev-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;
    font-size:12.5px;font-weight:600;color:var(--ink)}
  .rect-ev-row{display:flex;gap:8px;align-items:center;margin-bottom:7px}
  .rect-ev-row select{flex:1 1 auto;min-width:0}
  .rect-ev-row input{flex:0 0 150px}
  .rect-ev-del{flex:0 0 auto;appearance:none;border:0;background:var(--brand-soft);color:var(--brand-deep);
    font-size:12px;font-weight:700;padding:7px 10px;border-radius:8px;cursor:pointer}
  table.rect td.sc{font-family:var(--font-mono);font-weight:700;text-align:right}
  table.rect tr.best{background:var(--sel-soft)}
  table.rect tr.best td:first-child{box-shadow:inset 3px 0 0 var(--sel)}
  .rect-warn{background:var(--gold-soft)!important;border-left-color:var(--gold)!important;line-height:1.6}
  .rect-conf{margin:0 0 12px;padding:11px 14px;border-radius:var(--r);
    background:var(--sel-soft);border-left:3px solid var(--sel);font-size:13px;color:var(--ink)}
  .rect-badge{display:inline-block;padding:3px 11px;border-radius:999px;font-size:11.5px;font-weight:700;white-space:nowrap}
  .rect-badge.v-strong{background:rgba(31,138,91,.16);color:#17805a}
  .rect-badge.v-fair{background:var(--gold-soft);color:var(--gold)}
  .rect-badge.v-weak{background:var(--surface-3);color:var(--muted)}
  .rect-why{font-size:11px;color:var(--muted);font-family:var(--font-mono)}
  .pb-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px;margin-top:4px}
  .pb-card{border:1px solid var(--line);border-left-width:3px;border-radius:var(--r);
    padding:13px 15px;background:var(--surface-2)}
  .pb-card.good{border-left-color:var(--ok)}
  .pb-card.bad{border-left-color:var(--brand)}
  .pb-card.neu{border-left-color:var(--muted)}
  .pb-k{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
    color:var(--muted);font-weight:700}
  .pb-v{font-family:var(--font-display);font-size:17px;font-weight:600;color:var(--ink);margin:4px 0 2px}
  .pb-d{font-size:12.5px;color:var(--muted);line-height:1.5}
  .pb-tag{display:inline-block;font-size:10.5px;font-weight:700;padding:2px 9px;border-radius:999px;margin-top:7px}
  .pb-tag.good{background:rgba(31,138,91,.15);color:var(--ok)}
  .pb-tag.bad{background:var(--brand-soft);color:var(--brand-deep)}
  .pb-tag.neu{background:var(--surface-3);color:var(--muted)}
  .pb-rashi{margin-top:12px;display:flex;flex-wrap:wrap;gap:6px}
  .pb-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);
    border-radius:999px;padding:5px 11px;font-size:12px;background:var(--surface)}
  .pb-chip b{font-weight:600;color:var(--ink)}
  .pb-chip.good{border-color:rgba(31,138,91,.4)}
  .pb-chip.bad{border-color:rgba(215,46,71,.35)}
  .kp-win{margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
  .kp-winrow{display:flex;flex-wrap:wrap;gap:6px 14px;align-items:baseline;padding:5px 0;
    border-bottom:1px solid var(--line-2)}
  .kp-winrow:last-child{border-bottom:0}
  .kp-wd{font-family:var(--font-mono);font-size:12px;font-weight:700;color:var(--ink);min-width:172px}
  .kp-wl{font-size:12px;color:var(--muted)}
  /* Saved kundlis are reachable from every mode, not just the details panel,
     so this sits in the toolbar rather than inside the workspace bar. It keeps
     its label where there is room and collapses to the icon when there is not —
     the title attribute carries the meaning either way. */
  /* Lives under the birth details rather than the toolbar: opening saved charts
     belongs next to the form you would load them into, not beside the theme
     switch. Full width here, so it reads as a panel action. */
  .tb-kundli{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;
    margin-top:10px;appearance:none;cursor:pointer;font-family:var(--font-body);
    font-size:12.5px;font-weight:700;letter-spacing:.01em;
    padding:11px 16px;border-radius:999px;
    border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);
    transition:border-color .15s,background .15s,transform .15s}
  .tb-kundli .ic{width:15px;height:15px;flex:0 0 auto}
  .tb-kundli:hover{border-color:var(--brand);background:var(--surface-2);transform:translateY(-1px)}
  .tb-kundli:focus-visible{outline:2px solid var(--sel);outline-offset:2px}
  .tb-kundli.hidden{display:none}
  /* data-busy swaps the label for the orrery; without a min-width the button
     collapses to the spinner's own size and the toolbar jumps. The global
     busy rule hides labels with text-indent, which does nothing to an SVG —
     so both children are hidden explicitly, leaving only the pseudo-element
     rings (which visibility on siblings cannot touch). */
  .tb-kundli[data-busy="1"]{min-height:41px}
  .tb-kundli[data-busy="1"] .ic,
  .tb-kundli[data-busy="1"] span{visibility:hidden}

  @media(prefers-reduced-motion:reduce){ .tb-kundli:hover{transform:none} }

  .rp-secs{display:grid;grid-template-columns:1fr 1fr;gap:6px 12px;margin-bottom:14px}
  .rp-secs label{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink);cursor:pointer}
  .rp-secs input{accent-color:var(--brand)}
  .rp-depth{display:flex;align-items:center;gap:10px;margin-bottom:8px}
  .rp-depth label{font-family:var(--font-mono);font-size:10px;letter-spacing:.11em;
    text-transform:uppercase;color:var(--muted);flex:0 0 auto}
  .rp-depth select{flex:1;padding:9px 11px;border:1px solid var(--line-strong);border-radius:10px;
    background:var(--surface-2);color:var(--ink);font:inherit;font-size:13px}
  /* while working, the options are replaced rather than merely disabled —
     a greyed-out form still invites clicking */
  .rp-busy{display:none;text-align:center;padding:26px 4px 8px}
  .rp-card-working .rp-secs,
  .rp-card-working .rp-depth,
  .rp-card-working .rp-est,
  .rp-card-working .vc-acts,
  .rp-card-working .vc-hint,
  .rp-card-working .vc-x{display:none}
  .rp-card-working .rp-busy{display:block}
  .rp-busy .orb.lg{width:54px;height:54px;--orb:54px;margin:0 auto 18px}
  .rp-busy-h{font-family:var(--font-display);font-size:17px;font-weight:700;
    color:var(--ink);margin-bottom:6px;letter-spacing:-.01em}
  .rp-busy-s{font-size:12.5px;color:var(--muted);line-height:1.55;
    max-width:300px;margin:0 auto 16px}
  .rp-busy-stage{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;
    text-transform:uppercase;color:var(--brand-deep);min-height:14px}
  .rp-log{list-style:none;margin:14px auto 0;padding:0;max-width:290px;text-align:left}
  .rp-log li{display:flex;justify-content:space-between;gap:10px;
    font-family:var(--font-mono);font-size:10.5px;color:var(--muted);
    padding:3px 0;border-bottom:1px solid var(--line-2)}
  .rp-log li b{color:var(--ink);font-weight:600}
  .rp-log li.slow b{color:var(--brand-deep)}
  .rp-busy-warn{margin-top:16px;padding-top:12px;border-top:1px solid var(--line);
    font-size:11.5px;color:var(--brand-deep);font-weight:600}
  .rp-est{font-family:var(--font-mono);font-size:11px;color:var(--muted);margin:0 0 4px}
  .rp-est.warn{color:var(--brand-deep)}
  @media(max-width:460px){ .rp-secs{grid-template-columns:1fr} }

  /* ===== VOICE INPUT ======================================================
     The button is hidden by default and only revealed once the browser is
     confirmed to support SpeechRecognition — Firefox has no implementation,
     and a mic button that does nothing is worse than none. */
  .vc-open{display:inline-flex;align-items:center;gap:8px;width:100%;justify-content:center;
    margin-bottom:14px;appearance:none;cursor:pointer;font-family:var(--font-body);
    font-size:12.5px;font-weight:700;padding:10px 16px;border-radius:999px;
    border:1px dashed var(--line-strong);background:transparent;color:var(--ink);
    transition:border-color .15s,background .15s}
  .vc-open svg{width:16px;height:16px}
  .vc-open:hover{border-style:solid;border-color:var(--brand);background:var(--surface-2)}
  .vc-open.hidden{display:none}

  .vc-modal{position:fixed;inset:0;z-index:390;background:rgba(20,10,40,.5);
    backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
    display:flex;align-items:center;justify-content:center;padding:18px}
  .vc-modal.hidden{display:none}
  .vc-card{position:relative;background:var(--surface);border:1px solid var(--line);
    border-radius:var(--r-lg);max-width:430px;width:100%;padding:24px;box-shadow:var(--sh-3)}
  .vc-card h3{font-family:var(--font-display);font-size:16px;color:var(--ink);
    margin:0 0 6px;padding-right:30px}
  .vc-hint{font-size:12px;color:var(--muted);line-height:1.55;margin:0 0 16px}
  .vc-x{position:absolute;top:13px;right:13px;appearance:none;border:0;background:var(--surface-2);
    width:28px;height:28px;border-radius:50%;font-size:17px;line-height:1;color:var(--muted);cursor:pointer}

  /* listening state — reuses the shared orrery so every wait in the app matches */
  /* speaking-language chips — the UI may be in English while the user speaks
     Hindi, and picking the wrong recogniser locale is a common reason nothing
     is transcribed at all */
  .vc-langs{display:flex;align-items:center;gap:6px;margin:0 0 12px;font-size:11.5px;color:var(--muted)}
  .vc-langs span{margin-right:2px}
  .vc-langs button{appearance:none;border:1px solid var(--line-strong);background:transparent;
    color:var(--muted);font-family:inherit;font-size:11.5px;font-weight:700;
    padding:4px 11px;border-radius:999px;cursor:pointer}
  .vc-langs button.on{background:var(--sel);color:var(--on-sel);border-color:transparent}
  /* step rail — three dots and a counter, so the flow never feels open-ended */
  .vc-steps{display:flex;align-items:center;gap:6px;margin:0 0 12px}
  .vc-steps i{width:22px;height:3px;border-radius:2px;background:var(--line-strong);display:block}
  .vc-steps i.on{background:var(--sel)}
  .vc-steps i.done{background:var(--ok)}
  .vc-steps em{margin-left:6px;font-family:var(--font-mono);font-size:10px;font-style:normal;
    letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
  .vc-ask{font-family:var(--font-display);font-size:17px;font-weight:700;color:var(--ink);margin:0 0 4px}
  .vc-eg{font-size:11.5px;color:var(--muted);line-height:1.5;margin:0 0 12px}
  .vc-warn{font-size:12px;color:var(--brand-deep);background:var(--brand-soft);
    border-radius:var(--r-sm);padding:8px 11px;margin:0 0 12px;line-height:1.45}
  .vc-listen{display:flex;flex-direction:column;align-items:center;gap:14px;padding:18px 0 6px;text-align:center}
  .vc-listen .ld-lbl{font-size:13px;color:var(--muted)}
  .vc-live{min-height:40px;max-height:120px;overflow-y:auto;font-size:14px;line-height:1.5;
    color:var(--ink);max-width:330px;font-style:italic}
  .vc-live:empty::after{content:"\2026";color:var(--muted)}

  /* review — nothing is applied until the user confirms, because a misheard
     minute silently produces a chart for the wrong lagna */
  .vc-heard{background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);
    padding:10px 12px;margin-bottom:14px;font-size:12.5px;line-height:1.5;color:var(--body);font-style:italic}
  .vc-heard b{display:block;font-style:normal;font-family:var(--font-mono);font-size:10px;
    letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:4px}
  .vc-rev{font-size:11.5px;font-weight:700;color:var(--ink);margin:0 0 9px}
  .vc-row{display:flex;align-items:center;gap:9px;margin-bottom:8px}
  .vc-row label{flex:0 0 96px;font-size:11.5px;color:var(--muted)}
  .vc-row input{flex:1;min-width:0;border:1px solid var(--line-strong);border-radius:var(--r-sm);
    background:var(--surface-2);color:var(--ink);font-family:inherit;font-size:13px;padding:8px 10px}
  .vc-row input:focus{outline:none;border-color:var(--brand);background:var(--surface)}
  .vc-row.miss input{border-color:var(--brand);border-style:dashed}
  .vc-row.miss input::placeholder{color:var(--brand-deep);opacity:.75}
  .vc-geo{font-family:var(--font-mono);font-size:10.5px;color:var(--muted);
    margin:-3px 0 10px 105px;min-height:14px}
  .vc-geo.err{color:var(--brand-deep)}
  .vc-picks{display:flex;flex-direction:column;gap:5px;margin:0 0 12px 105px}
  .vc-pick{appearance:none;text-align:left;border:1px solid var(--line);background:var(--surface);
    border-radius:6px;padding:6px 9px;font-family:inherit;font-size:12px;color:var(--ink);cursor:pointer}
  .vc-pick:hover,.vc-pick.on{border-color:var(--brand);background:var(--surface-2)}
  .vc-altbox{margin:0 0 4px 105px;display:flex;flex-wrap:wrap;gap:5px}
  .vc-altbox:empty{display:none}
  .vc-altlbl{flex:0 0 100%;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.1em;
    text-transform:uppercase;color:var(--muted);margin-bottom:2px}
  .vc-acts{display:flex;gap:8px;margin-top:16px}
  .vc-acts button{flex:1;appearance:none;border:1px solid var(--line-strong);background:var(--surface);
    color:var(--ink);font-family:inherit;font-size:12.5px;font-weight:700;padding:10px;border-radius:999px;cursor:pointer}
  .vc-acts .vc-go{background:var(--fill-strong);color:var(--on-strong);border-color:transparent}
  .vc-acts button:disabled{opacity:.45;cursor:default}
  .vc-diag{margin:6px 0 0;font-family:var(--font-mono);font-size:10.5px;line-height:1.5;
    color:var(--muted);opacity:.75;text-align:center;word-break:break-word}
  .vc-ghost{background:transparent}
  .vc-msg{font-size:12.5px;line-height:1.55;color:var(--brand-deep);text-align:center;padding:14px 0}
  @media(max-width:460px){
    .vc-row{flex-wrap:wrap}
    .vc-row label{flex:0 0 100%}
    .vc-geo,.vc-picks,.vc-altbox{margin-left:0}
  }

  /* Transits fetch two charts in sequence — the natal one and the transit one.
     Until both land the panel below still shows the PREVIOUS date's positions,
     which is worse than showing nothing: it looks like an answer. Cover it. */
  #gochar-out{position:relative}
  /* Overlaid rather than inserted, so showing it does not reflow the panel and
     then reflow it back when the answer arrives. */
  .gochar-busy{display:none;position:absolute;left:0;right:0;top:0;z-index:5;padding:10px}
  #gochar-out.busy .gochar-busy{display:block}
  #gochar-out.busy > .panel{opacity:.3;pointer-events:none;filter:saturate(.55)}
  .gochar-busy .ldbox{max-width:340px;margin:0 auto;
    box-shadow:var(--sh-3);background:var(--surface)}
  @media(prefers-reduced-motion:reduce){
    #gochar-out.busy > .panel{filter:none}
  }

  /* ===== SHARED LOADING LANGUAGE ==========================================
     One vocabulary everywhere: an orrery for spinners, skeleton rows for lists,
     a hairline bar for page-level work. Every animation is transform-only and
     promoted with will-change, so the compositor keeps them moving while the
     main thread is blocked by ephemeris maths or a slow list fetch. Anything
     animating width/background-position would freeze exactly when it matters. */
  @keyframes orb-rot{to{transform:rotate(360deg)}}
  @keyframes orb-sheen{to{transform:translateX(100%)}}

  /* The orrery. --orb sets the diameter; the graha hides below 30px where it
     would only read as a smudge. */
  .orb{position:relative;display:block;flex:0 0 auto;
    width:var(--orb,46px);height:var(--orb,46px)}
  .orb::before{content:"";position:absolute;inset:0;border-radius:50%;
    border:1px solid var(--line)}
  .orb::after{content:"";position:absolute;inset:0;border-radius:50%;
    border:1.5px solid transparent;border-top-color:var(--sel);
    animation:orb-rot 1.15s cubic-bezier(.5,.1,.5,.9) infinite;will-change:transform}
  .orb i{position:absolute;inset:0;display:block;
    animation:orb-rot 2.6s linear infinite;will-change:transform}
  .orb i::after{content:"";position:absolute;top:-3.5px;left:50%;
    width:7px;height:7px;margin-left:-3.5px;border-radius:50%;
    background:var(--gold);box-shadow:0 0 0 3px var(--gold-soft),0 0 10px var(--gold)}
  .orb.sm{--orb:22px}
  .orb.sm::after{border-width:1.5px}
  .orb.sm i{display:none}

  /* Skeleton rows. Sized like the content that replaces them so the panel
     height does not jump on arrival. */
  .skl{display:flex;flex-direction:column;gap:9px;width:100%}
  .skl span{position:relative;overflow:hidden;display:block;height:9px;
    border-radius:99px;background:var(--surface-3)}
  .skl span::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
    background:linear-gradient(90deg,transparent,var(--line-strong),transparent);
    animation:orb-sheen 1.5s ease-in-out infinite;will-change:transform}
  .skl span:nth-child(2)::after{animation-delay:.14s}
  .skl span:nth-child(3)::after{animation-delay:.28s}
  .skl span:nth-child(4)::after{animation-delay:.42s}
  /* Row-shaped skeleton for list panels: a tall block per pending record. */
  .skl.rows span{height:46px;border-radius:var(--r-sm)}

  /* Centred block loader — spinner over a label over skeleton rows. */
  .ldbox{display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:17px;padding:38px 20px 32px;min-height:170px;text-align:center;
    border:1px solid var(--line);border-radius:var(--r);background:var(--surface-2)}
  .ldbox .ld-lbl{font-family:var(--font-body);font-size:13px;
    color:var(--muted);max-width:300px;line-height:1.55}
  .ldbox .skl{max-width:330px}
  .ldbox .skl span:nth-child(2){width:84%}
  .ldbox .skl span:nth-child(3){width:62%}

  /* slim indeterminate bar; sits just under the app bar */
  .loadbar{position:fixed;left:0;right:0;top:0;height:2px;z-index:500;
    pointer-events:none;opacity:0;transition:opacity .18s ease}
  .loadbar.on{opacity:1}
  .loadbar.done{opacity:0}
  .loadbar i{display:block;height:100%;width:38%;border-radius:0 2px 2px 0;
    background:linear-gradient(90deg,transparent,var(--sel),var(--gold),transparent);
    animation:loadslide 1.05s cubic-bezier(.5,.05,.5,.95) infinite;will-change:transform}
  @keyframes loadslide{0%{transform:translateX(-100%)}100%{transform:translateX(365%)}}

  /* Any button that fired a request shows the orrery in place of its label.
     The label is hidden with text-indent/overflow rather than transparent text,
     because the rings use currentColor and would vanish along with it. At 17px
     a travelling graha is illegible, so the button keeps only the two rings. */
  button[data-busy="1"]{position:relative;pointer-events:none;
    text-indent:-9999px;overflow:hidden;white-space:nowrap}
  button[data-busy="1"]::before,
  button[data-busy="1"]::after{content:"";position:absolute;left:50%;top:50%;
    width:17px;height:17px;margin:-8.5px 0 0 -8.5px;border-radius:50%;
    text-indent:0;box-sizing:border-box}
  button[data-busy="1"]::before{border:2px solid currentColor;opacity:.2}
  button[data-busy="1"]::after{border:2px solid transparent;
    border-top-color:currentColor;opacity:.95;
    animation:orb-rot 1.15s cubic-bezier(.5,.1,.5,.9) infinite;will-change:transform}

  @media(prefers-reduced-motion:reduce){
    .loadbar i{animation:none;width:100%}
    .orb::after{animation-duration:3.2s;animation-timing-function:linear}
    .orb i{animation-duration:6s}
    .skl span::after{animation:none}
    button[data-busy="1"]::after{animation:none}
  }
  /* Neutral convergence label replacing the old score pill. Deliberately not
     colour-graded: a green/amber/red scale reads as a confidence rating, and
     we have no evidence to support one. */
  .ev-conv{font-family:var(--font-mono);font-size:11.5px;color:var(--muted);
    background:var(--surface-3);padding:3px 10px;border-radius:999px}
  .rect-form{display:flex;flex-wrap:wrap;gap:12px 16px;align-items:flex-end;margin-bottom:16px;
    padding:14px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r)}
  .rect-f{display:flex;flex-direction:column;min-width:130px}
  .rect-f label{margin-bottom:6px}
  table.rect{width:100%;border-collapse:collapse;min-width:560px;font-variant-numeric:tabular-nums}
  table.rect th{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.07em;text-transform:uppercase;
    color:var(--muted);font-weight:700;text-align:left;padding:9px 10px;border-bottom:1.5px solid var(--line-strong);white-space:nowrap}
  table.rect td{padding:8px 10px;border-bottom:1px solid var(--line);font-size:13px;
    white-space:nowrap;vertical-align:top}
  table.rect td.rect-why{white-space:normal;word-break:break-word;min-width:180px}
  table.rect tbody tr:hover{background:var(--surface-2);cursor:pointer}
  table.rect tr.rect-now{background:var(--sel-soft)}
  table.rect tr.rect-now td:first-child{box-shadow:inset 3px 0 0 var(--sel)}
  table.rect td.rect-t{font-family:var(--font-mono);font-weight:700;color:var(--ink)}
  table.rect td.rect-deg{font-family:var(--font-mono);font-size:12px;color:var(--brand-deep)}
  table.rect td.chg{font-weight:700;color:var(--sel)}
  table.rect td.chg::before{content:"\u25B8 ";opacity:.7}
  .rect-legend{font-size:12px;color:var(--muted);margin-top:12px;line-height:1.6}
  .d-now{background:linear-gradient(180deg,rgba(215,46,71,.10),rgba(215,46,71,.05));border:1px solid rgba(215,46,71,.28);border-radius:var(--r-lg);padding:14px 16px;margin:8px 0 14px;box-shadow:var(--sh-1)}
  .dn-lbl{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--brand-deep);font-weight:700;margin-bottom:9px}
  .dn-chain{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin-bottom:8px}
  .dn-node{display:inline-flex;flex-direction:column;line-height:1.15}
  .dn-nm{font-family:var(--font-mono);font-size:9.8px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:700}
  .dn-lord{font-family:var(--font-display);font-size:17px;font-weight:700;color:var(--ink)}
  .dn-arr{color:var(--brand);font-size:15px;align-self:flex-end;margin-bottom:1px;opacity:.6}
  .dn-dates{font-family:var(--font-mono);font-size:13.8px;color:var(--muted)}
  .d-nav{display:flex;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px;flex-wrap:wrap}
  .d-navlbl{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:700}
  .nowbtn{appearance:none;border:1px solid var(--brand);background:var(--surface);color:var(--brand);font-family:var(--font-mono);font-size:12.7px;font-weight:700;letter-spacing:.06em;padding:8px 13px;border-radius:999px;cursor:pointer;white-space:nowrap;box-shadow:var(--sh-1)}
  .nowbtn:hover{background:var(--brand);color:#fff}
  .d-list{display:flex;flex-direction:column;gap:4px}
  .drow{display:grid;grid-template-columns:20px 1fr auto auto;align-items:center;gap:6px 12px;width:100%;
    text-align:left;appearance:none;border:1px solid var(--line);background:var(--surface);
    border-radius:var(--r);padding:11px 14px;cursor:pointer;
    padding-left:calc(14px + var(--d-depth,0) * 16px);
    transition:background .12s,border-color .12s}
  .drow:hover{border-color:var(--brand)}
  /* The lord name was set at four different sizes down the tree, which is what
     actually changed the row heights. One size throughout; the levels are told
     apart by fill, indent and the tag colour instead. */
  .drow .drow-l{font-size:14.5px;font-weight:600}
  .drow.lvl1{background:var(--surface-2)}
  .drow.lvl2{background:var(--surface-2)}
  /* Sukshma was the last level and was styled as a dead leaf. It opens into
     Prana now, so it keeps the pointer; only Deha is a leaf. */
  /* Levels differ by fill and indent only. They used to differ by padding, font
     size and border as well — Sukshma had no border at all, from when it was a
     leaf row, so it lost both the resting outline and the current-period
     marker that every other level shows. */
  .drow.lvl3{background:transparent}
  .drow.lvl4 .drow-tag,.drow.lvl5 .drow-tag{opacity:.72}

  .drow.open{border-color:var(--brand);background:var(--brand-soft)}
  .drow.cur{box-shadow:inset 3px 0 0 var(--brand)}
  /* Levels 3 to 5 each grew their own border exceptions while Sukshma was the
     leaf. One rule for all six now: same resting outline, same hover, same
     current-period border. */
  .drow.lvl0.cur,.drow.lvl1.cur,.drow.lvl2.cur,
  .drow.lvl3.cur,.drow.lvl4.cur,.drow.lvl5.cur{border-color:var(--brand)}
  .drow.lvl4:hover,.drow.lvl5:hover{border-color:var(--brand)}
  .drow-tw{font-size:11px;color:var(--brand);font-weight:700;text-align:center}
  .drow.lvl3 .drow-tw{color:var(--line-strong)}
  .drow-main{display:flex;flex-direction:column;gap:1px;min-width:0}
  .drow-tag{font-family:var(--font-mono);font-size:9.8px;letter-spacing:.11em;text-transform:uppercase;font-weight:700;line-height:1;color:var(--muted)}
  .drow.lvl0 .drow-tag{color:var(--brand-deep)}
  .drow.lvl1 .drow-tag{color:var(--gold-deep,#b8860b)}
  .drow.lvl2 .drow-tag{color:var(--brand)}
  .drow-l{font-family:var(--font-display);font-weight:700;color:var(--ink);display:flex;
    align-items:center;gap:8px;min-width:0;flex-wrap:wrap;overflow-wrap:anywhere}
  .drow-badge{font-family:var(--font-mono);font-size:9.8px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:#fff;background:var(--brand);padding:2px 6px;border-radius:999px}
  .drow-r{font-family:var(--font-mono);font-size:13.2px;color:var(--muted);white-space:nowrap}

  /* ===== Sade Sati ===== */
  .ss-banner-sub{font-family:var(--font-body);font-size:13px;color:var(--ink-body);font-weight:500}
  .ss-list{display:flex;flex-direction:column;gap:12px;margin-top:4px}
  .ss-window{border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;background:var(--surface)}
  .ss-window-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
  .ss-window-title{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink)}
  .ss-status{font-family:var(--font-body);font-size:11.5px;font-weight:700;padding:3px 10px;border-radius:999px;white-space:nowrap}
  .ss-status-ongoing{background:var(--brand-soft);color:var(--brand-deep)}
  .ss-status-upcoming{background:var(--gold-soft);color:var(--gold)}
  .ss-status-past{background:var(--surface-2);color:var(--muted)}
  .ss-window-range{font-family:var(--font-mono);font-size:12.8px;color:var(--muted);margin-top:4px}
  .ss-window-age{color:var(--void)}
  .ss-segs{display:flex;flex-direction:column;gap:6px;margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
  .ss-seg{display:flex;align-items:center;gap:9px;font-size:13px}
  .ss-seg-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
  .ss-dot-rising{background:var(--gold)}
  .ss-dot-peak{background:var(--brand)}
  .ss-dot-setting{background:#2f9e8f}
  .ss-seg-name{font-weight:600;color:var(--ink-body);min-width:64px}
  .ss-seg-range{font-family:var(--font-mono);color:var(--muted);font-size:12.3px;margin-left:auto}

  /* ===== Yogas & Doshas ===== */
  .yd-section{margin-top:4px}
  .yd-section+.yd-section{margin-top:22px}
  .yd-section-title{font-family:var(--font-display);font-size:14.5px;font-weight:600;color:var(--ink);margin:0 0 12px;display:flex;align-items:center;gap:8px}
  .yd-count{font-family:var(--font-body);font-size:11.5px;font-weight:700;color:var(--muted);background:var(--surface-2);border-radius:999px;padding:2px 9px}
  .yd-list{display:flex;flex-direction:column;gap:10px}
  .yd-card{border:1px solid var(--line);border-radius:var(--r);padding:13px 15px;background:var(--surface)}
  .yd-card.yd-good{border-left:3px solid var(--ok)}
  .yd-card.yd-warn{border-left:3px solid var(--brand)}
  .yd-card-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
  .yd-card-title{font-family:var(--font-display);font-size:14.5px;font-weight:600;color:var(--ink)}
  .yd-cat-badge{font-size:11px;font-weight:700;color:var(--muted);background:var(--surface-2);border-radius:999px;padding:2px 9px;white-space:nowrap}
  .yd-card-desc{font-size:13.3px;color:var(--ink-body);margin:6px 0 0;line-height:1.55}
  .yd-card-bhang{font-size:12.3px;color:var(--gold);margin:8px 0 0;padding-top:8px;border-top:1px dashed var(--line);line-height:1.5}
  .yd-none-good{color:var(--ok)}

  /* ===== Varshphal ===== */
  .vp-yearpick{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;margin-bottom:18px}
  .vp-yearpick label{margin-bottom:7px}
  .vp-yearpick input{width:110px}
  .vp-chapters-title{font-family:var(--font-display);font-size:16px;font-weight:600;color:var(--ink);margin:26px 0 4px}
  .vp-chapters{display:flex;flex-direction:column;gap:10px;margin-top:10px}
  .vp-chapter{border:1px solid var(--line);border-radius:var(--r);padding:13px 16px;background:var(--surface)}
  .vp-chapter-hi{border-color:var(--brand);box-shadow:0 0 0 1px var(--brand-soft)}
  .vp-chapter-head{display:flex;align-items:center;gap:10px;margin-bottom:6px}
  .vp-chapter-num{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--fill-strong);color:var(--on-strong);font-family:var(--font-mono);font-size:12px;font-weight:700;flex:0 0 auto}
  .vp-chapter-title{font-family:var(--font-display);font-size:14.5px;font-weight:600;color:var(--ink)}
  .vp-chapter-text{font-size:13.3px;color:var(--ink-body);line-height:1.6;margin:0}

  /* ===== Muhurta ===== */
  .mh-form{display:flex;flex-wrap:wrap;gap:14px 16px;align-items:flex-end;margin-bottom:20px;padding:16px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r)}
  .mh-f{display:flex;flex-direction:column;min-width:140px}
  .mh-f label{margin-bottom:6px}
  .mh-results{display:flex;flex-direction:column;gap:8px}
  .mh-day{display:flex;align-items:center;gap:12px;border:1px solid var(--line);border-radius:var(--r-sm);padding:10px 13px;flex-wrap:wrap}
  .mh-day-date{font-family:var(--font-display);font-weight:700;color:var(--ink);min-width:150px}
  .mh-day-tags{display:flex;gap:6px;flex-wrap:wrap;font-size:11.5px;color:var(--muted)}
  .mh-tag{background:var(--surface-2);border-radius:999px;padding:2px 9px}
  .mh-tag-good{background:var(--brand-soft);color:var(--brand-deep)}
  .mh-empty{color:var(--muted);font-style:italic}

  /* ===== Client workspace bar (inside Birth Details) ===== */
  /* ---- record card -----------------------------------------------------
     This used to be a hairline rule with the name, a status line and three
     identical buttons stacked under the form — it read as a footer rather than
     as the thing that represents a saved chart. It is a card now, with one
     obvious primary action and a status that can be read at a glance. */
  .cw{
    margin-top:18px;padding:15px 16px 14px;
    border:1px solid var(--line);border-radius:var(--r-lg);
    background:linear-gradient(180deg,var(--surface-2),var(--surface));
    box-shadow:var(--sh-1,0 1px 2px rgba(35,10,77,.05));
    position:relative;overflow:hidden;
  }
  /* a hairline of brand colour along the top edge, lit only when there is
     something unsaved — the card tells you its own state before you read it */
  .cw::before{content:"";position:absolute;inset:0 0 auto 0;height:2px;
    background:var(--line);transition:background .2s ease}
  .cw.is-dirty::before{background:linear-gradient(90deg,var(--brand),var(--gold,#b4832a))}
  .cw.hidden{display:none}

  .cw-head{display:flex;align-items:flex-start;gap:11px}
  /* the initial stands in for a portrait: it gives the card an anchor and
     makes one saved chart distinguishable from the next at a glance */
  .cw-avatar{
    flex:0 0 auto;width:38px;height:38px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;
    font-family:var(--font-display);font-weight:700;font-size:16px;line-height:1;
    color:var(--brand-deep);background:var(--brand-soft);
    border:1px solid var(--line);letter-spacing:.01em;user-select:none}
  .cw-id{flex:1;min-width:0;padding-top:1px}
  .cw-name{font-family:var(--font-display);font-weight:700;font-size:15.5px;
    line-height:1.25;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

  /* status reads as a pill with a dot, not a line of grey text */
  .cw-state{display:inline-flex;align-items:center;gap:5px;margin-top:4px;
    font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;
    text-transform:uppercase;font-weight:700;color:var(--muted);
    background:var(--surface-3,var(--surface-2));border:1px solid var(--line);
    padding:3px 8px 3px 6px;border-radius:999px;max-width:100%}
  .cw-state::before{content:"";width:6px;height:6px;border-radius:50%;
    background:currentColor;flex:0 0 auto;opacity:.85}
  .cw-state.unsaved{color:var(--brand-deep);background:var(--brand-soft);
    border-color:color-mix(in srgb,var(--brand) 26%,transparent)}
  .cw-state.saved{color:#1f7a55;background:color-mix(in srgb,#1f7a55 9%,transparent);
    border-color:color-mix(in srgb,#1f7a55 24%,transparent)}

  .cw-star{flex:0 0 auto;appearance:none;border:1px solid transparent;background:none;
    padding:5px;margin:-3px -4px 0 0;border-radius:9px;cursor:pointer;color:var(--faint,var(--muted));
    line-height:0;transition:color .15s,background .15s,transform .15s}
  .cw-star svg{width:18px;height:18px}
  .cw-star:hover{color:#e0ad4e;background:var(--surface-2);transform:scale(1.06)}
  .cw-star.on{color:#e0ad4e}
  .cw-star.on svg{fill:#e0ad4e}

  /* Actions.
     Two mistakes to avoid here, both of which I made:
       - overflow:hidden + text-overflow on a flex container does not ellipsis,
         it simply cuts the label off;
       - grid-auto-columns:1fr forces every column to the same width whether or
         not the text fits, so the longest label loses its tail.
     Flex with `flex:1 1 auto` is what is wanted: the buttons share the spare
     room evenly but a button can never be squeezed narrower than its own text,
     because a flex item's default min-width is its content. */
  .cw-acts{display:flex;flex-direction:column;gap:8px;margin-top:14px}
  .cw-acts-row{display:flex;gap:8px;flex-wrap:wrap}
  .cw-acts-row .cw-btn{flex:1 1 auto}
  .cw-btn{
    display:inline-flex;align-items:center;justify-content:center;gap:6px;
    height:38px;padding:0 14px;
    appearance:none;border:1px solid var(--line-strong);background:var(--surface);
    color:var(--ink);font-family:var(--font-body);font-size:12px;font-weight:700;
    line-height:1;letter-spacing:.01em;border-radius:10px;cursor:pointer;
    white-space:nowrap;
    transition:border-color .14s,background .14s,color .14s,transform .1s}
  .cw-btn:hover{border-color:var(--brand);color:var(--brand-deep);background:var(--surface-2)}
  .cw-btn:active{transform:translateY(1px)}
  .cw-btn:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
  .cw-btn-main{width:100%;height:42px;font-size:13px;background:var(--fill-strong);
    color:var(--on-strong);border-color:transparent;box-shadow:0 1px 2px rgba(35,10,77,.14)}
  .cw-btn-main:hover{background:var(--fill-strong);color:var(--on-strong);
    border-color:transparent;filter:brightness(1.06)}
  .cw-btn:disabled{opacity:.45;cursor:default;transform:none}

  .cw-note-toggle{position:relative}
  .cw-note-toggle svg{width:15px;height:15px;flex:0 0 auto}
  .cw-note-toggle.on{border-color:var(--brand);color:var(--brand-deep);background:var(--brand-soft)}
  .cw-avatar-empty{color:var(--faint,var(--muted));background:var(--surface-2)}

  .cw-second{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:11px}
  .cw-tags{display:flex;gap:5px;flex-wrap:wrap}
  .cw-tag{display:inline-flex;align-items:center;gap:5px;background:var(--brand-soft);color:var(--brand-deep);font-size:10.5px;font-weight:700;padding:3px 8px;border-radius:999px}
  .cw-tag button{appearance:none;border:0;background:none;color:inherit;cursor:pointer;font-size:12px;line-height:1;padding:0;opacity:.65}
  .cw-tag button:hover{opacity:1}
  .cw-tagin{flex:1;min-width:88px;border:1px dashed var(--line-strong);background:transparent;border-radius:999px;padding:5px 10px;font-size:11px;font-family:inherit;color:var(--ink)}
  .cw-tagin:focus{outline:none;border-color:var(--brand);border-style:solid}
  .cw-note-toggle{width:100%;margin-top:9px;appearance:none;border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);font-family:var(--font-body);font-size:11.5px;font-weight:700;padding:8px 12px;border-radius:999px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:7px}
  .cw-note-toggle svg{width:14px;height:14px}
  .cw-note-toggle:hover{border-color:var(--brand)}
  .cw-note-dot{width:6px;height:6px;border-radius:50%;background:var(--brand)}
  .cw-note-dot.hidden{display:none}
  .cw-note{margin-top:9px}
  .cw-note.hidden{display:none}
  .cw-note textarea{width:100%;border:1px solid var(--line-strong);border-radius:var(--r-sm);background:var(--surface-2);color:var(--ink);font-family:var(--font-body);font-size:13px;line-height:1.6;padding:11px 12px;resize:vertical;min-height:130px}
  .cw-note textarea:focus{outline:none;border-color:var(--brand);background:var(--surface)}
  .cw-note-foot{display:flex;justify-content:space-between;align-items:center;margin-top:5px;font-size:10.5px;color:var(--muted)}
  .cw-note-status.saving{color:var(--muted)}
  .cw-note-status.saved{color:var(--ok)}
  .cw-note-status.err{color:var(--brand-deep)}

  /* saved-kundli picker (inside Birth Details) */
  .cw-picker{border-top:1px solid var(--line);margin-top:14px;padding-top:13px}
  .cw-picker.hidden{display:none}
  .cw-picker-head{display:flex;gap:7px;align-items:center;margin-bottom:9px}
  .cw-search{flex:1;min-width:0;border:1px solid var(--line-strong);border-radius:999px;background:var(--surface-2);padding:8px 13px;font-size:12.5px;font-family:inherit;color:var(--ink)}
  .cw-search:focus{outline:none;border-color:var(--brand);background:var(--surface)}
  .cw-picker-close{appearance:none;border:0;background:var(--surface-2);width:27px;height:27px;border-radius:50%;font-size:16px;line-height:1;color:var(--muted);cursor:pointer;flex:0 0 auto}
  .cw-picker-filters{display:flex;gap:5px;margin-bottom:9px;flex-wrap:wrap}
  .cw-chip{appearance:none;border:1px solid var(--line-strong);background:transparent;color:var(--muted);font-family:var(--font-body);font-size:11px;font-weight:700;padding:5px 10px;border-radius:999px;cursor:pointer}
  .cw-chip.on{background:var(--sel);color:var(--on-sel);border-color:transparent}
  /* The rows lift by 1px on hover. With no padding the first row's top border
     moves to y = -1 inside an overflow:auto box and is clipped away, so the
     top edge simply vanished under the pointer. Two pixels of room on each
     side leaves the lift somewhere to go; the negative margin keeps the list
     sitting exactly where it did before. */
  #cwPickerList{max-height:320px;overflow-y:auto;padding:2px 2px 2px;margin:-2px -2px 0}
  .cw-empty{color:var(--muted);font-size:12.5px;text-align:center;padding:16px 8px;line-height:1.55}
  /* ---- saved-kundli rows -------------------------------------------------
     Rows are the whole product surface for someone with 80 charts saved, so
     they get real hierarchy: name, then birth line, then tags. Destructive and
     edit actions stay hidden until hover or keyboard focus — visible on touch,
     where there is no hover to reveal them. */
  /* the picker wears the same register as the account list — see the note on
     .acct-item above. It keeps its own star button, which was already a real
     control rather than a character in the name. */
  .cw-row{
    position:relative;display:flex;align-items:flex-start;gap:11px;
    padding:11px 12px 11px 18px;margin-bottom:2px;cursor:pointer;
    background:transparent;border:0;border-radius:var(--r-sm);
    transition:background .16s ease}
  .cw-row::before{
    content:"";position:absolute;left:6px;top:11px;bottom:11px;width:2px;border-radius:2px;
    background:var(--line-strong);transition:background .16s ease,top .16s ease,bottom .16s ease}
  .cw-row + .cw-row{box-shadow:inset 0 1px 0 var(--line)}
  .cw-row:hover{background:var(--surface-2)}
  .cw-row:hover::before{background:var(--brand);top:7px;bottom:7px}
  .cw-row:focus-visible{outline:2px solid var(--sel);outline-offset:-2px;border-radius:var(--r-sm)}
  .cw-row.is-open::before{background:var(--sel);top:5px;bottom:5px}
  .cw-row.is-open{background:var(--surface-2)}
  .cw-row-star{flex:0 0 auto;appearance:none;border:0;background:none;padding:2px;
    margin-top:1px;cursor:pointer;color:var(--line-strong);line-height:0;transition:.15s}
  .cw-row-star svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8}
  .cw-row-star:hover{transform:scale(1.15);color:var(--gold)}
  .cw-row-star.on{color:var(--gold)}
  .cw-row:has(.cw-row-star.on)::before{background:var(--gold)}
  .cw-row-star.on svg{fill:currentColor}
  .cw-row-info{flex:1;min-width:0}
  .cw-row-name{font-family:var(--font-display);font-weight:600;font-size:14px;
    letter-spacing:-.012em;line-height:1.25;color:var(--ink);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .cw-row-meta{font-family:var(--font-mono);font-size:10.5px;color:var(--muted);
    letter-spacing:.045em;margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .cw-row-tags{display:flex;gap:5px;flex-wrap:nowrap;overflow:hidden;margin-top:7px}
  .cw-row-acts{flex:0 0 auto;display:flex;gap:2px;opacity:0;transition:opacity .16s;padding-top:1px}
  .cw-row:hover .cw-row-acts,
  .cw-row:focus-within .cw-row-acts{opacity:1}
  @media(hover:none){ .cw-row-acts{opacity:1} }
  .cw-row-act{appearance:none;border:0;background:none;color:var(--muted);
    width:28px;height:28px;border-radius:7px;cursor:pointer;display:grid;place-items:center;
    transition:.13s}
  .cw-row-act svg{width:15px;height:15px}
  .cw-row-act:hover{background:var(--surface-3);color:var(--ink)}
  .cw-row-act.del:hover{background:var(--brand-soft);color:var(--brand-deep)}
  /* inline rename, so a typo does not require reopening the whole chart */
  .cw-rename{width:100%;border:1px solid var(--brand);border-radius:6px;
    background:var(--surface);color:var(--ink);font-family:var(--font-display);font-weight:600;
    font-size:14px;letter-spacing:-.012em;padding:3px 7px}
  .cw-rename:focus{outline:none}
  .cw-rename:disabled{opacity:.6}

  /* ---- toast with an action ----------------------------------------------
     epToast is pointer-events:none and text-only, so it cannot host an Undo
     button. This is its interactive sibling. The hairline drains to show how
     long the undo window has left — transform-only, so it survives a busy
     main thread and never disagrees with the timer that actually fires. */
  .kt{position:fixed;left:50%;bottom:26px;transform:translate(-50%,14px);z-index:400;
    max-width:min(460px,calc(100vw - 32px));display:flex;align-items:center;gap:12px;
    overflow:hidden;font-family:var(--font-body);font-weight:500;
    padding:12px 12px 12px 18px;border-radius:12px;
    background:color-mix(in srgb,var(--ink) 90%,transparent);color:var(--surface);
    font-size:13px;line-height:1.45;box-shadow:var(--sh-3);
    backdrop-filter:blur(7px);-webkit-backdrop-filter:blur(7px);
    opacity:0;pointer-events:none;transition:opacity .22s ease,transform .22s ease}
  .kt.show{opacity:1;transform:translate(-50%,0);pointer-events:auto}
  .kt-msg{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .kt-act{appearance:none;border:0;background:none;color:var(--gold);
    font-family:inherit;font-size:12px;font-weight:700;letter-spacing:.06em;
    text-transform:uppercase;cursor:pointer;padding:5px 8px;border-radius:7px;flex:0 0 auto}
  .kt-act:hover{background:rgba(255,255,255,.12)}
  .kt-bar{position:absolute;left:0;bottom:0;height:2px;width:100%;background:var(--gold);
    opacity:.55;transform-origin:left center;animation:kt-drain linear forwards}
  @keyframes kt-drain{to{transform:scaleX(0)}}
  @media(prefers-reduced-motion:reduce){
    .kt{transition-duration:.01ms}
    .cw-row:hover{transform:none}
    .kt-bar{animation:none}
  }
  /* ===== ACCOUNT ==========================================================
     Restyled to read as a settings surface rather than a dialog: a quiet
     identity band, one tab rail, and cards with real hierarchy. Every element
     id is unchanged, so acLoadSub and acRenderCharts keep working untouched. */
  .acct-modal{position:fixed;inset:0;z-index:380;background:rgba(20,10,40,.55);
    backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
    display:flex;align-items:center;justify-content:center;padding:20px;overflow-y:auto}
  .acct-modal.hidden{display:none}
  .acct-card{position:relative;background:var(--surface);border:1px solid var(--line);
    border-radius:var(--r-lg);max-width:460px;width:100%;padding:0 24px 24px;
    box-shadow:var(--sh-3);animation:pwIn .3s cubic-bezier(.34,1.4,.64,1);
    max-height:88vh;overflow-y:auto;overflow-x:hidden}
  .acct-close{position:absolute;top:14px;right:14px;z-index:2;appearance:none;border:0;
    background:var(--surface);width:30px;height:30px;border-radius:50%;font-size:17px;
    line-height:1;color:var(--muted);cursor:pointer;transition:.15s;
    box-shadow:0 1px 4px rgba(35,10,77,.14)}
  .acct-close:hover{color:var(--ink);transform:rotate(90deg)}

  /* ---- identity band ---- */
  .acct-hero{position:relative;display:flex;align-items:center;gap:14px;
    margin:0 -24px 20px;padding:26px 24px 20px;
    background:
      radial-gradient(420px 150px at 12% -30%, var(--gold-soft), transparent 70%),
      radial-gradient(360px 140px at 88% -10%, var(--brand-soft), transparent 70%),
      var(--surface-2);
    border-bottom:1px solid var(--line);flex-wrap:wrap}
  .acct-hero::after{content:"";position:absolute;left:24px;right:24px;bottom:-1px;height:2px;
    border-radius:2px;background:linear-gradient(90deg,var(--brand),var(--gold),transparent)}
  .acct-avatar{flex:0 0 auto;width:54px;height:54px;border-radius:50%;
    background:var(--fill-strong);color:var(--on-strong);display:grid;place-items:center;
    font-family:var(--font-display);font-weight:700;font-size:21px;text-transform:uppercase;
    box-shadow:0 0 0 3px var(--surface),0 0 0 4px var(--gold),0 8px 20px -8px rgba(35,10,77,.5)}
  .acct-who{min-width:0;flex:1;flex:1 1 auto}
  .acct-name{font-family:var(--font-display);font-weight:700;font-size:17px;color:var(--ink);
    letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .acct-email{font-family:var(--font-mono);font-size:11.5px;color:var(--muted);margin-top:2px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .acct-plan{/* It used to be flex:0 0 auto, which never shrinks — so a long plan name
     such as "Personal Mentorship Program — instalment" took the whole row and
     crushed the person's own name to a single letter. The name matters more
     than the label, so the label yields first and truncates. */
  flex:0 1 auto;min-width:0;max-width:46%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:9.5px;font-weight:700;
    text-transform:uppercase;letter-spacing:.12em;color:var(--gold);
    background:var(--gold-soft);border:1px solid rgba(180,131,42,.28);
    padding:4px 10px;border-radius:99px;white-space:nowrap}
  .acct-plan:empty{display:none}

  /* ---- tab rail ---- */
  .acct-tabs{display:flex;gap:4px;background:var(--surface-2);padding:4px;
    border:1px solid var(--line);border-radius:999px;margin-bottom:18px}
  .acct-tab{flex:1;appearance:none;border:0;background:none;font-family:var(--font-body);
    font-size:12.5px;font-weight:700;color:var(--muted);padding:9px 6px;border-radius:999px;
    cursor:pointer;transition:.18s;white-space:nowrap}
  .acct-tab:hover{color:var(--ink)}
  .acct-tab.on{background:var(--fill-strong);color:var(--on-strong);
    box-shadow:0 2px 8px -2px rgba(35,10,77,.45)}
  .acct-tab.hidden{display:none}
  .acct-panel.hidden{display:none}

  /* ---- subscription card ---- */
  .acct-status{position:relative;overflow:hidden;background:var(--surface-2);
    border:1px solid var(--line);border-radius:var(--r);padding:18px;margin-bottom:14px}
  /* The status card fetches /api/status before it can say anything true. Until
     it answers, show the shape of the answer rather than stale or blank values. */
  .acct-skel{display:none;flex-direction:column;gap:12px}
  .acct-status.loading .acct-skel{display:flex}
  .acct-status.loading .acct-status-top,
  .acct-status.loading .acct-until,
  .acct-status.loading .acct-bar,
  .acct-status.loading .acct-left{display:none}
  .acct-skel span{position:relative;overflow:hidden;display:block;background:var(--surface-3);border-radius:99px}
  .acct-skel .skl-pill{width:82px;height:22px}
  .acct-skel .skl-line{height:14px;border-radius:6px}
  .acct-skel .skl-line.lg{width:72%}
  .acct-skel .skl-line.sm{width:44%;height:11px}
  .acct-skel .skl-bar{height:8px}
  .acct-skel span::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
    background:linear-gradient(90deg,transparent,var(--line-strong),transparent);
    animation:orb-sheen 1.5s ease-in-out infinite;will-change:transform}
  .acct-skel span:nth-child(2)::after{animation-delay:.12s}
  .acct-skel span:nth-child(3)::after{animation-delay:.24s}
  .acct-skel span:nth-child(4)::after{animation-delay:.36s}
  @media(prefers-reduced-motion:reduce){ .acct-skel span::after{animation:none} }
  .acct-status-top{display:flex;align-items:center;justify-content:space-between;
    gap:10px;margin-bottom:12px}
  .acct-pill{display:inline-flex;align-items:center;gap:6px;font-size:10.5px;font-weight:700;
    letter-spacing:.09em;text-transform:uppercase;font-family:var(--font-mono);
    padding:5px 12px;border-radius:999px}
  .acct-pill::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
  .acct-pill.on{background:rgba(31,138,91,.14);color:var(--ok)}
  .acct-pill.off{background:var(--brand-soft);color:var(--brand-deep)}
  /* The date was the headline and the days left a mono footnote, which is
     backwards: nobody memorises 18 Jan 2027, they want to know how long they
     have. The number now leads at display size with its unit beside it, the
     date reads as the caption underneath, and the bar is a quiet 4px rule at
     the foot rather than a wide green slab through the middle. */
  .acct-left{font-family:var(--font-display);font-size:30px;font-weight:700;
    letter-spacing:-.02em;color:var(--ink);line-height:1;margin:14px 0 5px}
  .acct-left .acct-left-u{font-size:14px;font-weight:600;color:var(--muted);
    letter-spacing:0;margin-left:7px}
  .acct-until{font-family:var(--font-body);font-size:12.5px;font-weight:500;
    letter-spacing:0;color:var(--muted);line-height:1.4;margin-bottom:14px}
  .acct-bar{height:4px;border-radius:99px;background:var(--line);
    overflow:hidden;margin-bottom:0;box-shadow:none}
  .acct-bar-fill{height:100%;border-radius:99px;transition:width .6s cubic-bezier(.3,.8,.4,1);
    background:var(--ok)}
  .acct-bar-fill.low{background:var(--brand)}

  /* ---- controls ---- */
  .acct-btn{width:100%;appearance:none;border:0;background:var(--fill-strong);
    color:var(--on-strong);font-family:var(--font-body);font-weight:700;font-size:13.5px;
    padding:13px;border-radius:999px;cursor:pointer;transition:.16s;
    box-shadow:0 4px 14px -6px rgba(35,10,77,.6)}
  .acct-btn:hover{transform:translateY(-1px);box-shadow:0 8px 20px -8px rgba(35,10,77,.7)}
  .acct-btn:active{transform:none}
  .acct-btn:disabled{opacity:.45;cursor:default;transform:none;box-shadow:none}
  .acct-btn-sm{width:auto;padding:9px 16px;font-size:12.5px}
  .acct-msg{font-size:12.5px;line-height:1.5;margin:12px 0 0;min-height:1em;color:var(--muted)}
  .acct-msg:empty{margin:0;min-height:0}
  /* A state, not a sentence adrift: quiet surface, a mark to read at a glance,
     and the same radius as everything else on the panel. */
  .acct-msg.ok,.acct-msg.warn,.acct-msg.err{
    display:flex;align-items:flex-start;gap:8px;
    padding:10px 13px;border-radius:10px;font-weight:500;
    border:1px solid transparent;
  }
  .acct-msg.ok::before,.acct-msg.warn::before,.acct-msg.err::before{
    flex:0 0 auto;font-size:12px;line-height:1.35;
  }
  .acct-msg.ok{color:var(--ok);background:color-mix(in srgb,var(--ok) 9%,transparent);
    border-color:color-mix(in srgb,var(--ok) 22%,transparent)}
  .acct-msg.ok::before{content:"\2713"}
  .acct-msg.warn{color:var(--brand-deep);background:var(--brand-soft);
    border-color:color-mix(in srgb,var(--brand) 26%,transparent)}
  .acct-msg.warn::before{content:"\21BB"}
  .acct-msg.err{color:var(--brand-deep);background:var(--brand-soft);
    border-color:color-mix(in srgb,var(--brand) 26%,transparent)}
  .acct-msg.err::before{content:"\21BB"}

  .acct-lbl{display:block;font-family:var(--font-mono);font-size:10px;font-weight:500;
    letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:0 0 6px}
  .acct-in{width:100%;padding:11px 13px;border:1px solid var(--line-strong);border-radius:10px;
    background:var(--surface-2);color:var(--ink);font-size:14px;font-family:inherit;
    margin-bottom:15px;transition:.15s}
  .acct-in:focus{outline:none;border-color:var(--brand);background:var(--surface);
    box-shadow:0 0 0 3px var(--brand-soft)}

  /* ---- saved charts ---- */
  .acct-searchwrap{position:relative;margin-bottom:10px}
  .acct-searchwrap svg{position:absolute;left:14px;top:50%;transform:translateY(-50%);
    width:15px;height:15px;color:var(--muted);pointer-events:none}
  .acct-search{width:100%;border:1px solid var(--line-strong);border-radius:999px;
    background:var(--surface-2);padding:10px 15px 10px 37px;font-size:13px;
    font-family:inherit;color:var(--ink);transition:.15s}
  .acct-search:focus{outline:none;border-color:var(--brand);background:var(--surface);
    box-shadow:0 0 0 3px var(--brand-soft)}
  .acct-filters{display:flex;gap:5px;margin-bottom:12px;flex-wrap:wrap}
  .acct-chip{appearance:none;border:1px solid var(--line-strong);background:transparent;
    color:var(--muted);font-family:var(--font-body);font-size:11px;font-weight:700;
    padding:6px 12px;border-radius:999px;cursor:pointer;transition:.15s}
  .acct-chip:hover{border-color:var(--brand);color:var(--ink)}
  .acct-chip.on{background:var(--sel);color:var(--on-sel);border-color:transparent}
  .acct-save-row{display:flex;align-items:center;justify-content:space-between;
    gap:10px;margin-bottom:10px}
  /* This is how much of a paid allowance has been used. As 10.5px uppercase
     mono it read as a debug label; the figure is worth seeing, and the bar
     answers "how much room is left" without anybody doing the division. */
  .acct-change{display:flex;align-items:center;justify-content:center;gap:8px;
    width:100%;margin:14px 0 0;padding:12px 16px;cursor:pointer;
    border-radius:11px;border:1px solid var(--line-strong);background:var(--surface);
    font-family:inherit;font-size:13.5px;font-weight:600;color:var(--ink);
    transition:border-color .18s ease,background .18s ease,transform .18s ease}
  .acct-change:hover{border-color:var(--brand);background:var(--brand-soft);transform:translateY(-1px)}
  .acct-change:active{transform:translateY(0)}
  /* The chevron turns to point down once the plans are open, so the button
     shows its own state rather than relying on the label alone. */
  .acct-change::after{content:"";width:7px;height:7px;flex:0 0 auto;
    border-right:2px solid currentColor;border-bottom:2px solid currentColor;
    transform:rotate(-45deg) translate(-1px,-1px);
    transition:transform .2s ease}
  .acct-change.open::after{transform:rotate(45deg) translate(-2px,-2px)}
  @media(prefers-reduced-motion:reduce){
    .acct-change,.acct-change::after{transition:none}
    .acct-change:hover{transform:none}
  }
  .acct-plans{margin:12px 0 0}
  .acct-plans-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:8px}
  /* width:100% is load-bearing. These tiles are <button> elements, and a form
     control in a grid resolves justify-self:normal to START rather than
     STRETCH — so the tracks were full width while the buttons sat at 93px
     inside them, floating left of centre in their own row. */
  /* margin:0 is load-bearing too. Some broader button rule on this page sets
     a left margin, which pushed each tile 66px inside its own grid track — the
     tracks were correct, the buttons were not sitting in them. */
  .acct-tier{width:100%;box-sizing:border-box;margin:0;padding:12px 12px 11px;border-radius:12px;cursor:pointer;text-align:left;
    background:var(--surface-2);border:1px solid var(--line);color:var(--ink-body);
    font-family:inherit;transition:border-color .16s,background .16s,color .16s}
  .acct-tier:hover{border-color:var(--line-strong);background:var(--surface-3)}
  /* Keyboard users get the same "which one is chosen" signal mouse users do. */
  .acct-tier:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
  .acct-tier.on{border-color:var(--brand);background:var(--brand-soft);color:var(--ink);
    box-shadow:inset 0 0 0 1px var(--brand)}
  .acct-tier b{display:block;font-size:12.5px;font-weight:600;line-height:1.25;color:var(--ink)}
  /* The price is the thing the tile exists to communicate, so it is the
     largest element on it rather than a grey footnote under the name. Mono
     because these are figures people compare against each other digit by
     digit, and a proportional face makes that harder than it needs to be. */
  .acct-tier span{display:block;font-family:var(--font-mono);font-size:16px;font-weight:600;
    line-height:1.2;letter-spacing:-.02em;font-variant-numeric:tabular-nums;
    color:var(--ink);margin-top:6px}
  .acct-tier em{display:inline-block;font-family:var(--font-mono);font-size:11px;font-style:normal;
    color:var(--muted);text-decoration:line-through;margin-top:3px}
  /* The plan in force is marked, not disabled: renewing it is the commonest
     thing somebody opens this picker to do. */
  .acct-tier.current{border-style:dashed}
  .acct-tier.isup::after,.acct-tier.current::after{content:attr(data-cur);display:block;
    font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;
    text-transform:uppercase;margin-top:7px}
  .acct-tier.isup::after{color:var(--brand)}
  .acct-tier.current::after{color:var(--muted)}
  .acct-tier.current.on{border-style:solid}

  /* A duration meter on each tile.

     These plans are lengths of time, so the tile shows length: the bar is the
     term as a fraction of a year. It encodes the one attribute the price is
     being weighed against, which is why it earns the space — a decorative
     rule here would not. */
  .acct-tier-bar{margin-top:9px;height:3px;border-radius:2px;background:var(--line);overflow:hidden}
  .acct-tier-bar>i{display:block;height:100%;background:var(--muted);opacity:.45;
    transition:background .16s,opacity .16s}
  .acct-tier.on .acct-tier-bar>i{background:var(--gold);opacity:1}
  .acct-tier-days{display:block;font-size:11px;line-height:1.4;color:var(--muted);margin-top:7px}

  /* The term being bought, drawn rather than described.

     Extending and upgrading are the two things people confuse here: one adds
     days to what is left, the other converts those days to money and starts
     again from today. A sentence saying so is easy to skim past. Two segments
     against one is not. Gold is the gained time throughout — the same gold
     that marks the credit in the ledger below, so the eye connects them.

     The labels sit UNDER the bar, not inside it. Inside, they were 9.5px mono
     centred in a coloured block, truncating with an ellipsis on the narrow
     segment and leaving the tightest contrast pair in the panel carrying the
     smallest type in it. A bar that only has to be a measure can be thin and
     clean; the words get set at a size somebody can actually read. */
  .acct-term{margin:14px 0 0}
  .acct-term-track{display:flex;gap:2px;height:10px;border-radius:999px;overflow:hidden;
    background:var(--surface-3)}
  .acct-term-seg{min-width:5px}
  .acct-term-seg.have{background:var(--muted);opacity:.5}
  .acct-term-seg.gain{background:var(--gold)}
  .acct-term-key{display:flex;flex-wrap:wrap;gap:5px 18px;margin:11px 0 0}
  .acct-term-key span{display:flex;align-items:center;gap:8px;
    font-size:12.5px;line-height:1.5;color:var(--ink-body)}
  .acct-term-key span::before{content:"";width:8px;height:8px;border-radius:3px;
    flex:0 0 auto;background:var(--gold)}
  .acct-term-key span.have::before{background:var(--muted);opacity:.5}
  .acct-term-foot{margin:10px 0 0;font-size:12px;line-height:1.55;color:var(--muted)}
  .acct-term-foot b{display:block;font-weight:500;color:var(--ink-body);margin-top:3px}

  /* The arithmetic, shown rather than asserted.

     A struck-through ₹17,999 next to ₹6,460 asks somebody to take the
     difference on trust. Laying out list price, credit and amount due lets
     them check it — the same reason the tax invoice itemises its discount
     instead of just printing a lower total. */
  .acct-sum{margin:12px 0 0;padding:12px 13px;border-radius:12px;
    background:var(--surface-2);border:1px solid var(--line)}
  .acct-sum:empty{display:none}
  .acct-sum-row{display:flex;align-items:baseline;justify-content:space-between;gap:14px;
    font-size:12.5px;line-height:1.7;color:var(--muted)}
  .acct-sum-row b{font-weight:500;color:var(--ink-body);min-width:0}
  /* tabular-nums so the rupee figures line up digit over digit down the
     column. Proportional numerals make a three-line total look ragged. */
  .acct-sum-row i{font-family:var(--font-mono);font-style:normal;font-size:12.5px;
    font-variant-numeric:tabular-nums;color:var(--ink-body);white-space:nowrap}
  .acct-sum-row.credit b{color:var(--ink)}
  .acct-sum-row.credit i{color:var(--gold)}
  .acct-sum-row.due{margin-top:9px;padding-top:10px;border-top:1px solid var(--line)}
  .acct-sum-row.due b{font-size:13.5px;font-weight:600;color:var(--ink)}
  .acct-sum-row.due i{font-size:20px;font-weight:700;letter-spacing:-.02em;color:var(--ink)}
  /* The money action carries the brand colour. It is the one place in this
     panel that gets to be loud. */
  .acct-btn.pay{background:var(--brand);color:#fff}
  .acct-btn.pay:hover{box-shadow:0 8px 20px -8px var(--brand)}
  .acct-plans-note{margin:9px 0 0;font-size:11.5px;line-height:1.5;color:var(--muted)}
  /* A locked section reads as locked rather than simply not working. */
  .jt-locked{opacity:.42;position:relative}
  /* One backslash, not two. A CSS escape needs \1F512; the doubled form is a
     literal backslash followed by the text "1F512", which is exactly what the
     tabs were printing. Same mistake I made on the account panel's tick.

     A space after the code point terminates it — without one, a following hex
     digit would be swallowed into the escape. */
  .jt-locked::after{content:"\1F512 ";font-size:9px;margin-left:5px;opacity:.8}
  .acct-bill-slot{margin-top:12px}
  .acct-bill-slot:empty{display:none}
  .acct-bill-slot .pw-bill{margin:0;padding-top:12px;border-top:1px solid var(--line)}
  .acct-bill-slot .pw-bill-note{font-size:11px;line-height:1.45}
  @media(max-width:560px){
    .acct-plans-row{grid-template-columns:1fr 1fr;gap:7px}
    .acct-tier{padding:11px 10px 10px}
    .acct-tier span{font-size:15px}
    .acct-sum-row.due i{font-size:18px}
    .acct-plans-note{font-size:11px}
  }
  .acct-count{display:flex;align-items:center;gap:10px;width:100%;
    font-family:var(--font-body);font-size:12.5px;letter-spacing:0;
    text-transform:none;color:var(--muted);font-weight:500}
  .acct-count .acct-count-n{
    font-family:var(--font-display);font-size:16px;font-weight:700;
    color:var(--ink);letter-spacing:-.01em;line-height:1;
  }
  .acct-count .acct-count-txt{flex:0 0 auto}
  .acct-count .acct-count-bar{
    flex:1 1 auto;min-width:60px;max-width:180px;height:4px;border-radius:999px;
    background:var(--line);overflow:hidden;
  }
  .acct-count .acct-count-fill{
    display:block;height:100%;border-radius:999px;background:var(--brand);
    transition:width .3s ease,background .3s ease;
  }
  /* Nearly full is worth noticing before saving fails. */
  .acct-count.near .acct-count-fill{background:var(--gold)}
  .acct-count.full .acct-count-fill{background:var(--brand-deep)}
  @media(max-width:520px){ .acct-count .acct-count-bar{display:none} }
  /* The cards lift and cast a shadow on hover, and this scrolls — so it needs
     room on every side or the first card's top edge is sliced off. Padding in,
     the same amount pulled back out with margin, so nothing shifts. */
  #acctChartList{max-height:min(52vh,420px);overflow-y:auto;margin:-6px;padding:6px}

  /* Rows match the saved-kundli picker exactly — same object, same treatment,
     so moving between the two surfaces does not feel like two products. */
  /* ---- saved kundlis ------------------------------------------------------
     A practitioner's client book was reading as a file list: every entry an
     identical bordered box, the name in bold sans at the same weight as
     everything near it, tags as pink pills, notes in italic. Four changes,
     and only the first is loud. The same treatment is applied to the in-chart
     picker below, so the two surfaces are recognisably one thing.

     A brass spine instead of a box. A register is read down its edge; the
     spine gives the column a rule to hang from, and it is where a starred
     entry announces itself — so the star stops being a "*" glued to the front
     of somebody's name.

     Real hierarchy. The name moves to the display face at 15px; the birth
     line keeps mono but gains tracking and loses contrast, so the two stop
     competing. Date, time and place ARE the record, and mono is the same
     instrument language the charts themselves are set in.

     Tags become engraved labels — hairline, mono, letterspaced — instead of
     pills that read like unread counts.

     Notes go into Caveat, already loaded for the footer. A note on a client
     record is the astrologer's own hand and should look like it; italic sans
     looked like a system field. */
  /* A saved kundli is a record somebody paid for; a hairline spine and a
     truncated mono line read as a debug listing. Each is now a card with a
     medallion to scan down, real surface and a hover it responds to. */
  .acct-item{
    position:relative;display:flex;align-items:center;gap:13px;
    padding:13px 15px;margin-bottom:8px;
    background:var(--surface);border:1px solid var(--line);border-radius:12px;
    transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease;
  }
  .acct-item:hover{border-color:var(--line-strong);box-shadow:var(--sh-1);transform:translateY(-1px)}
  .acct-item-av{
    flex:none;align-self:flex-start;width:38px;height:38px;border-radius:11px;
    display:flex;align-items:center;justify-content:center;
    font-family:var(--font-display);font-weight:700;font-size:16px;line-height:1;
    color:var(--brand);background:var(--brand-soft);
    border:1px solid transparent;transition:border-color .16s ease;
  }
  .acct-item:hover .acct-item-av{border-color:var(--brand)}
  /* Starred shows on the medallion rather than as a stray spine colour. */
  .acct-item.starred .acct-item-av{color:var(--gold);background:var(--gold-soft)}
  .acct-item.starred .acct-item-av::after{
    content:"";position:absolute;margin:-26px 0 0 26px;width:7px;height:7px;
    border-radius:50%;background:var(--gold);box-shadow:0 0 0 2px var(--surface);
  }
  .acct-item-info{flex:1;min-width:0}
  .acct-item-name{
    font-family:var(--font-display);font-weight:700;color:var(--ink);
    font-size:15.5px;letter-spacing:-.012em;line-height:1.3;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  /* wraps instead of truncating — the row grows, the place stays readable */
  .acct-item-meta{
    display:flex;flex-direction:column;gap:2px;margin-top:3px;
    font-size:11.5px;color:var(--muted);min-width:0;
  }
  /* Same family and size as the place beneath it. Mono digits next to a
     proportional place name read as two different systems bolted together;
     the distinction that matters is emphasis, so that is carried by colour
     alone. */
  .acct-item-meta .mi-when{
    font-family:var(--font-body);font-size:12px;letter-spacing:0;
    color:var(--muted);white-space:nowrap;font-weight:500;
  }
  .acct-item-meta .mi-where{
    font-family:var(--font-body);font-size:12px;letter-spacing:0;
    color:var(--ink-2);font-weight:500;line-height:1.35;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    overflow:hidden;overflow-wrap:anywhere;
  }
  .acct-item-meta i,.cw-row-meta i{font-style:normal;opacity:.4;padding:0 5px}
  /* On a phone there is not room for the details and three buttons side by
     side. The info column was squeezed until the name truncated to two
     letters and the nowrap timestamp slid out underneath the buttons — text
     printed over controls. The actions take their own line instead, indented
     to the text so the card still reads as one block. */
  @media(max-width:560px){
    .acct-item{flex-wrap:wrap;padding:14px 15px}
    .acct-item-info{flex:1 1 auto;min-width:0}
    .acct-item-btns{flex:1 0 100%;opacity:1;justify-content:flex-start;
      margin:11px 0 0 51px;padding-top:11px;border-top:1px solid var(--line)}
    .acct-item-btns .acct-mini{flex:1 1 auto;text-align:center;padding:9px 6px}
  }
  /* belt and braces: nothing in the meta may spill past its column */
  .acct-item-meta{overflow:hidden}
  .acct-item-tags{display:flex;gap:5px;flex-wrap:wrap;margin-top:8px}
  .acct-item-tag,.cw-row-tag{
    font-family:var(--font-mono);font-size:9px;font-weight:500;
    letter-spacing:.13em;text-transform:uppercase;
    color:var(--gold);background:transparent;
    border:1px solid var(--gold-soft);padding:3px 8px;border-radius:3px;white-space:nowrap;
  }
  .acct-item-note,.cw-row-note{
    font-family:'Caveat','Tiro Devanagari Hindi',cursive;
    font-size:14.5px;line-height:1.3;color:var(--ink-body);opacity:.72;
    margin-top:7px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .acct-item-btns{display:flex;align-items:center;gap:6px;flex:0 0 auto;align-self:center;
    opacity:0;transition:opacity .16s}
  .acct-item:hover .acct-item-btns,
  .acct-item:focus-within .acct-item-btns{opacity:1}
  @media(hover:none){ .acct-item-btns{opacity:1} }
  .acct-mini{
    appearance:none;border:1px solid var(--line-strong);background:transparent;
    color:var(--ink-body);font-family:var(--font-mono);font-size:9.5px;font-weight:500;
    letter-spacing:.13em;text-transform:uppercase;
    padding:7px 12px;border-radius:5px;cursor:pointer;transition:.14s;
  }
  .acct-mini:hover{border-color:var(--brand);color:var(--brand);background:var(--surface)}
  .acct-mini.del{border-color:transparent;color:var(--muted)}
  .acct-mini.del:hover{border-color:var(--brand);color:var(--brand-deep);background:var(--brand-soft)}
  .acct-empty{color:var(--muted);font-size:13px;text-align:center;padding:26px 8px;line-height:1.6}
  @media(prefers-reduced-motion:reduce){ .acct-item,.acct-item::before,.acct-item-btns{transition:none} }

  /* ---- sub-sections inside a tab ---- */
  .acct-sec{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
  .acct-sec.danger{border-top-color:rgba(215,46,71,.3)}
  .acct-h4{font-family:var(--font-display);font-size:13.5px;font-weight:700;color:var(--ink);margin:0 0 4px}
  .acct-sec.danger .acct-h4{color:var(--brand-deep)}
  .acct-sub{font-size:11.5px;line-height:1.5;color:var(--muted);margin:0 0 12px}
  .acct-row2{display:flex;gap:8px}
  .acct-btn2{flex:1;appearance:none;border:1px solid var(--line-strong);background:var(--surface);
    color:var(--ink);font-family:inherit;font-size:12.5px;font-weight:700;padding:10px 12px;
    border-radius:999px;cursor:pointer;transition:.15s}
  .acct-btn2:hover{border-color:var(--brand);background:var(--surface-2)}
  a.acct-btn2{display:inline-flex;align-items:center;justify-content:center;text-decoration:none;color:inherit}
  .acct-btn2:disabled{opacity:.45;cursor:default}
  .acct-btn2.wide{width:100%;flex:none}
  .acct-btn2.del{color:#fff;background:var(--brand);border-color:transparent}
  .acct-btn2.del:hover{background:var(--brand-deep)}
  .acct-link{appearance:none;border:0;background:none;color:var(--brand-deep);font-family:inherit;
    font-size:11.5px;font-weight:700;cursor:pointer;padding:0;text-decoration:underline}

  /* ---- invoices ---- */
  .acct-inv{display:flex;align-items:center;gap:10px;border:1px solid var(--line);
    border-radius:var(--r-sm);padding:11px 12px;margin-bottom:6px;background:var(--surface)}
  .acct-inv-info{flex:1;min-width:0}
  .acct-inv-top{font-weight:700;font-size:13px;color:var(--ink)}
  .acct-inv-meta{font-family:var(--font-mono);font-size:10.5px;color:var(--muted);margin-top:2px}
  .acct-meter-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px}
  .acct-meter-num{font-family:var(--font-mono);font-size:11px;color:var(--muted)}

  /* ---- trash ---- */
  .acct-trash{display:flex;align-items:center;gap:10px;border:1px dashed var(--line-strong);
    border-radius:var(--r-sm);padding:9px 11px;margin-bottom:6px}
  .acct-trash-info{flex:1;min-width:0}
  .acct-trash-name{font-weight:700;font-size:12.5px;color:var(--ink);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .acct-trash-meta{font-family:var(--font-mono);font-size:10px;color:var(--muted);margin-top:1px}

  /* Printable invoice: opened in its own window, so it must carry its own
     styling rather than inherit the app's theme variables. */
  #prefStyle button{font-size:12px}

  @media(max-width:460px){
    .acct-card{padding:0 18px 18px;border-radius:var(--r)}
    .acct-hero{margin:0 -18px 18px;padding:24px 18px 18px;gap:12px}
    .acct-hero::after{left:18px;right:18px}
    .acct-avatar{width:46px;height:46px;font-size:18px}
    .acct-until{font-size:18px}
    .acct-plan{order:3;margin-left:66px}
    .acct-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch}
    .acct-tab{flex:0 0 auto;padding:9px 12px}
    .acct-row2{flex-direction:column}
  }
  @media(prefers-reduced-motion:reduce){
    .acct-item:hover,.acct-btn:hover{transform:none}
    .acct-close:hover{transform:none}
  }

  /* ===== Paywall ===== */
  .pw-modal{position:fixed;inset:0;z-index:400;padding:16px;background:rgba(20,10,40,.72);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;padding:20px;overflow-y:auto}
  .pw-modal.hidden{display:none}
  .pw-card{position:relative;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);max-width:400px;width:100%;padding:26px 22px;max-height:calc(100dvh - 32px);overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;text-align:center;box-shadow:var(--sh-3);animation:pwIn .32s cubic-bezier(.34,1.4,.64,1)}
  @keyframes pwIn{from{transform:translateY(10px) scale(.97);opacity:0}to{transform:none;opacity:1}}
  .pw-seal{width:52px;height:52px;margin:0 auto 15px;display:grid;place-items:center;border-radius:50%;background:var(--brand-soft);color:var(--brand-deep)}
  .pw-seal svg{width:26px;height:26px}
  .pw-card h3{margin:0 0 7px;font-family:var(--font-display);font-size:19px;color:var(--ink);letter-spacing:-.01em}
  .pw-sub{margin:0 0 18px;font-size:13.5px;color:var(--muted);line-height:1.55}
  .pw-price{display:flex;align-items:baseline;justify-content:center;gap:6px;margin-bottom:18px}
  .pw-plan-excl{display:block;font-size:10.5px;line-height:1.35;color:var(--muted);margin-top:5px;opacity:.85}
  .pw-plan-tax{display:block;font-size:10.5px;color:var(--muted);margin-top:2px;line-height:1.4}
  /* The bar floats above the page, so the footer needs room to clear it —
     otherwise it covers the policy links. When the footer scrolls into view
     the bar steps aside rather than sitting on top of it. */
  body.has-free-bar footer{padding-bottom:76px}
  /* The free-account bar: one button.

   It was a pill containing an icon, a line of text and a small button, which
   left the only thing that matters occupying a third of the width. Somebody
   who has used their free kundli does not need to be told so; they need
   somewhere to press. So the button is the bar.

   It pulses. This is the only thing on screen asking an unpaid account to
   subscribe, it is there the whole time, and it has to survive being looked
   past a hundred times. A slow sheen and a breathing glow on different cycles
   keep it alive at the edge of vision without ever jumping. */
  .free-bar{position:fixed;left:50%;transform:translateX(-50%);bottom:18px;z-index:60;
    display:flex;align-items:center;justify-content:center;
    width:min(calc(100vw - 32px),380px);
    background:none;border:0;box-shadow:none;padding:0;
    transition:opacity .2s,visibility .2s;
    animation:fbIn .45s cubic-bezier(.34,1.4,.64,1) both}
  @keyframes fbIn{
    from{opacity:0;transform:translateX(-50%) translateY(16px) scale(.96)}
    to  {opacity:1;transform:translateX(-50%) translateY(0) scale(1)}}

  .free-bar button{position:relative;overflow:hidden;width:100%;
    border:0;border-radius:99px;cursor:pointer;
    font-family:inherit;font-size:15px;font-weight:800;
    letter-spacing:.06em;text-transform:uppercase;color:#fff;
    padding:17px 22px;white-space:nowrap;
    background:linear-gradient(120deg,var(--brand),#ff7a5c 45%,var(--brand) 90%);
    background-size:220% 100%;
    animation:fbSheen 3.4s linear infinite, fbGlow 2.4s ease-in-out infinite;
    transition:transform .16s}
  .free-bar button:hover{transform:translateY(-2px)}
  .free-bar button:active{transform:translateY(0) scale(.98)}

  @keyframes fbSheen{ to{ background-position:-220% 0 } }
  @keyframes fbGlow{
    0%,100%{ box-shadow:0 6px 20px -4px var(--brand), 0 0 0 0 rgba(215,46,71,.45) }
    50%    { box-shadow:0 10px 30px -4px var(--brand), 0 0 0 10px rgba(215,46,71,0) } }

  /* A light sweeping across, on a longer cycle than the glow so the two never
     fall into step and start looking mechanical. */
  .free-bar button::after{
    content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
    background:linear-gradient(105deg,transparent 36%,rgba(255,255,255,.45) 50%,transparent 64%);
    transform:translateX(-120%);
    animation:fbSweep 4.6s ease-in-out infinite}
  @keyframes fbSweep{
    0%,64%{ transform:translateX(-120%) }
    90%,100%{ transform:translateX(120%) } }

  @media(prefers-reduced-motion:reduce){
    .free-bar,.free-bar button,.free-bar button::after{animation:none}
  }
  @media(max-width:420px){
    .free-bar{bottom:14px;width:calc(100vw - 24px)}
    .free-bar button{font-size:14px;padding:16px 18px;letter-spacing:.05em}
  }
  /* Close control on the paywall. Deliberately solid and high-contrast: the
     chart sits behind this dialog, so the way out has to be obvious. */
  .pw-x{/* Sticky, not absolute.

     The card scrolls, and an absolutely positioned close button scrolls with
     it — so on a phone, where the plans are taller than the screen, the way
     out disappeared the moment somebody looked at the yearly plan. Sticky
     keeps it pinned to the top of the card while the content moves under it.

     The negative bottom margin collapses the row it would otherwise add, so
     the seal and heading sit exactly where they did. */
  position:sticky;top:0;float:right;margin:-6px -6px -34px 0;z-index:6;display:flex;align-items:center;
    justify-content:center;width:34px;height:34px;border:1px solid var(--line-strong);
    background:var(--surface);color:var(--ink);font-size:20px;line-height:1;font-weight:600;
    cursor:pointer;border-radius:50%;box-shadow:0 2px 10px rgba(35,10,77,.18);transition:.16s}
  .pw-x:hover{background:var(--brand);color:#fff;border-color:var(--brand);transform:scale(1.06)}
  .pw-x:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
  .pw-x.hidden{display:none}
  /* A labelled way out at the bottom, for anyone who does not spot the corner. */
  .pw-dismiss{display:none;width:100%;margin-top:10px;padding:11px 16px;border-radius:12px;
    border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);
    font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:.16s}
  .pw-dismiss:hover{background:var(--surface-2);border-color:var(--brand);color:var(--brand)}
  .pw-dismiss.on{display:block}
  /* fields locked once the free chart is used */
  .locked-field{opacity:.55;pointer-events:none}
  /* The primary action of the whole app: nothing is computed without it. */
  .calc-btn{display:block;width:100%;margin-top:14px;padding:14px 16px;border:none;
    border-radius:999px;background:var(--brand);color:#fff;font-family:inherit;font-size:14.5px;
    font-weight:700;letter-spacing:.01em;cursor:pointer;position:relative;
    transition:transform .16s,box-shadow .2s,background .16s;
    box-shadow:0 6px 18px -8px rgba(215,46,71,.85)}
  .calc-btn:hover{background:var(--brand-deep);transform:translateY(-1px);
    box-shadow:0 10px 24px -10px rgba(215,46,71,.95)}
  .calc-btn:active{transform:none}
  .calc-btn:disabled{opacity:.45;cursor:default;transform:none;box-shadow:none}
  .calc-btn.hidden{display:none}
  /* Pending state: the form has changed since the chart on screen was cast,
     so the button says the two no longer agree.

     A dot in the corner is a notification badge — it says "something happened
     elsewhere", which is the wrong sentence. What is true here is that the
     button is waiting to be pressed, so the whole button waits: a slow breath
     of its own glow, and a shine that crosses the face like light moving over
     a dial. Both are the button itself rather than a mark stuck onto it.

     overflow:hidden on the sweep is what keeps it inside the pill; the button
     itself must not clip, or the glow ring would be cut off with it. */
  .calc-btn.dirty{animation:calcBreathe 2.6s ease-in-out infinite}
  @keyframes calcBreathe{
    0%,100%{box-shadow:0 0 0 0 rgba(215,46,71,.42),0 6px 18px -8px rgba(215,46,71,.85)}
    55%{box-shadow:0 0 0 9px rgba(215,46,71,0),0 8px 22px -9px rgba(215,46,71,.95)}
  }
  .calc-btn.dirty::before{
    content:"";position:absolute;inset:0;border-radius:inherit;
    /* A soft band of light, angled, travelling left to right.
       overflow:hidden does nothing on a pseudo-element with no children —
       the gradient painted square shoulders past the pill's radius. The mask
       clips it to the same rounded shape properly. */
    background:linear-gradient(105deg,transparent 38%,rgba(255,255,255,.30) 50%,transparent 62%);
    background-size:220% 100%;background-repeat:no-repeat;
    -webkit-mask:linear-gradient(#000,#000);mask:linear-gradient(#000,#000);
    -webkit-mask-clip:padding-box;mask-clip:padding-box;
    animation:calcSweep 2.6s ease-in-out infinite;pointer-events:none;
  }
  /* the pill clips its own children; the glow ring is a shadow and is not
     clipped by this, so the breathing halo still shows */
  .calc-btn{overflow:hidden}
  @keyframes calcSweep{
    0%{background-position:200% 0}
    /* it crosses, then rests — a continuous shimmer reads as a loading bar */
    55%,100%{background-position:-60% 0}
  }
  /* Pressing it should feel like it landed. */
  .calc-btn:active{transform:scale(.985)}
  .calc-btn.dirty:active{animation:none}
  @media(prefers-reduced-motion:reduce){
    .calc-btn:hover{transform:none}
    .calc-btn:active{transform:none}
    /* no motion at all — the ring alone carries the meaning */
    .calc-btn.dirty,.calc-btn.dirty::before{animation:none}
    .calc-btn.dirty{box-shadow:0 0 0 3px var(--brand-soft),0 6px 18px -8px rgba(215,46,71,.85)}
    .calc-btn.dirty::before{background:none}
  }
  .lock-note{display:flex;align-items:center;gap:7px;margin-top:10px;padding:9px 11px;
    border-radius:10px;background:var(--surface-2);border:1px solid var(--line);
    font-size:12px;color:var(--muted);line-height:1.45}
  .lock-note svg{width:14px;height:14px;flex:none;color:var(--gold)}
  .lock-note button{border:none;background:none;color:var(--brand);font-family:inherit;
    font-size:12px;font-weight:600;cursor:pointer;padding:0;text-decoration:underline}
  .pw-trust{font-size:11.5px;color:var(--muted);text-align:center;margin:10px 0 0;line-height:1.5}
  /* Four plans do not fit a short viewport, so the modal caps its height and
     scrolls internally rather than pushing content off-screen. */
  .pw-card::-webkit-scrollbar{width:6px}
  .pw-card::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:99px}
  @media(max-height:720px){
    .pw-seal{margin-bottom:10px;gap:7px}
    .pw-seal img{width:34px;height:34px}
    .pw-plus{width:13px;height:13px}
    .pw-plus::before{width:2.2px}
    .pw-plus::after{height:2.2px}
    .pw-card{padding:20px 18px}
    .pw-plans{gap:8px;margin-bottom:14px}
    .pw-plan{padding:11px 8px 9px}
  }
  @media(max-height:560px){
    .pw-seal{display:none}
    .pw-plans{grid-template-columns:repeat(4,1fr);gap:6px}
    .pw-plan{padding:9px 5px 8px}
    .pw-plan-amt{font-size:14px}
    .pw-plan-tax,.pw-plan-per{font-size:9.5px}
  }
  .pw-plans{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:0 0 18px}

  /* ---- the plus ----------------------------------------------------------
     Shown only where the plans are, because that is the only place it means
     anything: it marks the paid tier, the way it does on any other product
     that sells one. Everywhere else in the app the wordmark stands alone.

     Drawn rather than typed. A "+" from the body face is a maths operator —
     it sits on the wrong baseline, its arms are the wrong weight against the
     wordmark, and it reads as punctuation. Two bars with round caps and a
     brass gradient read as a mark, and they scale with the logo instead of
     with the font size. */
  .pw-seal{display:flex;align-items:center;justify-content:center;gap:9px;margin-bottom:14px}
  .pw-plus{
    position:relative;display:block;width:17px;height:17px;flex:0 0 auto;
    margin-top:1px;                     /* optical centring against the wordmark */
  }
  .pw-plus::before,.pw-plus::after{
    content:"";position:absolute;left:50%;top:50%;border-radius:99px;
    background:linear-gradient(150deg,#e6c073,var(--gold) 55%,#8f6410);
  }
  .pw-plus::before{width:2.6px;height:100%;transform:translate(-50%,-50%)}
  .pw-plus::after{width:100%;height:2.6px;transform:translate(-50%,-50%)}
  html[data-theme="dark"] .pw-plus::before,
  html[data-theme="dark"] .pw-plus::after{
    background:linear-gradient(150deg,#f4d79a,var(--gold) 55%,#b07d17);
  }

  /* It arrives a beat after the card, so it registers as a mark being applied
     rather than as part of the furniture. Once, on open — nothing loops. */
  .pw-modal:not(.hidden) .pw-plus{animation:pwPlus .5s cubic-bezier(.2,.8,.3,1.2) .18s backwards}
  @keyframes pwPlus{
    from{opacity:0;transform:rotate(-90deg) scale(.5)}
    to{opacity:1;transform:none}
  }
  @media(prefers-reduced-motion:reduce){
    .pw-modal:not(.hidden) .pw-plus{animation:none}
  }

  .pw-seal img{width:44px;height:44px;object-fit:contain;display:block}
  /* .pw-seal is laid out as a flex row with the plus — see above */
  .pw-plans{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:9px}
  .pw-bill{text-align:left;margin:14px 0 4px;padding:14px;border:1px solid var(--line);
    border-radius:var(--r);background:var(--surface-2)}
  .pw-bill-row{margin-bottom:10px}
  .pw-bill-row label{display:block;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.11em;
    text-transform:uppercase;color:var(--muted);margin-bottom:5px}
  .pw-bill-row select,.pw-bill-row input{width:100%;padding:10px 12px;border:1px solid var(--line-strong);
    border-radius:10px;background:var(--surface);color:var(--ink);font:inherit;font-size:13.5px}
  .pw-bill-row input{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.04em}
  .pw-bill-row select:focus,.pw-bill-row input:focus{outline:none;border-color:var(--brand);
    box-shadow:0 0 0 3px var(--brand-soft)}
  .pw-bill-row input.bad{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
  .pw-bill-row input.good{border-color:var(--ok)}
  .pw-bill-note{font-size:11px;line-height:1.5;color:var(--muted);margin:0}
  .pw-bill-note.err{color:var(--brand-deep)}
  .pw-plan-tax{display:block;font-size:10.5px;color:var(--muted);margin-top:3px;
    font-family:var(--font-mono);letter-spacing:.01em}
  .pw-plan-per{display:block;font-size:10.5px;color:var(--muted);margin-top:1px}
  .pw-plan{position:relative;display:flex;flex-direction:column;align-items:center;gap:2px;
    padding:16px 10px 13px;border:1.5px solid var(--line-strong);border-radius:12px;
    background:var(--surface-2);cursor:pointer;font-family:inherit;text-align:center;
    transition:border-color .15s,background .15s,box-shadow .15s}
  .pw-plan:hover{border-color:var(--brand)}
  .pw-plan.on{border-color:var(--brand);background:var(--surface);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 18%,transparent)}
  .pw-plan-name{font-size:12.5px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
  .pw-plan-amt{font-family:var(--font-display);font-size:26px;font-weight:700;color:var(--ink);letter-spacing:-.02em;line-height:1.15}
  .pw-plan-per{font-size:11.5px;color:var(--muted)}
  .pw-plan-save{margin-top:4px;font-size:11.5px;font-weight:600;color:var(--ok)}
  .pw-plan-badge{position:absolute;top:-9px;left:50%;transform:translateX(-50%);
    background:var(--brand);color:#fff;font-size:9.5px;font-weight:700;letter-spacing:.06em;
    text-transform:uppercase;padding:3px 8px;border-radius:99px;white-space:nowrap}
  @media (max-width:360px){ .pw-plans{grid-template-columns:1fr} }
  .pw-amt{font-family:var(--font-display);font-size:34px;font-weight:700;color:var(--ink);letter-spacing:-.02em}
  .pw-per{font-size:13px;color:var(--muted)}
  .pw-list{list-style:none;margin:0 0 20px;padding:0;text-align:left;display:flex;flex-direction:column;gap:8px}
  .pw-list li{display:flex;gap:9px;align-items:flex-start;font-size:13px;color:var(--ink-body);line-height:1.5}
  .pw-list li::before{content:"";flex:0 0 auto;width:15px;height:15px;margin-top:2px;border-radius:50%;background:var(--brand-soft) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23b0203a' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") center/9px no-repeat}
  .pw-btn{width:100%;appearance:none;border:0;background:var(--brand);color:#fff;font-family:var(--font-display);font-weight:700;font-size:15px;padding:14px;border-radius:var(--r-sm);cursor:pointer;transition:.16s}
  .pw-btn:hover{background:var(--brand-deep)}
  .pw-btn:disabled{opacity:.55;cursor:default}
  .pw-msg{font-size:12.5px;margin:12px 0 0;min-height:1em;color:var(--muted)}
  .pw-msg.err{color:var(--brand-deep)}
  .pw-logout{appearance:none;background:none;border:0;color:var(--muted);font-size:12.5px;text-decoration:underline;cursor:pointer;margin-top:14px;font-family:inherit}


  /* ===== Festival calendar ===== */
  .fc-wrap{margin-top:2px}
  .fc-yearpick{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;margin-bottom:16px}
  .fc-yearpick label{margin-bottom:7px}
  .fc-yearpick input{width:110px}
  .fc-section-title{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--ink);margin:20px 0 10px}
  .fc-section-title:first-child{margin-top:0}
  .fc-list{display:flex;flex-direction:column;gap:7px}
  .fc-row{display:flex;align-items:center;gap:12px;border:1px solid var(--line);border-radius:var(--r-sm);padding:9px 13px;flex-wrap:wrap}
  .fc-row-date{font-family:var(--font-mono);font-size:12.5px;color:var(--muted);min-width:150px}
  .fc-row-name{font-weight:600;color:var(--ink);flex:1;min-width:140px}
  .fc-row-sub{font-size:12px;color:var(--muted)}
  .fc-row-kshaya{opacity:.72;border-style:dashed}
  .fc-navratri-day{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:var(--brand-soft);color:var(--brand-deep);font-family:var(--font-mono);font-size:11px;font-weight:700;flex:0 0 auto}
  .fc-tithi-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:7px}
  .fc-tithi-chip{border:1px solid var(--line);border-radius:var(--r-sm);padding:7px 10px;font-size:12px}
  .fc-tithi-chip .d{font-family:var(--font-mono);color:var(--muted)}
  .fc-tithi-type{display:inline-block;font-size:10.5px;font-weight:700;border-radius:999px;padding:1px 7px;margin-left:6px}
  .fc-type-purna{background:var(--brand-soft);color:var(--brand-deep)}
  .fc-type-nanda,.fc-type-bhadra,.fc-type-jaya{background:var(--surface-2);color:var(--muted)}
  .drow-to{opacity:.5;margin:0 1px}
  .drow-d{font-family:var(--font-mono);font-size:12.7px;font-weight:700;color:var(--brand-deep);background:var(--brand-soft);padding:3px 8px;border-radius:999px;white-space:nowrap}

  .note{font-size:12.5px;color:var(--muted);margin-top:16px;line-height:1.6}
  .note b{color:var(--brand-deep)}
  /* ashtakavarga */
  .avtable{min-width:560px;border-collapse:collapse;margin-top:4px;font-family:var(--font-mono)}
  .avtable th{font-size:10px;color:var(--muted);font-weight:700;padding:7px 4px;text-align:center;border-bottom:1.5px solid var(--line-strong);letter-spacing:.02em}
  .avtable td{text-align:center;border:1px solid var(--line);padding:0}
  .av-name{font-weight:700;color:var(--ink);text-align:left !important;padding:7px 9px !important;white-space:nowrap;background:var(--surface-2);font-size:12px}
  .avc{font-weight:700;font-size:13px;width:34px;height:33px}
  .av-r{background:rgba(215,46,71,.15);color:var(--brand-deep)}
  .av-y{background:rgba(180,131,42,.22);color:var(--gold)}
  .av-g{background:rgba(31,138,91,.16);color:var(--ok)}
  .av-sav td{font-weight:700;color:var(--ink);background:var(--surface-3);font-size:13px;padding:7px 4px}
  .av-tot{font-weight:700;color:var(--brand);background:var(--surface-2)}
  .av-legend{font-size:12px;color:var(--ink-body);margin-top:14px;line-height:1.8}
  .av-legend .lg-r{color:var(--brand-deep)} .av-legend .lg-y{color:var(--gold)} .av-legend .lg-g{color:var(--ok)}
  .av-controls{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
  .av-viewtoggle{display:inline-flex;border:1px solid var(--line-strong);border-radius:999px;overflow:hidden;background:var(--surface);box-shadow:var(--sh-1)}
  .av-viewtoggle button{appearance:none;border:0;background:transparent;color:var(--muted);font-family:var(--font-mono);font-size:12.7px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;padding:9px 17px;cursor:pointer;transition:.15s}
  .av-viewtoggle button[aria-pressed="true"]{background:var(--sel);color:var(--on-sel)}
  #av-graha{max-width:210px}
  .av-bindu{font-family:var(--font-mono);font-size:23px;font-weight:700;dominant-baseline:middle}
  /* graha analysis */
  .pl-tap{cursor:pointer}
  .pl-tap:hover{text-decoration:underline}
  .ga-hint-note{font-size:12px;color:var(--muted);margin:8px 2px 0;text-align:center;font-style:italic}
  .ga-overlay{position:fixed;inset:0;z-index:100;background:rgba(20,10,40,.55);display:flex;align-items:center;justify-content:center;padding:16px;overflow:auto}
  /* ===== Bala tab visuals ===== */
  .bala-learn{display:inline-flex;align-items:center;gap:10px;cursor:pointer;user-select:none;font-weight:600;font-size:14px;color:var(--ink);margin:4px 0 6px;padding:9px 14px;border:1px solid var(--line-strong);border-radius:999px;background:var(--surface);transition:.15s}
  .bala-learn:hover{border-color:var(--brand)}
  .bala-learn input{position:absolute;opacity:0;width:0;height:0}
  .bala-learn-sw{width:36px;height:20px;border-radius:999px;background:var(--line-strong);position:relative;transition:.2s;flex:0 0 auto}
  .bala-learn-sw::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.3)}
  .bala-learn input:checked + .bala-learn-sw{background:var(--brand)}
  .bala-learn input:checked + .bala-learn-sw::after{transform:translateX(16px)}
  .bala-guide{border:1px solid var(--line-strong);border-left:4px solid var(--brand);border-radius:var(--r);padding:16px 18px;margin:6px 0 18px;background:var(--surface-2);font-size:14px;line-height:1.7}
  .bala-guide h4{margin:14px 0 6px;font-size:15px;color:var(--brand-deep)}
  .bala-guide h4:first-child{margin-top:0}
  .bala-guide p{margin:0 0 9px}
  .bala-guide ul{margin:0 0 9px;padding-left:20px}
  .bala-guide li{margin:4px 0}
  .bala-guide .bg-tag{display:inline-block;font-weight:700;color:var(--brand-deep)}
  .bala-hint{font-size:12.5px;color:var(--muted);margin:2px 0 10px;font-style:italic}
  .bala-sub{margin:26px 0 10px;font-size:16px;color:var(--ink)}
  table.bala-tbl{border-collapse:separate;border-spacing:3px;width:100%;min-width:560px}
  table.bala-tbl th{font-size:11px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);padding:6px 7px;font-weight:700;text-align:center;white-space:nowrap}
  table.bala-tbl th.bala-term{cursor:pointer;border-radius:7px;transition:.12s}
  table.bala-tbl th.bala-term:hover{background:var(--brand-soft);color:var(--brand-deep)}
  table.bala-tbl th.bala-term .bt-i{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;border:1.3px solid currentColor;font-size:9px;font-style:italic;font-weight:700;margin-left:4px;vertical-align:middle;opacity:.6}
  table.bala-tbl td{padding:8px 7px;text-align:center;font-size:13.5px;font-weight:600;border-radius:7px;font-variant-numeric:tabular-nums}
  td.bt-graha{text-align:left;font-weight:600;white-space:nowrap;background:var(--surface-2)}
  .gdot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:7px;vertical-align:middle}
  td.bt-total{background:var(--surface-2);min-width:78px}
  .bt-bar{height:7px;border-radius:99px;background:var(--line);overflow:hidden;margin-bottom:3px}
  .bt-bar span{display:block;height:100%;border-radius:99px}
  td.bt-total small,td.bt-rupa small{display:block;font-size:10.5px;font-weight:600;opacity:.75;margin-top:1px}
  td.bt-rupa{background:var(--surface-2);min-width:64px;font-size:15px}
  .bt-rank{display:inline-block;min-width:26px;padding:2px 6px;border-radius:99px;font-size:11.5px;font-weight:700;color:#fff}
  .bt-rank.r1{background:#d4a017}.bt-rank.r2{background:#8a94a6}.bt-rank.r3{background:#b87333}
  .bt-rank.r4,.bt-rank.r5,.bt-rank.r6,.bt-rank.r7{background:var(--line-strong);color:var(--ink-body)}
  /* Bhava bala bars */
  .bhava-row{display:grid;grid-template-columns:56px 1fr 60px 46px;align-items:center;gap:10px;padding:7px 0;border-bottom:1px solid var(--line)}
  .bhava-row .bh-h{font-weight:700;font-size:13px}
  .bhava-row .bh-h small{display:block;font-weight:500;color:var(--muted);font-size:10.5px}
  .bhava-bar{height:16px;border-radius:99px;background:var(--line);overflow:hidden;position:relative}
  .bhava-bar span{display:block;height:100%;border-radius:99px}
  .bhava-row .bh-rupa{text-align:right;font-weight:700;font-variant-numeric:tabular-nums}
  .bala-mrow{display:flex;align-items:flex-start;gap:10px;margin:12px 0}
  .bala-mrow .bm-ic{flex:0 0 auto;width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-weight:800;color:#fff;font-size:14px}
  /* ===== Shodashvarga table ===== */
  .sv-title{margin:24px 0 4px;font-size:16px;color:var(--ink);border-top:1px solid var(--line);padding-top:20px}
  table.sv-tbl{border-collapse:separate;border-spacing:2px;width:100%;min-width:640px;font-variant-numeric:tabular-nums}
  table.sv-tbl th{font-size:10.5px;font-weight:700;color:var(--muted);padding:5px 4px;text-align:center;white-space:nowrap}
  table.sv-tbl th.sv-vh{cursor:default;border-radius:6px;background:var(--surface-2)}
  table.sv-tbl th.sv-vh-tap{cursor:pointer;transition:.12s}
  table.sv-tbl th.sv-vh-tap:hover{background:var(--brand-soft);color:var(--brand-deep)}
  table.sv-tbl th.sv-vh-tap .bt-i{display:inline-flex;align-items:center;justify-content:center;width:12px;height:12px;border-radius:50%;border:1.2px solid currentColor;font-size:8px;font-style:italic;font-weight:700;margin-left:3px;vertical-align:middle;opacity:.55}
  table.sv-tbl td{padding:5px 3px;text-align:center;font-size:12px;font-weight:700;border-radius:6px;min-width:34px;position:relative}
  table.sv-tbl td.sv-gcell{text-align:left;white-space:nowrap;background:var(--surface-2);font-size:12.5px;padding-left:8px}
  .sv-gdot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;vertical-align:middle}
  .sv-vt{position:absolute;top:1px;right:2px;font-size:8px;color:#d4a017;line-height:1}
  .sv-legend{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:12px;font-size:11.5px;color:var(--muted)}
  .sv-legend span{display:inline-flex;align-items:center;gap:5px}
  .sv-sw{width:13px;height:13px;border-radius:4px;display:inline-block;border:1px solid rgba(0,0,0,.08)}

  .ga-overlay.hidden{display:none}
  .ga-modal{background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-lg);max-width:520px;width:100%;max-height:88vh;overflow:hidden;padding:0;position:relative;box-shadow:var(--sh-3);display:flex;flex-direction:column}
  #ga-content{overflow-y:auto;-webkit-overflow-scrolling:touch;padding:24px 24px 26px}
  .ga-close{position:absolute;top:12px;right:12px;z-index:3;width:36px;height:36px;border:1px solid var(--line-strong);border-radius:50%;background:var(--surface);color:var(--ink);font-size:21px;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center;padding:0;box-shadow:var(--sh-2)}
  .ga-close:hover{background:var(--brand);color:#fff;border-color:var(--brand)}
  .ga-head{display:flex;align-items:center;gap:14px;margin-bottom:18px;padding-right:38px}
  .ga-glyph{width:46px;height:46px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--surface-2);border:1px solid var(--line-strong);font-family:var(--font-mono);font-weight:700;font-size:16px;color:var(--ink)}
  .ga-glyph.pl-sun{color:var(--gold)}
  .ga-name{font-family:var(--font-display);font-size:22px;font-weight:600;color:var(--ink)}
  .ga-sub{font-family:var(--font-mono);font-size:13.8px;color:var(--muted);margin-top:3px}
  .ga-facts{display:flex;flex-direction:column;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;margin-bottom:18px}
  .ga-row{display:flex;gap:14px;justify-content:space-between;align-items:baseline;background:var(--surface);padding:9px 13px}
  .ga-k{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);font-weight:700;white-space:nowrap;flex:0 0 auto}
  .ga-v{font-size:13.5px;color:var(--ink);font-weight:500;text-align:right}
  .ga-eff h4{font-family:var(--font-mono);font-size:12.7px;letter-spacing:.12em;text-transform:uppercase;color:var(--brand);margin:0 0 10px;font-weight:700}
  .ga-eff p{font-size:14px;line-height:1.65;color:var(--ink-body);margin:0 0 11px}
  .ga-eff b{color:var(--ink);font-weight:700}
  .ga-verdict{margin-top:14px;padding:14px 16px;background:var(--brand-soft);border:1px solid var(--line-strong);border-left:4px solid var(--brand);border-radius:var(--r-sm);font-size:14px;line-height:1.65;color:var(--ink)}
  .ga-verdict p{margin:0 0 9px}
  .ga-verdict p:last-child{margin-bottom:0}
  .ga-vtag{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;opacity:.7;margin-bottom:11px!important}
  .ga-verdict b{color:var(--brand-deep)}
  .nak-tap{color:var(--brand-deep);font-weight:700;cursor:pointer;border-bottom:1px dotted var(--brand)}
  .nak-tap:hover{color:var(--brand)}
  .nak-subh{font-family:var(--font-mono);font-size:12.7px;letter-spacing:.04em;text-transform:uppercase;color:var(--gold);font-weight:700;margin:12px 0 6px}
  .nak-li{position:relative;padding-left:16px;font-size:14px;line-height:1.6;color:var(--ink-body);margin-bottom:4px}
  .nak-li::before{content:"";position:absolute;left:3px;top:9px;width:5px;height:5px;border-radius:50%;background:var(--brand);opacity:.7}
  .ga-vlabel{display:block;font-family:var(--font-mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--brand);font-weight:700;margin-bottom:6px}
  .placeholder{color:var(--muted);font-size:14px;text-align:center;padding:30px 10px}

  footer{margin-top:44px;padding-top:22px;border-top:1px solid var(--line);color:var(--muted);font-size:12.5px;line-height:1.6;text-align:center}
  footer .flinks{display:flex;flex-wrap:wrap;gap:5px 18px;justify-content:center;margin:14px 0 4px}
  footer .flinks a{font-size:12.5px;color:var(--muted);text-decoration:none;font-weight:500}
  footer .flinks a:hover{color:var(--brand)}
  footer .fcopy{font-family:var(--font-display);font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-body);font-weight:600;margin:8px 0 0}
  footer .fcopy .cmark{font-size:18px;font-weight:700;vertical-align:-2px;color:var(--mark)}
  footer .ftagline{font-family:'Caveat','Tiro Devanagari Hindi',cursive;font-size:22px;color:var(--ink-body);margin:16px 0 2px;font-weight:600;letter-spacing:.01em}
  footer .ftagline .fheart{font-family:var(--font-body);font-size:16px;color:var(--brand);vertical-align:1px;margin-left:1px}
  /* The footer carries the mark alone now rather than the full wordmark, so
     it can be larger without dominating the line. The three images the old
     lockup needed — a dark one, a light one and a masked span — are gone with
     it; the glyph is a single file that works on either ground. */
  /* Three things were opening this gap: the anchor's own bottom margin, the
     descender space an inline-flex element still reserves in its line box, and
     the browser default 1em margin on the tagline paragraph, which had no rule
     of its own. All three are set here. */
  .footer-ansh{display:inline-flex;align-items:flex-start;gap:1px;
    line-height:0;margin:0;text-decoration:none;vertical-align:top}
  .ftagline{margin:2px 0 10px}
  /* Two files, swapped by theme, matching how the header mark works: the blue
     glyph on a light ground, the crimson one on dark. */
  .fa-a{height:58px;width:auto;display:block;opacity:.96;
    transition:opacity .15s ease,transform .15s ease}
  html[data-theme="dark"] .fa-a.lite{display:none}
  html:not([data-theme="dark"]) .fa-a.drk{display:none}
  .footer-ansh:hover .fa-a{opacity:1;transform:translateY(-1px)}
  .fa-tm{font-family:var(--font-body);font-size:23px;font-weight:800;
    line-height:1;color:var(--mark);margin-top:2px;letter-spacing:.01em}
  @media(max-width:600px){ .fa-a{height:48px} .fa-tm{font-size:19px;margin-top:2px} }
  
  
  
  /* matchmaking */
  .mm-person{padding:0 0 4px;margin:0 0 16px}
  .mm-person+.mm-person{border-top:1px dashed var(--line-strong);padding-top:16px}
  .mm-plabel{font-family:var(--font-mono);font-size:12.7px;letter-spacing:.14em;text-transform:uppercase;font-weight:700;margin:0 0 12px;display:inline-block;padding:4px 12px;border-radius:999px}
  .mm-boy{color:#1f6feb;background:rgba(31,111,235,.12)}
  .mm-girl{color:#c026a8;background:rgba(192,38,168,.12)}
  /* Every block the milan renderer writes lives in here. Containing it once at
     the top means a single wide child cannot widen the panel and, through it,
     shift the whole page sideways. */
  #milan-body{min-width:0;max-width:100%}
  #milan-body .milan-score,
  #milan-body .milan-mangal,
  #milan-body .ms-cards{max-width:100%}
  .ms-cards{display:flex;align-items:center;gap:12px;margin:2px 0 18px}
  /* min-width:0 — flex items refuse to shrink below min-content by default, so
     without it a long name or nakshatra widens the pair of cards past their
     container at any width, not just on a phone. */
  .ms-card{flex:1 1 0;min-width:0;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-lg);padding:12px 14px;box-shadow:var(--sh-1)}
  .ms-name{font-family:var(--font-display);font-size:16px;font-weight:700;color:var(--ink);margin-bottom:6px;overflow-wrap:anywhere}
  .ms-row{display:flex;justify-content:space-between;gap:8px;font-size:12.5px;color:var(--muted);padding:2px 0}
  .ms-row>*{min-width:0;overflow-wrap:anywhere}
  .ms-row b{color:var(--ink-body);font-weight:600}
  .ms-heart{color:var(--brand);font-size:20px;flex:0 0 auto}
  .milan-score{text-align:center;border-radius:var(--r-lg);padding:16px;margin:0 0 18px;border:1px solid}
  .milan-score.ok{background:rgba(47,158,143,.08);border-color:rgba(47,158,143,.35)}
  .milan-score.warn{background:rgba(214,158,46,.10);border-color:rgba(214,158,46,.4)}
  .milan-score.bad{background:rgba(215,46,71,.08);border-color:rgba(215,46,71,.35)}
  .msc-num{font-family:var(--font-display);font-size:40px;font-weight:800;line-height:1;color:var(--ink)}
  .msc-num span{font-size:18px;color:var(--muted);font-weight:600}
  .msc-bar{height:9px;border-radius:999px;background:var(--line);margin:12px auto 10px;max-width:320px;overflow:hidden}
  .msc-bar span{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,var(--brand),var(--gold))}
  .msc-verd{font-family:var(--font-mono);font-size:13.8px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:var(--ink-body)}
  /* min-width:0 is THE fix for matchmaking zooming out on a phone.

     The bare `table` selector further up sets min-width:520px, because the big
     reference tables live inside a .scroll wrapper and are meant to be swiped
     sideways. The koota table has no such wrapper, so that 520px simply forced
     the page wider than a 390px phone — the whole document zoomed out, and the
     points ended up off the right edge.

     max-width:100% did NOT save it: in CSS min-width WINS over max-width, so
     the 520px floor beat every cap put on this table. It has to be cancelled
     at the source, not covered up.

     table-layout:fixed so column widths come from the table's width rather
     than its content, which stops the cells setting a floor of their own. */
  .milan-tbl{width:100%;min-width:0;table-layout:fixed;border-collapse:collapse;margin:0 0 4px}
  .milan-tbl th{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--brand);text-align:left;padding:6px 8px;border-bottom:1.5px solid var(--line-strong)}
  /* With table-layout:fixed, columns with no stated width share what is left
     equally — which would hand the points column a third of the table for two
     short numbers. Pinning it lets the name and area take the rest. */
  .milan-tbl th:last-child{text-align:right;width:92px}
  .milan-tbl td{padding:9px 8px;border-bottom:1px solid var(--line);font-size:13.5px;overflow-wrap:anywhere}
  .kt-name{font-family:var(--font-display);font-weight:700;color:var(--ink)}
  .kt-area{color:var(--muted);font-size:12px}
  .kt-pts{text-align:right;font-family:var(--font-mono);font-weight:700;white-space:nowrap}
  .kt-pts span{color:var(--muted);font-weight:400;font-size:11px}
  .kt-pts.kok{color:#1f9e6e}.kt-pts.kmid{color:var(--gold-deep,#b8860b)}.kt-pts.kbad{color:var(--brand)}
  .mflags{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}
  .mflag{font-family:var(--font-mono);font-size:12.7px;font-weight:700;padding:5px 12px;border-radius:999px}
  .mflag.bad{color:var(--brand);background:rgba(215,46,71,.1);border:1px solid rgba(215,46,71,.3)}
  .mm-why{font-size:11.5px;color:var(--muted);margin:-2px 0 8px;padding-left:2px;line-height:1.5}
  .milan-mangal{border:1px solid var(--line);border-radius:var(--r-lg);padding:14px;margin-top:14px;background:var(--surface-2)}
  .mm-h{font-family:var(--font-mono);font-size:12.7px;letter-spacing:.1em;text-transform:uppercase;color:var(--brand);font-weight:700;margin-bottom:8px}
  .mm-row{display:flex;justify-content:space-between;font-size:13.5px;padding:3px 0;color:var(--ink-body);gap:8px}
  .mm-row>*{min-width:0;overflow-wrap:anywhere}
  .mm-row b.ok{color:#1f9e6e}.mm-row b.bad{color:var(--brand)}
  .mm-verd{margin-top:8px;font-size:12.5px;font-weight:600;padding:8px 10px;border-radius:var(--r);color:var(--ink-body)}
  .mm-verd.ok{background:rgba(47,158,143,.1)}.mm-verd.warn{background:rgba(214,158,46,.12)}.mm-verd.bad{background:rgba(215,46,71,.08)}
  /* sudarshana chakra */
  .sc-box{max-width:520px;transition:max-width .15s ease}
  .sc-sizer{display:flex;align-items:center;justify-content:center;gap:12px;margin:0 0 10px}
  .sc-sizer-lbl{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-weight:700}
  .sc-zoom{display:inline-flex;border:1px solid var(--line-strong);border-radius:999px;overflow:hidden;box-shadow:var(--sh-1)}
  .sc-zoom button{appearance:none;border:none;background:var(--surface);color:var(--brand);font-size:18px;font-weight:700;line-height:1;width:38px;height:32px;cursor:pointer;transition:.12s;display:flex;align-items:center;justify-content:center}
  .sc-zoom button:first-child{border-right:1px solid var(--line-strong)}
  .sc-zoom button:hover{background:var(--brand);color:#fff}
  .sc-zoom button:active{transform:scale(.94)}
  .sc-frame{fill:none;stroke:var(--line-strong);stroke-width:1.5}
  .sc-circle{fill:none;stroke:var(--line-strong);stroke-width:1}
  .sc-line{stroke:var(--line);stroke-width:.8}
  .sc-rashi{font-family:var(--font-mono);font-size:9px;font-weight:700;opacity:.55}
  .sc-pl{font-family:var(--font-display);font-size:11px;font-weight:700}
  .scr0{fill:var(--gold-deep,#c67c1a)}
  .scr1{fill:var(--ink)}
  .scr2{fill:var(--brand)}
  html[data-theme="dark"] .scr1{fill:#c8b9ff}
  .sc-legend{display:flex;justify-content:center;flex-wrap:wrap;gap:8px 16px;margin:12px 0 4px}
  .sc-lg{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:12.7px;font-weight:700;letter-spacing:.03em;color:var(--ink-body)}
  .sc-lg i{width:11px;height:11px;border-radius:50%;display:inline-block}
  .sc-lg.scr0 i{background:var(--gold-deep,#c67c1a)}
  .sc-lg.scr1 i{background:var(--ink)}
  .sc-lg.scr2 i{background:var(--brand)}
  html[data-theme="dark"] .sc-lg.scr1 i{background:#c8b9ff}
  .sc-guidebtn{display:flex;align-items:center;gap:8px;width:100%;margin:16px 0 0;appearance:none;border:1px solid var(--line-strong);background:var(--surface);color:var(--brand-deep);font-family:var(--font-body);font-size:13.5px;font-weight:700;padding:12px 16px;border-radius:var(--r);cursor:pointer;box-shadow:var(--sh-1);transition:.15s}
  /* The varga toggle spans the full width, so on a wide screen its label sat
     hard against the left edge with the chevron far away on the right, looking
     like the row had come apart. Centring the icon and label and taking the
     chevron out of the flow puts the label in the middle of the button at any
     width. Scoped to this one button so the other guide toggles keep their
     existing left-aligned look. */
  #svToggleBtn{position:relative;justify-content:center;text-align:center}
  #svToggleBtn .sc-gb-chev{position:absolute;right:16px;top:50%;transform:translateY(-50%);margin-left:0}
  #svToggleBtn.on .sc-gb-chev{transform:translateY(-50%) rotate(180deg)}
  /* Leave room so a long label never slides under the chevron. */
  #svToggleBtn>span[data-i18n]{padding:0 18px}
  .sc-guidebtn:hover{border-color:var(--brand)}
  .sc-guidebtn.on{background:var(--brand-soft);border-color:var(--brand)}
  .sc-guidebtn svg{width:17px;height:17px;color:var(--brand);flex:0 0 auto}
  .sc-gb-chev{margin-left:auto;color:var(--brand);transition:transform .18s ease}
  .sc-guidebtn.on .sc-gb-chev{transform:rotate(180deg)}
  .sc-guide{margin-top:14px;border-top:1px solid var(--line);padding-top:16px}
  .sc-guide h4{font-family:var(--font-mono);font-size:12.7px;letter-spacing:.1em;text-transform:uppercase;color:var(--brand);margin:0 0 8px;font-weight:700}
  .sc-guide h4:not(:first-child){margin-top:18px}
  .sc-guide p{font-size:14px;line-height:1.65;color:var(--ink-body);margin:0}
  .sc-steps{margin:0;padding-left:0;list-style:none;counter-reset:scstep}
  .sc-steps li{position:relative;padding:0 0 0 34px;margin-bottom:11px;font-size:14px;line-height:1.6;color:var(--ink-body);counter-increment:scstep}
  .sc-steps li::before{content:counter(scstep);position:absolute;left:0;top:0;width:23px;height:23px;border-radius:50%;background:var(--brand-soft);color:var(--brand-deep);font-family:var(--font-mono);font-size:13.8px;font-weight:700;display:flex;align-items:center;justify-content:center}
  .sc-read{margin:0;padding:0;list-style:none}
  .sc-read li{position:relative;padding:0 0 0 18px;margin-bottom:9px;font-size:14px;line-height:1.6;color:var(--ink-body)}
  .sc-read li::before{content:"";position:absolute;left:3px;top:9px;width:5px;height:5px;border-radius:50%;background:var(--brand);opacity:.7}
  /* day quick-pick (panchang/chogadiya/hora) */
  .dayquick{display:grid;grid-template-columns:repeat(3,1fr);margin-top:10px;border:1px solid var(--line-strong);border-radius:999px;overflow:hidden;background:var(--surface-2);box-shadow:var(--sh-1)}
  .dayquick button{appearance:none;border:none;background:transparent;font-family:var(--font-body);font-size:12.5px;font-weight:700;color:var(--muted);padding:10px 6px;cursor:pointer;transition:.12s;white-space:nowrap}
  .dayquick button+button{border-left:1px solid var(--line)}
  .dayquick button:hover{color:var(--brand);background:var(--brand-soft)}
  .dayquick button.on{background:var(--sel);color:var(--on-sel)}
  /* Two range rows — ahead and back — each a dayquick pill, with only one
     button lit across both. */
  .tl-rdir{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;color:var(--muted);margin:12px 0 -2px 4px}
  .tl-rdir:first-child{margin-top:2px}
  /* tappable graha names in the gochar table */
  #gochar-rows tr.gtap .gg-name{text-decoration:underline;text-decoration-style:dotted;text-decoration-color:var(--brand);text-decoration-thickness:1.5px;text-underline-offset:3px}
  #gochar-rows tr.gtap:hover .gg-name{text-decoration-style:solid;color:var(--brand)}
  #gochar-rows tr.gtap:active{background:var(--fill-soft,rgba(0,0,0,.03))}
  /* reference selector (gochar) */
  .ref-sub{display:block;margin-top:3px;font-size:11px;color:var(--muted);font-weight:400}
  .refseg{display:grid;grid-template-columns:1fr 1fr;gap:9px}
  .refseg button{display:flex;flex-direction:column;align-items:center;gap:7px;appearance:none;border:1.5px solid var(--line-strong);background:var(--surface-2);color:var(--ink-body);font-family:var(--font-display);font-size:14.5px;font-weight:700;padding:14px 8px;border-radius:var(--r);cursor:pointer;transition:.14s}
  .refseg button svg{width:22px;height:22px;color:var(--muted);transition:.14s}
  .refseg button:hover{border-color:var(--brand)}
  .refseg button[aria-pressed="true"]{border-color:var(--brand);background:var(--brand-soft);color:var(--brand-deep);box-shadow:0 0 0 3px var(--brand-soft)}
  .refseg button[aria-pressed="true"] svg{color:var(--brand)}
  .refseg button:active{transform:scale(.97)}
  /* dignity badges (planets table) */
  .dg-badge{display:inline-block;font-family:var(--font-mono);font-size:12.1px;font-weight:700;letter-spacing:.02em;padding:3px 9px;border-radius:999px;white-space:nowrap}
  .dg-exalt{color:#17a06e;background:rgba(47,158,143,.16)}
  .dg-strong{color:#4a7fc0;background:rgba(74,127,192,.15)}
  .dg-good{color:#2f9e8f;background:rgba(47,158,143,.10)}
  .dg-neutral{color:var(--muted);background:rgba(120,120,120,.13)}
  .dg-bad{color:#bd7a17;background:rgba(214,158,46,.16)}
  .dg-debil{color:var(--brand);background:rgba(215,46,71,.12)}
  html[data-theme="dark"] .dg-exalt{color:#4fd6a0}
  html[data-theme="dark"] .dg-strong{color:#8fb4e8}
  html[data-theme="dark"] .dg-good{color:#5fd0bf}
  html[data-theme="dark"] .dg-bad{color:#e6b955}
  .hidden{display:none !important}
  /* transit timeline */
  .tl-grahas{display:grid;grid-template-columns:repeat(3,1fr);gap:7px}
  .tl-grahas button{display:flex;flex-direction:column;align-items:center;gap:4px;appearance:none;border:1.5px solid var(--line-strong);background:var(--surface-2);color:var(--ink-body);font-family:var(--font-display);font-size:12.5px;font-weight:700;padding:9px 4px;border-radius:var(--r-sm);cursor:pointer;transition:.12s}
  .tl-grahas button .tlg-ic{font-size:17px;line-height:1;color:var(--gcol)}
  .tl-grahas button:hover{border-color:var(--brand)}
  .tl-grahas button.on{border-color:var(--gcol);background:color-mix(in srgb,var(--gcol) 12%,transparent);color:var(--ink);box-shadow:0 0 0 2px color-mix(in srgb,var(--gcol) 22%,transparent)}
  .tl-head{display:flex;align-items:center;gap:13px;margin:0 0 16px}
  .tl-glyph{width:44px;height:44px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:24px;background:var(--surface);border:1.5px solid var(--gcol);color:var(--gcol);box-shadow:var(--sh-1)}
  .tl-name{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--ink)}
  .tl-now{font-size:13px;color:var(--muted);margin-top:2px}
  .tl-now b{color:var(--brand-deep);font-weight:700}
  .tl-list{border-left:2px solid var(--line);margin-left:6px;padding-left:0}
  .tl-year{font-family:var(--font-mono);font-size:12px;font-weight:700;letter-spacing:.1em;color:var(--brand);margin:16px 0 6px -8px;padding-left:12px}
  .tl-year:first-child{margin-top:2px}
  .tl-row{display:flex;align-items:baseline;gap:12px;padding:7px 0 7px 16px;position:relative;font-size:14px}
  .tl-row::before{content:"";position:absolute;left:-5px;top:12px;width:8px;height:8px;border-radius:50%;background:var(--muted);border:2px solid var(--surface)}
  .tl-row.tl-ing::before{background:var(--brand)}
  .tl-row.tl-retro::before,.tl-row.tl-comb::before{background:#d69e2e}
  .tl-row.tl-dir::before,.tl-row.tl-uncomb::before{background:#1f9e6e}
  .tl-date{font-family:var(--font-mono);font-size:12.5px;color:var(--muted);font-weight:700;flex:0 0 auto;min-width:96px}
  .tl-ev{color:var(--ink-body)}
  .tl-ev b{color:var(--ink);font-weight:700}
  .tl-row.tl-retro .tl-ev,.tl-row.tl-comb .tl-ev{color:var(--gold-deep,#b8860b)}
  .tl-row.tl-dir .tl-ev,.tl-row.tl-uncomb .tl-ev{color:#1f8f68}
  #tzauto,#gtzauto,#m1tzauto,#m2tzauto,#ptzauto{display:none !important}
  /* house detail */
  .hd-glyph{font-family:var(--font-display);font-size:22px;color:var(--brand);border-color:var(--brand)}
  .hd-num{font-style:normal;font-family:var(--font-mono);font-size:13px;opacity:.75;margin-left:6px}
  .hd-num s{text-decoration:none;font-size:10px;opacity:.7;margin-left:3px}
  /* the evidence behind the number, so it can be checked rather than trusted */
  .ass-items{margin-top:11px;border-top:1px solid var(--line);padding-top:9px;
    display:flex;flex-direction:column;gap:5px}
  .ass-row{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:baseline}
  /* the tier index, so the reader can see which lines carry weight */
  .ass-t{display:inline-flex;align-items:center;justify-content:center;
    width:14px;height:14px;border-radius:4px;margin-right:7px;font-style:normal;
    font-size:8.5px;font-weight:700;line-height:1;vertical-align:1px;
    background:var(--surface-2);color:var(--muted);border:1px solid var(--line)}
  .ass-row.t1 .ass-t{background:var(--brand-soft);color:var(--brand-deep);border-color:transparent}
  .ass-row.t2 .ass-t{background:var(--gold-soft);color:var(--gold);border-color:transparent}
  .ass-row.t1 .ass-k,.ass-row.t2 .ass-k{color:var(--ink-body)}
  .ass-k{font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;
    text-transform:uppercase;color:var(--muted);white-space:nowrap}
  .ass-d{font-size:11.6px;color:var(--ink-body);min-width:0}
  .ass-v{font-family:var(--font-mono);font-size:11.5px;font-weight:700;color:var(--muted);white-space:nowrap}
  .ass-v.up{color:#1f7a55}.ass-v.dn{color:var(--brand-deep)}
  .ass-note{font-size:10.6px;line-height:1.45;color:var(--muted);margin:9px 0 0;font-style:italic}
  @media(max-width:600px){
    .ass-row{grid-template-columns:1fr auto;row-gap:1px}
    .ass-k{grid-column:1;grid-row:1}.ass-v{grid-column:2;grid-row:1}
    .ass-d{grid-column:1/3;grid-row:2;font-size:11.2px}
  }
  .hd-strength{border:1px solid var(--line-strong);border-radius:var(--r-lg);padding:13px 15px;margin:16px 0 4px}
  .hd-bb{margin-top:9px;padding-top:9px;border-top:1px dashed var(--line);font-family:var(--font-mono);font-size:12px;color:var(--muted)}
  .hd-bb b{color:var(--ink)}
  .hd-strength.ok{background:rgba(47,158,143,.08);border-color:rgba(47,158,143,.35)}
  .hd-strength.warn{background:rgba(214,158,46,.10);border-color:rgba(214,158,46,.4)}
  .hd-strength.bad{background:rgba(215,46,71,.08);border-color:rgba(215,46,71,.35)}
  .hd-str-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:9px}
  .hd-str-top span{font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:700}
  .hd-str-top b{font-family:var(--font-display);font-size:16px;color:var(--ink);font-weight:700}
  .hd-bar{height:9px;border-radius:999px;background:var(--line);overflow:hidden}
  .hd-bar span{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,var(--brand),var(--gold))}
  .hd-occ{display:flex;flex-wrap:wrap;gap:8px}
  .hd-occ-chip{display:inline-flex;align-items:center;gap:7px;background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:5px 12px 5px 6px;font-family:var(--font-display);font-weight:700;font-size:14px;color:var(--ink)}
  .hd-occ-chip em{font-family:var(--font-mono);font-size:10.5px;font-style:normal;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.03em}
  .hd-oc-g{width:24px;height:24px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:15px;background:var(--surface);border:1.5px solid var(--gcol);color:var(--gcol)}
  .hd-empty{color:var(--muted);font-style:italic;margin:0}
  .hd-rep{margin:0;padding:0;list-style:none}
  .hd-rep li{position:relative;padding:0 0 0 18px;margin-bottom:7px;font-size:14px;line-height:1.55;color:var(--ink-body)}
  .hd-rep li::before{content:"";position:absolute;left:3px;top:9px;width:5px;height:5px;border-radius:50%;background:var(--brand);opacity:.7}
  .hd-why{margin:0;padding:0;list-style:none}
  .hd-why li{display:flex;align-items:flex-start;gap:9px;margin-bottom:7px;font-size:13.5px;line-height:1.5;color:var(--ink-body)}
  .hd-w-d{flex:0 0 auto;width:30px;text-align:center;font-family:var(--font-mono);font-size:11px;font-weight:700;padding:2px 0;border-radius:6px}
  .hd-why li.pos .hd-w-d{color:#1f9e6e;background:rgba(47,158,143,.14)}
  .hd-why li.neg .hd-w-d{color:var(--brand);background:rgba(215,46,71,.12)}
  .hd-why li.neu .hd-w-d{color:var(--muted);background:rgba(120,120,120,.12)}
  ::selection{background:rgba(215,46,71,.22)}
  /* Devanagari renders smaller than Latin — bump sizes & relax tracking when Hindi is active */
  html[lang="hi"] .subtabs button{font-size:12.5px;letter-spacing:.01em}
  html[lang="hi"] .d-navlbl{letter-spacing:.02em}
  html[lang="hi"] .lang button{font-size:13.5px}
  html[lang="hi"] label{font-size:12.5px;letter-spacing:.01em}
  html[lang="hi"] .panel h2{font-size:12.5px;letter-spacing:.06em}
  html[lang="hi"] .psubh{font-size:12.5px;letter-spacing:.04em}
  html[lang="hi"] .prow .pk{font-size:12px;letter-spacing:.01em}
  html[lang="hi"] .prow .pv{font-size:16px}
  html[lang="hi"] .prow .pv .pend{font-size:11px}
  html[lang="hi"] th{font-size:12px;letter-spacing:.01em}
  html[lang="hi"] td{font-size:14.5px}
  html[lang="hi"] td.name{font-size:16.5px}
  html[lang="hi"] .chip .k{font-size:11px;letter-spacing:.05em}
  html[lang="hi"] .chip .v{font-size:19px}
  html[lang="hi"] .wholine{font-size:21px}
  html[lang="hi"] .legend{font-size:12px}
  html[lang="hi"] .note,html[lang="hi"] .hint,html[lang="hi"] .mk-note,html[lang="hi"] .ga-hint-note{font-size:13px}
  html[lang="hi"] .drow-l{font-size:17px}
  html[lang="hi"] .dn-lord{font-size:18px}
  html[lang="hi"] .drow-r,html[lang="hi"] .dn-lbl{font-size:12px;letter-spacing:.01em}
  html[lang="hi"] .dcrumb,html[lang="hi"] .dlh-sub{font-size:14px}
  html[lang="hi"] .crow .cn,html[lang="hi"] .hrow .hn{font-size:16px}
  html[lang="hi"] .crow .ct,html[lang="hi"] .hrow .ht{font-size:13px;letter-spacing:.01em}
  html[lang="hi"] .nowbtn{font-size:12.5px;letter-spacing:.01em}
  html[lang="hi"] .ga-k{font-size:11.5px;letter-spacing:.01em}
  html[lang="hi"] .ga-v{font-size:14.5px}
  html[lang="hi"] .ga-eff h4{font-size:12px;letter-spacing:.06em}
  html[lang="hi"] .ga-eff p,html[lang="hi"] .ga-verdict{font-size:15px}
  html[lang="hi"] .ga-name{font-size:23px}
  html[lang="hi"] .ga-sub,html[lang="hi"] .ga-vlabel{font-size:12px;letter-spacing:.04em}
  html[lang="hi"] .av-legend{font-size:13px}
  html[lang="hi"] .pnum{font-size:12px}
  html[lang="hi"] .eyebrow{font-size:12px;letter-spacing:.14em}

  /* ---- touch / tap feel (mobile) ---- */
  *{-webkit-tap-highlight-color:transparent}
  .mode-btn,.nowbtn,.lang button,.drow,.cresult,details summary{transition:transform .09s ease, background .16s, color .16s, border-color .16s}
  @media(hover:none){
    .mode-btn:active,.nowbtn:active,.lang button:active,.drow:active,.cresult:active,.chip:active,details summary:active{transform:scale(.975)}
  }

  @media(max-width:600px){
    .wrap{padding:16px 13px calc(48px + env(safe-area-inset-bottom))}
    /* topbar */
    .topbar{gap:12px;margin-bottom:16px}
    /* sticky app-bar on mobile: brand + toggles on top, tab grid below */
    .appbar{margin:-16px -13px 14px;padding:9px 13px;gap:8px;align-items:center}
    .appbar .brand{order:1;flex:0 1 auto;min-width:0}
    .appbar .tb-right{order:2;flex:0 0 auto;margin-left:auto;gap:6px;align-items:center;--ctl-h:34px}
    .brand{gap:10px;min-width:0}
    .brand-logo{max-height:30px}

    .lang{align-self:center;height:34px;flex:0 0 auto}
    /* the full words cost ~117px on a phone; show short codes instead.
       JS reads data-lang, not the label, so this is display-only. */
    .lang button{font-size:0 !important; padding:0 !important; width:34px}
    .lang button::after{font-size:11.5px; font-weight:600; line-height:1}
    .lang button[data-lang="en"]::after{content:"EN"}
    .lang button[data-lang="hi"]::after{content:"\0939\093F"}

    .lang button{padding:0 10px;font-size:11.5px;min-height:0;height:100%;display:flex;align-items:center;justify-content:center;white-space:nowrap}
    /* header */
    header{padding-bottom:16px;margin-bottom:18px}
    .wordmark{font-size:clamp(24px,7.5vw,34px)}
    .sub{font-size:14px;margin-top:9px}
    /* section tabs: a single horizontal scroll strip (fits any number of tiles) */
    .appbar{position:sticky;top:0}
    .appbar .modes{margin-top:10px}

    /* Record card. The grid already keeps the rows aligned; here it only gets
       tighter. The notes label drops to its icon so three secondary buttons
       still fit their row without any of them truncating. */
    .cw{padding:13px 13px 12px;margin-top:15px}
    .cw-avatar{width:34px;height:34px;font-size:14.5px}
    .cw-name{font-size:14.8px}
    .cw-state{font-size:9.4px;padding:3px 7px 3px 5px}
    .cw-acts{gap:7px;margin-top:12px}
    .cw-acts-row{gap:7px}
    .cw-btn{height:37px;font-size:11.6px;padding:0 11px}
    .cw-btn-main{height:42px;font-size:12.8px}
    /* Notes drops to its icon on a phone. With the label kept, the Hindi row
       ("\u0928\u0908 \u0915\u0947 \u0930\u0942\u092A \u092E\u0947\u0902 \u0938\u0939\u0947\u091C\u0947\u0902" is long) needs about 360px against roughly
       298px available, so it would wrap to a second line. */
    .cw-note-toggle{flex:0 0 auto;padding:0 13px}
    .cw-note-toggle span:not(.cw-note-dot){display:none}
    .cw-note-toggle svg{width:16px;height:16px}

    /* Dasha systems (Vimshottari → Kalachakra). Five labels need about 460px
       and a phone panel gives roughly 300, so as an inline-flex with no wrap
       and no scroll the strip simply burst out of its panel. It becomes a
       scrollable rail here, matching the section tabs above it. */
    .dsys{display:flex;width:100%;max-width:100%;overflow-x:auto;overflow-y:hidden;
      gap:2px;padding:3px;margin:0 0 14px;
      scrollbar-width:none;-ms-overflow-style:none;
      scroll-snap-type:x proximity;overscroll-behavior-x:contain;
      -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 12px,#000 calc(100% - 12px),transparent 100%);
      mask-image:linear-gradient(90deg,transparent 0,#000 12px,#000 calc(100% - 12px),transparent 100%)}
    .dsys::-webkit-scrollbar{display:none}
    .dsys button{flex:0 0 auto;font-size:11.5px;height:28px;padding:0 12px;
      scroll-snap-align:start}

    /* Gochar cards. The key column was flex:0 0 auto, so it could never give
       ground, and a long nakshatra value had nowhere to go but out of the card. */
    .gc-head{gap:8px}
    .gc-lead{gap:9px}
    .gc-glyph{width:30px;height:30px;font-size:17px}
    .gc-name{font-size:16.5px}
    .gc-state{font-size:9.5px;white-space:normal;text-align:right;line-height:1.3}
    .gc-pos{margin:4px 0 10px;padding-bottom:10px}
    .gc-rows{gap:8px}
    .gc-row{gap:10px;align-items:flex-start}
    .gc-k{font-size:9.8px;line-height:1.4;padding-top:2px;flex:0 1 auto;min-width:0}
    .gc-v{font-size:13.6px;line-height:1.35;overflow-wrap:anywhere}
    .gc-v .nak-tap{font-size:13.6px}

    /* panels + inputs */
    .panel{padding:15px}
    .panel:not(.hidden)+.panel:not(.hidden){margin-top:16px}
    .panel h2{margin-bottom:14px}
    input,select{font-size:16px;padding:12px;scroll-margin-top:64px}
    input[type="date"],input[type="time"]{min-height:48px}
    /* date & time each get a full row so native pickers aren't cramped */
    .row-2{grid-template-columns:1fr;gap:0}
    .row-2>.field{margin-bottom:16px}
    .cresult{padding:12px 12px}
    /* summary + chips */
    .wholine{font-size:17px}
    .whometa{font-size:12px}
    .chips{gap:8px}
    .chip{padding:10px 12px}
    .chip .v{font-size:16px}
    /* chart + toggles + legend */
    .chart-box{max-width:420px}
    .varga-select select{font-size:15px;padding:11px 30px}
    .varga-row select{flex:1;max-width:none}
    .chart-opts{gap:14px;margin:2px 0 8px}
    .opt{font-size:13.5px;padding:5px 2px;gap:9px}
    .opt input{width:18px;height:18px}
    .legend{gap:5px 12px;font-size:11px;justify-content:center}
    .mk-note{font-size:11.5px;line-height:1.7;margin-top:9px}
    /* wide data tables scroll horizontally inside their wrapper (not clipped) */
    .scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -13px;padding:0 13px}
    /* the gochar table becomes stacked cards via the #gochar-rows rules below;
       its own table needs display:block + hidden thead for that to work */
    #gochar-rows{display:block}
    /* Only the table that has card rules below may drop its header row. The
       graha table shares the .gtbl class but has nine columns and no card
       layout; unscoped, these rules stripped its headings and left it
       unreadable. It keeps a normal horizontal scroll instead. */
    .gtbl-cards{display:block;min-width:0}
    .gtbl-cards thead{display:none}
    #graha-view .scroll{overflow-x:auto;overflow-y:visible;margin:0 -13px;padding:0 13px;
      -webkit-overflow-scrolling:touch}
    #graha-view .gtbl{min-width:640px}
    #graha-view .gtbl th,#graha-view .gtbl td{padding:8px 8px;font-size:12.6px}
    #graha-view .gtbl th{position:sticky;top:0;background:var(--surface);z-index:1}
    #gochar-rows{display:block}
    #gochar-rows tr{
      display:grid;grid-template-columns:1fr auto;
      grid-template-areas:"name mot" "pos house" "nak nak";
      column-gap:12px;row-gap:3px;align-items:baseline;
      border:1px solid var(--line);border-radius:10px;background:var(--surface-2);
      padding:11px 14px;margin-bottom:8px;
    }
    #gochar-rows td{border:none;padding:0;font-size:13.5px}
    #gochar-rows .gg-name{grid-area:name;font-size:16.5px}
    #gochar-rows .gg-pos{grid-area:pos;white-space:normal}
    #gochar-rows .gg-nak{grid-area:nak;color:var(--muted);font-size:12.5px}
    #gochar-rows .gg-mot{grid-area:mot;text-align:right;font-size:14px}
    #gochar-rows .gg-house{grid-area:house;text-align:right;font-size:14px}
    #gochar-rows .gg-house::before{content:attr(data-label);color:var(--muted);font-family:var(--font-mono);font-size:10.9px;text-transform:uppercase;letter-spacing:.06em;margin-right:5px;font-weight:700}
    /* dasha explorer */
    .d-now{padding:11px 13px}
    .dn-lord{font-size:16px}
    .d-nav{gap:8px}
    .nowbtn{padding:9px 13px}
    /* Two rows on a phone: name and duration on the first, the date span
       underneath. The indent step drops from 16px to 8px — four levels of
       nesting were eating a fifth of the screen. */
    .drow{padding:10px 12px;grid-template-columns:16px 1fr auto;gap:2px 8px;
      padding-left:calc(12px + var(--d-depth,0) * 8px)}
    .drow-tw{grid-column:1;grid-row:1}
    .drow-main{grid-column:2;grid-row:1;min-width:0}
    .drow-l{font-size:14.5px;line-height:1.25}
    .drow-d{grid-column:3;grid-row:1;font-size:11.5px;padding:2px 7px}
    .drow-r{grid-column:2 / 4;grid-row:2;font-size:10.8px;white-space:normal}
    /* the deepest level is a leaf: its label is the longest and its box the
       tightest, so give it the full width and drop the pill's own padding */
      /* footer + formula */
    footer{font-size:12px}
    .formula-body{padding:2px 15px 16px}
    details summary{padding:14px 15px}
  }
  /* ===== phone polish (added) ===== */
  @media(max-width:600px){
    /* sub-tab rows (janma / numerology / KP) scroll sideways instead of piling up */
    /* The edge fade told the reader there was more to scroll to, but it ran
       12px in while the padding was only 5 — so the first tab, Details, sat
       inside the fade and looked cut off before anyone had scrolled anywhere.
       The fade is shorter now and the padding clears it, so the first and last
       tabs start on solid ground. */
    .subtabs, .nu-tabs, #jsubtabs, #kpsubtabs{
      flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch;
      scrollbar-width:none; -ms-overflow-style:none;
      margin-left:0; margin-right:0; padding-left:13px; padding-right:13px;
      -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 14px),transparent 100%);
              mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 14px),transparent 100%);
    }
    .subtabs::-webkit-scrollbar, .nu-tabs::-webkit-scrollbar,
    #jsubtabs::-webkit-scrollbar, #kpsubtabs::-webkit-scrollbar{display:none}
    .subtabs button, #jsubtabs button, #kpsubtabs button{
      flex:0 0 auto; white-space:nowrap; height:36px; min-height:0;
      padding:0 13px; font-size:12.5px;
    }
    .nu-tab{flex:0 0 auto; white-space:nowrap; min-height:40px}

    /* tap targets: nothing important below 40px tall */
    .lang button{min-height:34px}
    .tb-right button, .theme-toggle, #ioBtn{min-width:38px;min-height:38px;width:38px;height:38px}
    .place-clear{width:32px;height:32px}
    .btn, button.btn{min-height:44px}

    /* KP + data tables: let them scroll, keep headers legible */
    .kp-tw, .scroll{ -webkit-overflow-scrolling:touch; }
    .kp-t{font-size:12px}
    .kp-t th, .kp-t td{padding:8px 10px}
    /* KP chart: full width, side panel below. Sizing itself now comes from the
       shared .chart-box rules, so the KP kundli tracks the janma kundli. */
    .kp-cw{gap:14px}
    /* KP verdict rows wrap nicely */
    .kp-vk{flex-basis:64px}
    .kp-lk{flex:0 0 110px}
    /* KP dasha date column doesn't crush the label */
    .kp-dd{font-size:10px}
    .kp-dm>summary, .kp-da>summary{flex-wrap:wrap}
    /* horary input full width */
    .kp-hin{flex-wrap:wrap}
    .kp-hin input{flex:1 1 100%}
    .kp-hin .btn{flex:1 1 100%}

    /* significator / verdict cards breathe */
    .kp-vb, .kp-hb, .aj-card{padding:12px}
  }
  @media(max-width:440px){
    /* lat / lon side-by-side, UTC offset full width below */
    .row-3{grid-template-columns:1fr 1fr}
    .row-3>.field:last-child{grid-column:1 / -1}
    /* never let a long value blow out the layout */
    .prow .pv,.chip .v,.drow-r,.cresult,.wholine{overflow-wrap:anywhere}
  }
  /* ---- Learn button, sized last so no earlier breakpoint overrides it ----
     The right cluster is six controls wide on a phone, so this one gives up
     size in stages rather than all at once. The icon goes first and the word
     stays, because the word is what makes it findable and the icons beside it
     are already carrying the utilities. Only on the narrowest screens, where
     even a short word cannot fit, does it become a circle the same size as
     its neighbours. */
  @media(max-width:900px){
    .tb-right{--ctl-h:34px}
     .tb-right .learn-btn{height:var(--ctl-h);min-height:var(--ctl-h);width:auto;padding:0 12px;gap:6px;font-size:12.5px}
    .tb-right .learn-btn .ic{width:16px;height:16px}
  }
  @media(max-width:760px){
    .tb-right .learn-btn{padding:0 11px;gap:0}
    .tb-right .learn-btn .ic{display:none}
  }
  /* One row, always. The bar is brand + six controls; on a phone the controls
     are the fixed quantity and the logo is the elastic one, so everything
     stays on a single line and the logo gives up a few pixels instead. */
  @media(max-width:470px){
    /* Icon-only, the button loses its label and becomes a 34px square. Filled
       with gold-soft and edged in full-strength gold it read as a mustard
       block — gold looks expensive as a thin accent on a neutral ground and
       cheap as a flat fill. So at this size the fill goes, the edge drops to a
       hairline, and the metal is carried by the mark alone. */
    .tb-right .learn-btn{width:34px;min-width:34px;height:34px;min-height:34px;padding:0;justify-content:center;
      background:var(--surface);border-color:var(--learn-line);color:var(--learn-ink)}
    .tb-right .learn-btn:hover,.tb-right .learn-btn:active{
      background:var(--gold-soft);border-color:var(--gold);color:var(--learn-ink)}
    .tb-right .learn-btn span{display:none}
    .tb-right .learn-btn .ic{display:block;width:16px;height:16px}
    .tb-right button, .theme-toggle, #ioBtn{min-width:34px;min-height:34px;width:34px;height:34px}
    .appbar .tb-right{gap:5px}
    .brand-logo{max-height:27px}
    .brand{gap:8px}
  }
  @media(max-width:345px){
    .appbar{gap:5px;padding:8px 8px}
    .appbar .tb-right{gap:3px}
    .tb-right{--ctl-h:30px}
     .tb-right .learn-btn{width:var(--ctl-h);min-width:var(--ctl-h);height:var(--ctl-h);min-height:var(--ctl-h);padding:0}
    .tb-right button, .theme-toggle, #ioBtn{min-width:30px;min-height:30px;width:30px;height:30px}
    .lang button{padding:0 6px;font-size:9.5px}
    .brand-logo{max-height:22px}
  }
  @media(max-width:390px){
    .tb-right{--ctl-h:32px}
     .tb-right .learn-btn{width:var(--ctl-h);min-width:var(--ctl-h);height:var(--ctl-h);min-height:var(--ctl-h);padding:0}
    .tb-right .learn-btn .ic{width:15px;height:15px}
    .tb-right button, .theme-toggle, #ioBtn{min-width:32px;min-height:32px;width:32px;height:32px}
    .appbar .tb-right{gap:4px}
    .brand-logo{max-height:24px}
    .lang{height:var(--ctl-h)}
    .lang button{padding:0 7px;font-size:10px}
  }

  @media(max-width:380px){
    .appbar{gap:6px;padding:8px 11px}
    .lang button{min-height:0;height:100%}
    .wordmark{font-size:22px}

    
    
    .drow-l{font-size:14px}
    .chip .v{font-size:15px}
    .chart-box{max-width:100%}
  }
  /* ============ numerology ============ */
  .nu-top{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:6px}
  .nu-sys{display:flex;gap:6px;flex:0 0 auto}
  .nu-sysb{font-size:12px;font-weight:600;padding:7px 12px;border-radius:9px;cursor:pointer;border:1px solid var(--line-strong);background:var(--surface-2);color:var(--muted)}
  .nu-sysb.on{background:var(--sel);border-color:var(--sel);color:var(--on-sel)}
  .nu-sec{margin-top:22px}
  .nu-h{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--brand-deep,#9c1730);letter-spacing:.02em;margin-bottom:12px;padding-bottom:7px;border-bottom:1px solid var(--line)}
  .nu-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
  .nu-sysnote{border-left:2px solid var(--gold);padding-left:10px;margin-top:8px}

  /* ---- tab grouping ---- */
  .nu-tabgrp{align-self:center;font-size:10px;letter-spacing:.11em;text-transform:uppercase;
    color:var(--muted);padding:0 4px 0 10px;white-space:nowrap}
  .nu-tabgrp:first-child{padding-left:0}
  html[lang="hi"] .nu-tabgrp{letter-spacing:.02em;text-transform:none}

  /* ---- chart verification ---- */
  .nu-chks{display:flex;flex-wrap:wrap;gap:8px 14px;margin-top:10px}
  .nu-chks-k{font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);align-self:center}
  html[lang="hi"] .nu-chks-k{letter-spacing:.02em;text-transform:none}
  .nu-chk-w{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px}
  .nu-chk{font-size:11.5px;padding:3px 9px;border-radius:999px;border:1px solid var(--line);
    background:var(--surface-2);color:var(--ink-body)}
  .nu-chk.strong{border-color:var(--ok);color:var(--ok)}
  .nu-chk.weak{border-color:var(--brand);color:var(--brand)}
  .nu-chk.mixed{border-color:var(--gold);color:var(--gold)}

  /* ---- dasha agreement ---- */
  .nu-agree{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  .nu-agree-col{border:1px solid var(--line);border-radius:10px;padding:11px 13px;background:var(--surface-2)}
  .nu-agree.strong .nu-agree-col{border-color:var(--ok)}
  .nu-agree.partial .nu-agree-col{border-color:var(--gold)}
  .nu-agree-col span{display:block;font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
  html[lang="hi"] .nu-agree-col span{letter-spacing:.02em;text-transform:none}
  .nu-agree-col b{display:block;font:600 15px/1.35 var(--font-display);color:var(--ink);margin-top:4px}
  .nu-agree-col b i{font-style:normal;font-weight:500;font-size:13px;color:var(--ink-body)}

  /* ---- Lo Shu planes ---- */
  .nu-plane-list{display:flex;flex-direction:column;gap:7px}
  .nu-plane{display:flex;align-items:center;gap:11px}
  .nu-plane-k{flex:0 0 92px;font-size:12.5px;color:var(--ink-body)}
  .nu-plane-bar{flex:1 1 auto;height:6px;border-radius:999px;background:var(--surface-3);overflow:hidden}
  .nu-plane-bar>i{display:block;height:100%;background:var(--muted);opacity:.6}
  .nu-plane.full .nu-plane-bar>i{background:var(--ok);opacity:1}
  .nu-plane.empty .nu-plane-bar>i{background:var(--brand);opacity:1}
  .nu-plane-n{flex:0 0 34px;text-align:right;font-family:var(--font-mono);font-size:11px;
    font-variant-numeric:tabular-nums;color:var(--muted)}

  /* ---- essence ---- */
  .nu-ess-dbl td{background:var(--gold-soft)}

  /* ---- show the working ---- */
  .nu-work{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:7px;
    background:var(--surface-2)}
  .nu-work-k{font-size:11.5px;color:var(--muted);margin-bottom:7px}
  .nu-work-row{display:flex;flex-wrap:wrap;gap:5px}
  .nu-work-c{display:flex;flex-direction:column;align-items:center;min-width:22px;
    border:1px solid var(--line);border-radius:6px;padding:3px 5px;background:var(--surface-3)}
  .nu-work-c b{font-size:12px;font-weight:600;color:var(--ink)}
  .nu-work-c i{font-style:normal;font-family:var(--font-mono);font-size:10px;color:var(--muted)}
  .nu-work-sum{margin-top:8px;font-family:var(--font-mono);font-size:12px;
    font-variant-numeric:tabular-nums;color:var(--ink-body)}

  /* ---- name correction ---- */
  .nu-resp{display:flex;align-items:center;gap:12px;border:1px solid var(--line);
    border-radius:10px;padding:10px 13px;margin-bottom:6px;background:var(--surface-2)}
  .nu-resp.cur{border-color:var(--line-strong);background:var(--surface-3)}
  .nu-resp-nm{flex:1 1 auto;min-width:0;font-size:14px;font-weight:600;color:var(--ink);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .nu-resp-n{flex:0 0 auto;display:flex;align-items:baseline;gap:8px}
  .nu-resp-n i{font-style:normal;font-family:var(--font-mono);font-size:12.5px;
    font-variant-numeric:tabular-nums;color:var(--ink-body)}
  .nu-resp-n span{font-size:11px;color:var(--muted);max-width:180px;overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap}
  .nu-resp-sc{flex:0 0 42px;text-align:center;font-family:var(--font-mono);font-size:13px;
    font-weight:600;padding:3px 0;border-radius:7px;background:var(--surface-3);color:var(--ink)}
  .nu-resp-sc.excellent{background:var(--ok);color:#04170f}
  .nu-resp-sc.good{background:var(--gold);color:#1a1206}
  .nu-resp-sc.poor{background:var(--brand);color:#fff}

  /* ---- client book ---- */
  .nu-cl-list{display:flex;flex-direction:column;gap:6px}
  .nu-cl-row{display:flex;align-items:stretch;gap:6px}
  .nu-cl-open{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:10px;text-align:left;
    border:1px solid var(--line);border-radius:10px;padding:10px 13px;background:var(--surface-2);
    cursor:pointer;font-family:inherit}
  .nu-cl-open:hover{border-color:var(--brand)}
  .nu-cl-open:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
  .nu-cl-open b{font-size:13.5px;color:var(--ink)}
  .nu-cl-dob{font-family:var(--font-mono);font-size:11px;color:var(--muted)}
  .nu-cl-note{flex:1 1 auto;min-width:0;font-size:11.5px;color:var(--muted);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .nu-cl-del{flex:0 0 38px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);
    color:var(--muted);font-size:17px;cursor:pointer}
  .nu-cl-del:hover{border-color:var(--brand);color:var(--brand)}
  @media(max-width:560px){
    .nu-agree{grid-template-columns:1fr}
    .nu-plane-k{flex-basis:74px;font-size:12px}
    .nu-resp-n span{display:none}
  }

  .nu-card{border:1px solid var(--line);border-radius:12px;padding:12px;background:var(--surface-2);cursor:pointer;transition:.15s}
  .nu-card:hover{border-color:var(--brand)}

  /* ---- Ank Dasha ---- */
  .nu-dash-tabs{display:flex;gap:6px;flex-wrap:wrap;margin:2px 0 12px}
  .nu-dash-tab{border:1px solid var(--line);background:var(--surface-2);color:var(--muted);
    font:500 12px/1 var(--font-body);padding:8px 12px;border-radius:999px;cursor:pointer;transition:.15s}
  .nu-dash-tab:hover{border-color:var(--line-strong);color:var(--ink-body)}
  .nu-dash-tab.on{border-color:var(--brand);background:var(--brand-soft);color:var(--ink)}
  .nu-dash-tab:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
  /* The period in force, stated once and plainly. Everything below it is
     reference; this is the line most readers came for. */
  .nu-dash-now{border:1px solid var(--gold);background:var(--gold-soft);
    border-radius:12px;padding:12px 14px;margin-bottom:12px}
  .nu-dash-now-k{font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
  html[lang="hi"] .nu-dash-now-k{letter-spacing:.02em;text-transform:none}
  .nu-dash-now-v{font:600 17px/1.3 var(--font-display);color:var(--ink);margin-top:4px}
  .nu-dash-now-v i{font-style:normal;font-weight:500;font-size:14.5px;color:var(--ink-body)}
  .nu-dash-now-d{font-family:var(--font-mono);font-size:11.5px;font-variant-numeric:tabular-nums;
    color:var(--muted);margin-top:5px}
  .nu-dash-list{display:flex;flex-direction:column;gap:5px}
  .nu-dash-row{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface-2)}
  .nu-dash-row.now{border-color:var(--gold)}
  .nu-dash-head{display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;
    padding:10px 12px;background:none;border:0;cursor:pointer;text-align:left;font-family:inherit}
  .nu-dash-head:hover{background:var(--surface-3)}
  .nu-dash-head:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
  .nu-dash-lord{flex:0 0 auto;width:26px;height:26px;border-radius:8px;display:flex;
    align-items:center;justify-content:center;background:var(--surface-3);color:var(--ink);
    font-family:var(--font-mono);font-size:13px;font-weight:600}
  .nu-dash-row.now .nu-dash-lord{background:var(--gold);color:#1a1206}
  .nu-dash-lord.sm{width:22px;height:22px;font-size:11.5px}
  .nu-dash-nm{flex:1 1 auto;min-width:0;font-size:13px;color:var(--ink);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .nu-dash-dt{flex:0 0 auto;font-family:var(--font-mono);font-size:11px;
    font-variant-numeric:tabular-nums;color:var(--muted)}
  .nu-dash-age{flex:0 0 auto;width:44px;text-align:right;font-family:var(--font-mono);
    font-size:11px;font-variant-numeric:tabular-nums;color:var(--muted)}
  .nu-dash-subs{border-top:1px solid var(--line);padding:4px 0}
  .nu-dash-sub{display:flex;align-items:center;gap:10px;padding:6px 12px 6px 16px}
  .nu-dash-sub.now{background:var(--gold-soft)}
  .nu-dash-sub .nu-dash-nm{font-size:12.5px;color:var(--ink-body)}
  .nu-dash-sub.now .nu-dash-nm{color:var(--ink);font-weight:500}
  @media(max-width:560px){
    .nu-dash-dt{font-size:10px}
    .nu-dash-age{display:none}
    .nu-dash-sub{padding-left:12px}
  }
  .nu-k{font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}
  .nu-v{font-family:var(--font-display);font-size:26px;font-weight:700;color:var(--brand);line-height:1.15;margin:3px 0}
  .nu-v.master{color:var(--gold,#b4832a)}
  .nu-n{font-size:12px;color:var(--ink);font-weight:600}
  .nu-d{font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.45}
  .nu-ls{display:grid;grid-template-columns:repeat(3,64px);gap:7px;justify-content:center;margin:8px auto 14px}
  .nu-cell{aspect-ratio:1;border:1.5px solid var(--line-strong);border-radius:11px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--surface-2)}
  .nu-cell.has{border-color:var(--brand);background:rgba(215,46,71,.07)}
  .nu-cell.empty{opacity:.42;border-style:dashed}
  .nu-cn{font-family:var(--font-mono);font-size:15px;font-weight:700;color:var(--ink)}
  .nu-cc{font-size:10.5px;color:var(--brand);font-weight:700;margin-top:1px}
  .nu-cell.empty .nu-cn{color:var(--muted)}
  .nu-tags{display:flex;flex-wrap:wrap;gap:7px;margin-top:4px}
  .nu-tag{font-size:12px;font-weight:600;padding:5px 11px;border-radius:999px;background:var(--surface-2);border:1px solid var(--line-strong);color:var(--ink)}
  .nu-tag.miss{color:var(--muted)}
  .nu-tag.rep{color:var(--brand);border-color:var(--brand)}
  .nu-arr{padding:11px 0;border-bottom:1px solid var(--line)}
  .nu-arr:last-child{border-bottom:none}
  .nu-at{font-weight:600;color:var(--ink);font-size:13.5px}
  .nu-at.weak{color:var(--muted)}
  .nu-ad{font-size:12.5px;color:var(--muted);margin-top:2px;line-height:1.5}
  .nu-row{display:flex;justify-content:space-between;gap:12px;padding:9px 0;border-bottom:1px solid var(--line);font-size:13.5px}
  .nu-row:last-child{border-bottom:none}
  .nu-row .l{color:var(--muted)}
  .nu-row .r{font-weight:600;color:var(--ink);text-align:right}
  .nu-note{font-size:12px;color:var(--muted);margin-top:10px;line-height:1.5}
  .nu-warn{font-size:12.5px;color:var(--brand-deep,#9c1730);background:rgba(215,46,71,.08);border:1px solid rgba(215,46,71,.25);border-radius:10px;padding:10px 12px;margin-top:10px}
  @media(max-width:520px){ .nu-ls{grid-template-columns:repeat(3,56px)} }
  .nu-tabs{display:flex;gap:6px;flex-wrap:nowrap;overflow-x:auto;margin:14px 0 4px;padding-bottom:12px;border-bottom:1px solid var(--line);position:sticky;top:var(--appbar-h,64px);z-index:45;background:var(--surface);scrollbar-width:none;-ms-overflow-style:none}
  .nu-tabs::-webkit-scrollbar{display:none}
  .nu-tab{font-size:11.5px;font-weight:600;padding:6px 11px;border-radius:9px;cursor:pointer;border:1px solid var(--line-strong);background:var(--surface-2);color:var(--muted);white-space:nowrap;flex:0 0 auto}
  .nu-tab.on{background:var(--sel);border-color:var(--sel);color:var(--on-sel)}
  .nu-form{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;margin:16px 0;padding:14px;border:1px dashed var(--line-strong);border-radius:13px;background:var(--surface-2)}
  .nu-f{flex:0 0 auto;min-width:160px}
  .nu-f.grow{flex:1;min-width:200px}
  .nu-lbl{display:block;font-size:11.5px;font-weight:600;color:var(--muted);margin-bottom:5px}
  .nu-inp{width:100%;font-family:inherit;font-size:14px;color:var(--ink);background:var(--surface);border:1.5px solid var(--line-strong);border-radius:10px;padding:10px 12px;outline:none}
  .nu-inp:focus{border-color:var(--brand)}
  .nu-go{flex:0 0 auto;border:none;cursor:pointer;font-family:var(--font-display);font-weight:600;font-size:13.5px;color:#fff;background:linear-gradient(180deg,var(--brand),var(--brand-deep,#b0203a));border-radius:10px;padding:11px 18px}
  .nu-go:hover{filter:brightness(1.06)}
  .nu-res{border:1px solid var(--line);border-radius:14px;padding:16px;margin-bottom:12px;background:var(--surface-2)}
  .nu-res.hi{border-color:var(--brand);box-shadow:0 0 0 1px rgba(215,46,71,.12)}
  .nu-rh{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
  .nu-rn{font-family:var(--font-display);font-size:17px;font-weight:600;color:var(--ink)}
  .nu-rm{font-size:12px;color:var(--muted);margin-top:2px}
  .nu-sc{display:flex;align-items:baseline;gap:5px;flex:0 0 auto}
  .nu-scv{font-family:var(--font-display);font-size:28px;font-weight:700;line-height:1}
  .nu-scl{font-size:11px;color:var(--muted)}
  .nu-bar{height:6px;border-radius:99px;background:var(--line);margin-top:10px;overflow:hidden}
  .nu-bar i{display:block;height:100%;border-radius:99px}
  .v-excellent{color:#2f9e6b} .b-excellent{background:#2f9e6b}
  .v-good{color:#5a9e2f} .b-good{background:#5a9e2f}
  .v-fair{color:#b4832a} .b-fair{background:#b4832a}
  .v-poor{color:var(--brand)} .b-poor{background:var(--brand)}
  .nu-pts{margin-top:12px}
  .nu-pt{display:flex;gap:8px;align-items:flex-start;font-size:12.5px;line-height:1.55;padding:5px 0;color:var(--ink)}
  .nu-pt .ic{flex:0 0 auto;width:15px;height:15px;border-radius:50%;display:grid;place-items:center;font-size:10px;font-weight:700;color:#fff;margin-top:2px}
  .nu-pt .ic.good{background:#2f9e6b} .nu-pt .ic.bad{background:var(--brand)} .nu-pt .ic.warn{background:#b4832a}
  .nu-fit{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:9px;margin-top:12px}
  .nu-fc{border:1px solid var(--line);border-radius:10px;padding:9px;background:var(--surface)}
  .nu-fk{font-size:11px;color:var(--muted);font-weight:600}
  .nu-fv{font-family:var(--font-display);font-size:16px;font-weight:700;color:var(--brand);margin-top:2px}
  /* ============ KP ============ */
  .kp-tw{overflow-x:auto;border:1px solid var(--line);border-radius:12px;background:var(--surface-2)}
  .kp-t{width:100%;border-collapse:collapse;font-size:12.5px;white-space:nowrap}
  .kp-t th{text-align:left;padding:10px 12px;font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;
    color:var(--muted);font-weight:700;border-bottom:1px solid var(--line-strong);background:var(--surface)}
  .kp-t th.kp-hi{color:var(--brand)}
  .kp-t td{padding:9px 12px;border-bottom:1px solid var(--line);color:var(--ink)}
  .kp-t tbody tr:last-child td{border-bottom:none}
  .kp-t tbody tr:hover{background:var(--surface)}
  .kp-n{font-family:var(--font-mono);font-weight:700;color:var(--brand)}
  .kp-d{font-family:var(--font-mono);font-size:11.5px;color:var(--muted)}
  .kp-p{font-weight:600}
  .kp-sub{font-weight:700;color:var(--brand);background:rgba(215,46,71,.06)}
  .kp-ss{color:var(--muted);font-size:11.5px}
  .kp-pd{font-size:10px;color:var(--muted);background:var(--surface);padding:1px 5px;border-radius:99px;border:1px solid var(--line)}
  .kp-r{font-size:9.5px;color:var(--brand);font-weight:700;vertical-align:super}
  .kp-sig{font-family:var(--font-mono);font-size:11.5px;color:var(--muted)}
  .kp-hb{border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin-bottom:10px;background:var(--surface-2)}
  .kp-hh{display:flex;align-items:center;gap:10px;margin-bottom:9px;padding-bottom:8px;border-bottom:1px solid var(--line)}
  .kp-hn{flex:0 0 auto;width:30px;height:30px;border-radius:9px;display:grid;place-items:center;
    font-family:var(--font-mono);font-weight:700;font-size:14px;color:#fff;background:var(--brand)}
  .kp-hm{font-size:12px;color:var(--muted)}
  .kp-lv{display:flex;gap:10px;padding:4px 0;font-size:12.5px;align-items:baseline}
  .kp-lk{flex:0 0 165px;font-size:11px;color:var(--muted);font-weight:600}
  .kp-lp{color:var(--ink)}
  .kp-lp.s1{font-weight:700;color:var(--brand)}
  .kp-lp.s2{font-weight:600}
  @media(max-width:640px){ .kp-lk{flex:0 0 120px} .kp-t{font-size:11.5px} }
  /* KP chart pane. The chart column is laid out exactly like the janma chart
     (.stage > .chart-box > svg) so the KP kundli renders at the same size as
     the Vedic one instead of a slightly different max-width. The side panel
     only sits beside it when there is genuinely room for both; below that it
     drops underneath and the chart takes the full panel width. */
  .kp-cw{display:grid;grid-template-columns:1fr;gap:18px;align-items:start}
  @media(min-width:1040px){ .kp-cw{grid-template-columns:minmax(0,1fr) minmax(270px,340px)} }
  .kp-cl{min-width:0}
  .kp-cttl{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink);margin-bottom:10px;text-align:center}
  .kp-cl .stage{margin:2px 0 8px}
  .kp-cleg{margin-top:8px;text-align:center}
  .kp-cr{min-width:0}
  .kp-cs-h{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--brand);font-weight:700;margin-bottom:6px}
  .kp-cs-t{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface-2)}
  .kp-cs-r{display:flex;align-items:center;gap:8px;padding:6px 9px;border-bottom:1px solid var(--line);font-size:11.5px}
  .kp-cs-r:last-child{border-bottom:none}
  .kp-cs-r:hover{background:var(--surface)}
  /* header row for the two side lists — the columns were unlabelled, which is
     what made the block read as a wall of numbers */
  .kp-cs-r.hd{background:var(--surface);font-size:9.5px;text-transform:uppercase;letter-spacing:.05em;
    color:var(--muted);font-weight:700;padding:6px 9px;border-bottom:1px solid var(--line-strong)}
  .kp-cs-r.hd:hover{background:var(--surface)}
  .kp-cs-r.hd span{color:var(--muted);font-family:var(--font-body);font-weight:700}
  .kp-cs-n{flex:0 0 20px;font-family:var(--font-mono);font-weight:700;color:var(--brand);font-size:11px}
  .kp-cs-p{flex:0 0 62px;font-weight:600;color:var(--ink);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .kp-cs-s{flex:1 1 auto;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .kp-cs-d{flex:0 0 54px;text-align:right;font-family:var(--font-mono);font-size:10.5px;color:var(--muted)}
  .kp-cs-h2{flex:0 0 20px;text-align:center;font-family:var(--font-mono);font-size:10.5px;color:var(--brand);font-weight:700}
  .kp-cs-b{flex:0 0 62px;text-align:right;font-weight:700;color:var(--brand);font-size:11px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* the KP panes are cards like every other panel in the app; the first
     section inside one shouldn't push itself away from the card's own top */
  #kp-out .panel>.nu-sec:first-child{margin-top:0}
  #kp-out .panel>.nu-sec>.nu-h{margin-top:0}
  .kp-vb{border:1px solid var(--line);border-left-width:4px;border-radius:12px;padding:13px 15px;margin-bottom:10px;background:var(--surface-2)}
  .kp-vb.v-ok{border-left-color:#2f9e6b} .kp-vb.v-warn{border-left-color:#c9902c}
  .kp-vb.v-bad{border-left-color:var(--brand)} .kp-vb.v-neu{border-left-color:var(--line-strong)}
  .kp-vh{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:7px}
  .kp-vt{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink)}
  .kp-vv{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:4px 10px;border-radius:99px;white-space:nowrap}
  .kp-vv.ok{background:rgba(47,158,107,.14);color:#2f9e6b}
  .kp-vv.warn{background:rgba(201,144,44,.15);color:#a9761f}
  .kp-vv.bad{background:rgba(215,46,71,.12);color:var(--brand)}
  .kp-vv.neu{background:var(--surface);color:var(--muted)}
  .kp-vm{font-size:12.5px;color:var(--muted);margin-bottom:7px}
  .kp-vr{display:flex;gap:10px;font-size:12px;padding:2px 0;align-items:center}
  .kp-vk{flex:0 0 78px;font-size:10.5px;color:var(--muted);font-weight:600;text-transform:uppercase}
  .kp-vp{color:var(--ink);font-family:var(--font-mono);font-size:11.5px}
  .kp-hh2{display:inline-block;min-width:20px;text-align:center;padding:1px 5px;margin-right:4px;border-radius:6px;
    border:1px solid var(--line-strong);font-size:11px;color:var(--muted)}
  .kp-hh2.hit{background:rgba(47,158,107,.16);border-color:#2f9e6b;color:#2f9e6b;font-weight:700}
  .kp-hh2.miss{background:rgba(215,46,71,.12);border-color:var(--brand);color:var(--brand);font-weight:700}
  .kp-strong{background:rgba(47,158,107,.05)}
  .kp-own{font-size:10px;color:#2f9e6b;font-weight:600;margin-left:6px}
  .kp-grid td.ga{background:rgba(215,46,71,.07);font-weight:600}
  .kp-grid td.gb{background:rgba(215,46,71,.04)}
  .kp-t th.ga,.kp-t th.gb,.kp-t th.gc,.kp-t th.gd{text-align:center;font-size:12px}
  .kp-run{border:1px solid var(--brand);border-radius:12px;padding:13px 15px;background:rgba(215,46,71,.05)}
  .kp-runh{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--brand);font-weight:700;margin-bottom:7px}
  .kp-runp{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
  .kp-runl{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink)}
  .kp-arrow{color:var(--muted)}
  .kp-runm{font-size:11.5px;color:var(--muted);margin-top:6px;font-family:var(--font-mono)}
  .kp-dt{margin-top:8px}
  .kp-dm,.kp-da{border:1px solid var(--line);border-radius:10px;margin-bottom:6px;background:var(--surface-2)}
  .kp-da{margin:6px 0 6px 14px;background:var(--surface)}
  .kp-dm>summary,.kp-da>summary{cursor:pointer;padding:9px 12px;display:flex;align-items:center;gap:12px;font-size:13px;list-style:none}
  .kp-dm>summary::-webkit-details-marker,.kp-da>summary::-webkit-details-marker{display:none}
  .kp-dm>summary:before,.kp-da>summary:before{content:"\25b8";color:var(--muted);font-size:10px;transition:.15s}
  .kp-dm[open]>summary:before,.kp-da[open]>summary:before{transform:rotate(90deg)}
  .kp-dl{font-weight:600;color:var(--ink);flex:0 0 auto}
  .kp-dd{font-family:var(--font-mono);font-size:11px;color:var(--muted);margin-left:auto}
  .kp-dy{font-size:11px;color:var(--brand);font-weight:700}
  .kp-dp{display:flex;gap:12px;padding:6px 12px 6px 30px;font-size:12px;border-top:1px solid var(--line)}
  .kp-hf{border:1px solid var(--line);border-radius:12px;padding:15px;background:var(--surface-2);margin-bottom:14px}
  .kp-hin{display:flex;gap:9px;margin-top:6px}
  .kp-hin input{flex:0 0 130px;padding:9px 12px;border:1px solid var(--line-strong);border-radius:9px;
    background:var(--surface);color:var(--ink);font-family:var(--font-mono);font-size:14px}
  .kp-hasc{display:flex;align-items:center;gap:14px;border:1px solid var(--brand);border-radius:12px;
    padding:14px;background:rgba(215,46,71,.05);margin-bottom:6px}
  .kp-hn2{flex:0 0 auto;width:52px;height:52px;border-radius:13px;display:grid;place-items:center;
    font-family:var(--font-mono);font-size:20px;font-weight:700;color:#fff;background:var(--brand)}
  .kp-hs{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-weight:700}
  .kp-hv{font-size:13px;color:var(--ink);margin-top:3px}
  /* ============ doubts chat ============ */
  .doubts-panel{display:flex;flex-direction:column;max-width:760px;margin:0 auto}
  .dbt-head h2{margin-bottom:2px}
  .dbt-ctx{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--muted);margin-top:8px;cursor:pointer}
  .dbt-ctx input{width:15px;height:15px;accent-color:var(--brand)}
  .dbt-quick{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
  .dbt-chip{font-size:12.5px;font-weight:600;color:var(--ink);background:var(--surface-2,#f4eee2);border:1px solid var(--line-strong);border-radius:999px;padding:7px 13px;cursor:pointer;transition:.14s}
  .dbt-chip:hover{border-color:var(--brand);color:var(--brand)}
  .dbt-details{display:inline-block;margin-top:8px;font-size:12.5px;font-weight:600;color:var(--brand);background:none;border:none;padding:0;cursor:pointer;text-decoration:underline;text-underline-offset:2px}
  .chat-log{margin-top:14px;min-height:280px;max-height:min(56vh,560px);overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding:6px 2px}
  .chat-msg{max-width:86%;padding:11px 14px;border-radius:15px;font-size:14.5px;line-height:1.6;white-space:pre-wrap;word-wrap:break-word}
  .chat-msg.user{align-self:flex-end;background:linear-gradient(180deg,var(--brand),var(--brand-deep,#b0203a));color:#fff;border-bottom-right-radius:5px}
  .chat-msg.bot{align-self:flex-start;background:var(--surface-2,#f4eee2);color:var(--ink);border:1px solid var(--line);border-bottom-left-radius:5px}
  .chat-msg.bot b,.chat-msg.bot strong{color:var(--brand-deep,#9c1730)}
  .chat-msg.note{align-self:center;background:none;border:1px dashed var(--line-strong);color:var(--muted);font-size:12.5px;text-align:center;max-width:100%}
  .chat-msg.typing{color:var(--muted);font-style:italic}
  .chat-input-row{display:flex;gap:9px;align-items:flex-end;margin-top:12px;border-top:1px solid var(--line);padding-top:12px}
  #chat-input{flex:1;resize:none;font-family:inherit;font-size:14.5px;line-height:1.5;color:var(--ink);background:var(--surface-2,#faf5ec);border:1.5px solid var(--line-strong);border-radius:13px;padding:11px 14px;outline:none;max-height:140px;transition:border-color .15s}
  #chat-input:focus{border-color:var(--brand)}
  #chat-send{flex:0 0 auto;width:46px;height:46px;border:none;border-radius:13px;cursor:pointer;background:linear-gradient(180deg,var(--brand),var(--brand-deep,#b0203a));color:#fff;display:grid;place-items:center;transition:filter .15s,transform .1s}
  #chat-send:hover{filter:brightness(1.06)} #chat-send:active{transform:translateY(1px)}
  #chat-send[disabled]{opacity:.5;cursor:default}
  #chat-send svg{width:20px;height:20px}

  /* Beta strip. Gold rather than crimson: crimson is reserved for warnings in
     this section, and a permanent red bar would dull that signal. */
  /* saved plans bar */
  /* ---- Event Periods ---- */
  .ep-known{border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;margin-bottom:16px;
    background:var(--surface-2)}
  .ep-kh{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink);margin-bottom:4px}
  .ep-kintro{font-size:12.5px;line-height:1.6;color:var(--muted);margin:0 0 12px}
  .ep-kgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px 14px}
  @media(max-width:520px){.ep-kgrid{grid-template-columns:1fr}}
  .ep-kr{display:flex;flex-direction:column;gap:4px}
  .ep-kr label{font-size:12px;font-weight:600;color:var(--ink-body)}
  .ep-kr input{font:inherit;font-size:13px;padding:7px 9px;border-radius:9px;
    border:1px solid var(--line);background:var(--surface);color:var(--ink)}
  .ep-sep{display:inline-flex;align-items:center;gap:7px;margin-top:12px;font-size:12.5px}
  .ep-form{display:flex;flex-wrap:wrap;gap:12px 16px;align-items:flex-end;margin-bottom:16px}
  .ep-f{display:flex;flex-direction:column;gap:5px;min-width:230px;flex:1}
  .ep-f label{font-size:12px;font-weight:600;color:var(--ink-body)}
  .ep-f select{font:inherit;font-size:13.5px;padding:8px 10px;border-radius:9px;
    border:1px solid var(--line);background:var(--surface);color:var(--ink)}
  .ep-f-narrow{min-width:150px;flex:0 0 auto}
  .ep-kin{display:flex;align-items:center;gap:6px}
  .ep-kin input{flex:1;min-width:0}
  .ep-kclr{flex:0 0 auto;width:26px;height:26px;line-height:1;font-size:16px;
    border:1px solid var(--line);border-radius:8px;background:var(--surface);
    color:var(--muted);cursor:pointer;padding:0}
  .ep-kclr:hover{color:var(--ink);border-color:var(--line-strong)}
  .ep-khint{font-size:11px;color:var(--muted);margin-top:1px}
  .ep-kfoot{margin-top:11px;padding-top:10px;border-top:1px solid var(--line)}
  .ep-kcount{font-size:12px;color:var(--muted)}
  .ep-kcount.on{color:var(--ok);font-weight:600}
  /* Loading state. The old version was a small ring beside a line of text in a
     row-flex — the ring sat against the full text line-box and read as
     misaligned at every font size. This is a centred column instead, so
     nothing has to line up with anything, and it fills the space the results
     will occupy rather than leaving the panel looking empty. */
  /* The period scan uses the shared loading language above; see .ldbox/.orb/.skl */
  .ep-toast{position:fixed;left:50%;bottom:26px;transform:translate(-50%,14px);
    z-index:120;max-width:min(440px,calc(100vw - 32px));
    /* Explicit stack: the toast is appended to <body>, so it would otherwise
       inherit whatever the body default is rather than the app's type. */
    font-family:var(--font-body);font-weight:500;letter-spacing:.01em;
    padding:12px 17px;border-radius:12px;
    background:color-mix(in srgb,var(--ink) 88%,transparent);
    color:var(--surface);font-size:13px;line-height:1.5;text-align:center;
    box-shadow:var(--sh-3);backdrop-filter:blur(7px);-webkit-backdrop-filter:blur(7px);
    opacity:0;pointer-events:none;transition:opacity .22s ease,transform .22s ease}
  .ep-toast.show{opacity:1;transform:translate(-50%,0)}
  @media(prefers-reduced-motion:reduce){.ep-toast{transition-duration:.01ms}}
  .ep-dot{display:inline-block;width:8px;height:8px;border-radius:50%;
    margin-right:6px;vertical-align:0;background:var(--line-strong)}
  .ep-dot.t1{background:var(--muted)}
  .ep-dot.t2{background:var(--gold)}
  .ep-dot.t3{background:var(--ok)}
  .ep-p.t3{border-color:var(--ok);box-shadow:inset 0 0 0 1px var(--ok)}
  .ep-p.t2{border-color:var(--gold)}
  .ep-p.t3 .ep-pc{color:var(--ok);font-weight:600}
  .ep-p.t2 .ep-pc{color:var(--gold);font-weight:600}
  .ep-pdate{font-family:var(--font-mono);font-size:13px;font-weight:600;
    color:var(--ink);margin-top:6px;letter-spacing:.02em}
  .ep-p.t3 .ep-pdate{color:var(--ok)}
  .ep-pa{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-body);
    margin-top:5px}
  .ep-pd{color:var(--muted);font-size:11.5px}
  .ep-vage{font-family:var(--font-body);font-size:11.5px;color:var(--muted)}
  .ep-gate,.ep-warn,.ep-promise{border:1px solid var(--line);border-radius:var(--r-sm);
    padding:12px 14px;font-size:12.5px;line-height:1.6;color:var(--ink-body);margin-bottom:12px}
  .ep-promise{background:var(--surface-2)}
  .ep-warn{background:var(--gold-soft);border-color:var(--gold)}
  .ep-verify{border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;
    margin-bottom:16px;background:var(--surface)}
  .ep-vh{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink);margin-bottom:3px}
  .ep-vintro{font-size:12.5px;line-height:1.6;color:var(--muted);margin:0 0 11px}
  .ep-vrow{display:flex;flex-wrap:wrap;gap:6px 12px;align-items:baseline;
    padding:8px 0;border-top:1px solid var(--line)}
  .ep-vev{font-weight:600;font-size:13px;color:var(--ink);min-width:130px}
  .ep-vp{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-body)}
  .ep-vs{font-size:12px;color:var(--muted)}
  .ep-vrow.hit .ep-vs{color:var(--ok)}
  .ep-vrow.weak .ep-vs{color:var(--gold)}
  .ep-vsum{font-size:12.5px;line-height:1.6;color:var(--ink-body);margin:11px 0 0;
    padding-top:10px;border-top:1px solid var(--line)}
  .ep-p{border:1px solid var(--line);border-radius:var(--r);padding:15px 16px;margin-bottom:11px;
    background:var(--surface)}
  .ep-p.past{opacity:.92;border-style:dashed}
  .ep-ph{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;justify-content:space-between}
  .ep-pn{font-family:var(--font-mono);font-size:14px;font-weight:700;color:var(--ink)}
  .ep-pl{font-family:var(--font-body);font-weight:400;font-size:12px;color:var(--muted)}
  .ep-pw{font-family:var(--font-body);font-weight:400;font-size:11px;color:var(--muted);
    border:1px solid var(--line);border-radius:999px;padding:1px 8px;margin-left:4px;vertical-align:1px}
  .ep-pc{font-family:var(--font-mono);font-size:11.5px;color:var(--muted);
    background:var(--surface-3);padding:3px 10px;border-radius:999px}
  .ep-pb{margin-top:11px;display:grid;gap:6px}
  .ep-r{display:flex;gap:10px;font-size:12.5px;line-height:1.55}
  .ep-k{min-width:74px;font-weight:600;color:var(--muted);flex-shrink:0}
  .ep-v{color:var(--ink-body)}
  .ep-valid{margin-top:16px;padding:13px 15px;border-radius:12px;background:var(--surface-2);
    border:1px solid var(--line);font-size:12.5px;line-height:1.62;color:var(--ink-body)}
  .ep-valid b{color:var(--ink)}
  .vs-saves{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 12px}
  .vs-savebtn{font:inherit;font-size:12.5px;font-weight:600;padding:6px 13px;
    border-radius:9px;border:1px solid var(--sel);background:var(--sel);
    color:#fff;cursor:pointer}
  .vs-savebtn.ghost{background:transparent;color:var(--ink-body);border-color:var(--line)}
  .vs-savebtn:disabled{opacity:.45;cursor:default}
  .vs-saves select{font:inherit;font-size:12.5px;padding:6px 9px;border-radius:9px;
    border:1px solid var(--line);background:var(--surface);color:var(--ink);max-width:210px}
  .vs-savemsg{font-size:12px;color:var(--muted)}
  .vs-beta{display:flex;align-items:center;gap:11px;flex-wrap:wrap;
    background:var(--gold-soft);border:1px solid transparent;
    border-left:3px solid var(--gold);border-radius:0 var(--r-sm) var(--r-sm) 0;
    padding:10px 14px;margin:0 0 14px}
  .vs-beta-tag{font-family:var(--font-body);font-size:10.5px;font-weight:700;
    letter-spacing:.14em;text-transform:uppercase;color:#fff;background:var(--gold);
    padding:3px 9px;border-radius:99px;flex:0 0 auto}
  html[lang="hi"] .vs-beta-tag{letter-spacing:.04em;text-transform:none;
    font-family:"Noto Sans Devanagari","Nirmala UI",ui-sans-serif,sans-serif}
  .vs-beta-txt{font-size:12.5px;line-height:1.55;color:var(--ink-body);flex:1 1 240px}
  @media(max-width:520px){.vs-beta{gap:8px;padding:9px 12px}
    .vs-beta-txt{font-size:12px}}
  /* ---- Vastu ------------------------------------------------------------
     Built from the app's own tokens: cream surfaces, indigo ink, crimson
     brand, gold rail. The compass is the signature element — it gets the
     stage treatment the charts get, everything else stays quiet. */

  .vs-stage{
    position:relative; padding:26px 16px 20px; margin:2px 0 18px;
    background:radial-gradient(circle at 50% 42%,var(--surface-2),var(--surface));
    border:1px solid var(--line); border-radius:var(--r);
  }
  .vs-stage-cap{
    position:absolute; top:12px; left:16px;
    font-family:var(--font-body); font-size:10.5px; font-weight:600;
    letter-spacing:.14em; text-transform:uppercase; color:var(--muted);
  }
  html[lang="hi"] .vs-stage-cap{letter-spacing:.04em;text-transform:none}
  .vs-svg{display:block;width:100%;max-width:340px;height:auto;margin:0 auto}
  /* the mandala needs every pixel it can get: 9x9 cells must clear the 44px
     touch minimum, so let it use the full panel width on small screens */
  .vs-svg-wide{max-width:440px}
  @media(max-width:560px){
    .vs-stage{padding-left:6px;padding-right:6px}
    .vs-svg-wide{max-width:none;width:100%}
  }

  /* compass */
  .vs-sec{fill:var(--surface);stroke:var(--line);stroke-width:.7;transition:fill .18s ease}
  .vs-sec.q{fill:var(--surface-2)}
  .vs-sec.on{fill:var(--brand-soft);stroke:var(--brand);stroke-width:1.5}
  .vs-ring{fill:none;stroke:var(--line-strong);stroke-width:1}
  .vs-card{font-family:var(--font-display);font-size:12.5px;font-weight:600;
    fill:var(--ink);text-anchor:middle}
  .vs-ord{font-family:var(--font-body);font-size:9px;font-weight:600;
    fill:var(--muted);text-anchor:middle}
  .vs-needle{stroke:var(--brand);stroke-width:2.6;stroke-linecap:round}
  .vs-needle-tail{stroke:var(--line-strong);stroke-width:1.6;stroke-linecap:round}
  .vs-hub{fill:var(--surface);stroke:var(--brand);stroke-width:2}

  /* the reading beneath the compass */
  .vs-read{text-align:center;margin-top:2px}
  .vs-read .deg{font-family:var(--font-mono);font-size:12px;color:var(--muted);
    letter-spacing:.04em}
  .vs-read .zone{font-family:var(--font-display);font-size:26px;font-weight:600;
    color:var(--ink);line-height:1.15;margin:2px 0 0}
  html[lang="hi"] .vs-read .zone{font-size:23px;line-height:1.45}
  .vs-read .sub{font-size:12.5px;color:var(--muted);margin-top:3px}

  /* fact chips, reusing the app's .chip look with a gold rail */
  .vs-chips{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:16px}
  @media(max-width:520px){.vs-chips{grid-template-columns:1fr}}
  .vs-chip{background:linear-gradient(180deg,var(--surface),var(--surface-2));
    border:1px solid var(--line);border-radius:var(--r-sm);padding:12px 14px;
    position:relative;overflow:hidden}
  .vs-chip::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
    background:var(--gold);opacity:.55}
  .vs-chip .k{font-size:11px;letter-spacing:.02em;color:var(--muted);font-weight:600}
  .vs-chip .v{font-family:var(--font-display);font-size:17px;color:var(--ink);
    margin-top:3px;font-weight:600;line-height:1.25}

  .vs-pinit{font-family:var(--font-display);font-size:13px;font-weight:600;
    fill:var(--ink-body);text-anchor:middle;pointer-events:none}
  .vs-cell.hot .vs-pinit{fill:var(--sel)}
  .vs-mcard{font-family:var(--font-body);font-size:11px;font-weight:700;
    fill:var(--muted);text-anchor:middle;letter-spacing:.08em}
  #vsMandalaSvg{transform-origin:center center;transition:transform .12s ease-out;touch-action:none}
  .vs-stage.zoomed{overflow:hidden}
  #vsCompassSvg{touch-action:none;cursor:grab}
  #vsCompassSvg.dragging{cursor:grabbing}
  #vsCompassSvg.dragging .vs-needle{stroke-width:3.2}
  .vs-cmsg{margin-top:7px;font-size:12px;line-height:1.5;color:var(--muted);
    background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);
    padding:8px 11px}
  .vs-usecompass{display:inline-flex;align-items:center;gap:7px;margin-top:9px;
    font-family:var(--font-body);font-size:12.5px;font-weight:600;color:var(--sel);
    background:var(--sel-soft);border:1px solid transparent;border-radius:99px;
    padding:8px 14px;cursor:pointer;transition:.15s}
  .vs-usecompass:hover{background:var(--sel);color:var(--on-sel)}
  .vs-usecompass.live{background:var(--brand);color:#fff}
  .vs-usecompass.live svg{animation:vsPulse 1.6s ease-in-out infinite}
  @keyframes vsPulse{0%,100%{opacity:1}50%{opacity:.45}}
  @media(prefers-reduced-motion:reduce){.vs-usecompass.live svg{animation:none}}
  /* plan editor */
  .vs-plantools{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:12px}
  .vs-modes2{flex:0 0 auto}
  .vs-planbtns{display:flex;gap:7px;flex-wrap:wrap}
  .vs-tbtn{font-family:var(--font-body);font-size:12.5px;font-weight:600;color:var(--ink);
    background:var(--surface);border:1px solid var(--line);border-radius:99px;
    padding:8px 14px;cursor:pointer;transition:.14s}
  .vs-tbtn:hover{border-color:var(--sel);color:var(--sel)}
  .vs-tsel{font-family:var(--font-body);font-size:12.5px;padding:8px 10px;
    border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink)}
  .vs-rot{display:flex;align-items:center;gap:9px;flex:1 1 220px;min-width:200px}
  .vs-rot label{font-size:11.5px;color:var(--muted);font-weight:600;white-space:nowrap}
  .vs-rot input{flex:1 1 auto;accent-color:var(--sel)}
  .vs-rot output{font-family:var(--font-mono);font-size:12px;color:var(--ink);min-width:38px;text-align:right}
  #vsPlanSvg{touch-action:none}
  .vs-pz{fill:var(--surface-2);opacity:.55}
  .vs-pz.q{fill:var(--surface-3);opacity:.5}
  .vs-plot{fill:var(--surface);stroke:var(--ink);stroke-width:2;fill-opacity:.92}
  .vs-brahma{fill:var(--sel-soft);stroke:var(--sel);stroke-width:1;stroke-dasharray:4 3}
  .vs-vtxhit{fill:transparent;cursor:grab;pointer-events:all}
  .vs-vtx{fill:var(--surface);stroke:var(--sel);stroke-width:2.2;cursor:grab;pointer-events:none}
  .vs-vtx.sel,.vs-vtx:hover{fill:var(--sel)}
  .vs-rm{cursor:move}
  .vs-rmbox{fill:var(--brand-soft);stroke:var(--brand);stroke-width:1.4}
  .vs-rm.sel .vs-rmbox{stroke-width:2.4;fill:var(--brand-soft)}
  .vs-rmlbl{font-family:var(--font-body);font-size:9.5px;font-weight:600;
    fill:var(--ink);text-anchor:middle;pointer-events:none}
  .vs-rmgrip{fill:var(--brand);cursor:nwse-resize;pointer-events:none}
  .vs-narrow{stroke:var(--brand);stroke-width:2.4;stroke-linecap:round}
  .vs-ntxt{font-family:var(--font-display);font-size:12px;font-weight:700;
    fill:var(--brand);text-anchor:middle}
  .vs-an-sec{margin-bottom:20px}
  .vs-an-sec h4{font-family:var(--font-display);font-size:15px;font-weight:600;
    color:var(--ink);margin:0 0 9px;padding-bottom:6px;border-bottom:1px solid var(--line)}
  .vs-warnline{margin-top:5px;font-size:12px;color:var(--brand);font-weight:600}
  @media(max-width:560px){
    .vs-plantools{gap:8px}
    .vs-rot{flex:1 1 100%}
  }
  .vs-sensors{display:flex;flex-wrap:wrap;gap:9px;align-items:center;margin-top:12px}
  .vs-usecompass.alt{background:var(--gold-soft);color:var(--gold)}
  .vs-usecompass.alt:hover{background:var(--gold);color:#fff}
  .vs-usecompass.busy{opacity:.6;pointer-events:none}
  .vs-cmsg{flex:1 1 100%}
  .vs-sight{stroke:var(--brand);stroke-width:2.4;stroke-linecap:round}
  .vs-sightmark{fill:var(--brand)}
  .vs-tick{stroke:var(--line-strong);stroke-width:1}
  .vs-tick.maj{stroke:var(--ink-body);stroke-width:1.5}
  .vs-card.n{fill:var(--brand);font-size:14px}
  #vsDial{transition:transform .10s linear}
  @media(prefers-reduced-motion:reduce){#vsDial{transition:none}}
  .vs-compass-stage{background:radial-gradient(circle at 50% 40%,var(--surface),var(--surface-2))}
  .vs-bezel{fill:var(--surface-2);stroke:var(--line-strong);stroke-width:1.5}
  .vs-index{fill:var(--brand)}
  .vs-tick{stroke:var(--muted);stroke-width:.8;opacity:.7}
  .vs-tick.mid{stroke:var(--ink-body);stroke-width:1.1;opacity:.9}
  .vs-tick.maj{stroke:var(--ink);stroke-width:1.8;opacity:1}
  .vs-degl{font-family:var(--font-mono);font-size:9px;fill:var(--muted);text-anchor:middle}
  .vs-card{font-family:var(--font-display);font-size:17px;font-weight:700;
    fill:var(--ink);text-anchor:middle}
  .vs-card.n{fill:var(--brand);font-size:19px}
  .vs-read .zone-big{font-family:var(--font-display);font-size:40px;font-weight:600;
    color:var(--ink);line-height:1;letter-spacing:-.02em}
  .vs-usecompass.na{opacity:.55}
  .vs-usecompass.alt2{background:var(--sel-soft);color:var(--sel)}
  .vs-usecompass.alt2:hover{background:var(--sel);color:var(--on-sel)}
  .vs-siterow{display:flex;flex-wrap:wrap;gap:9px;align-items:center;margin-bottom:11px}
  .vs-siterow label{font-size:12px;color:var(--muted);font-weight:600}
  .vs-roadgrid{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:11px}
  .vs-roadopt{display:inline-flex;align-items:center;gap:6px;font-size:13px;
    border:1px solid var(--line);border-radius:99px;padding:7px 13px;cursor:pointer;background:var(--surface)}
  .vs-roadopt input{accent-color:var(--sel)}
  .vs-anglist{display:flex;gap:7px;flex-wrap:wrap;margin-top:8px}
  .vs-angle{font-family:var(--font-mono);font-size:12px;padding:4px 9px;border-radius:99px;
    background:var(--surface-2);border:1px solid var(--line);color:var(--ink-body)}
  .vs-angle.off{background:var(--brand-soft);border-color:var(--brand);color:var(--brand);font-weight:600}
  .vs-sug{margin-top:10px;font-size:12.5px;color:var(--ink-body)}
  .vs-sug i{font-style:normal;display:block;color:var(--muted);font-size:11px;
    text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:5px}
  .vs-sug span{display:inline-block;font-family:var(--font-mono);font-size:12px;
    background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);
    padding:5px 10px;margin:0 6px 6px 0}
  .vs-chart{display:flex;flex-direction:column;gap:6px}
  .vs-bar{display:grid;grid-template-columns:120px 1fr 52px;gap:10px;align-items:center}
  .vs-bar .lbl{font-size:12.5px;color:var(--ink-body);text-align:right}
  .vs-bar .track{height:20px;background:var(--surface-2);border:1px solid var(--line);
    border-radius:4px;overflow:hidden}
  .vs-bar .fill{height:100%;background:linear-gradient(90deg,var(--sel),var(--brand));
    border-radius:3px 0 0 3px;transition:width .3s ease}
  .vs-bar .val{font-family:var(--font-mono);font-size:12px;color:var(--ink);text-align:right}
  @media(max-width:520px){.vs-bar{grid-template-columns:82px 1fr 44px;gap:7px}
    .vs-bar .lbl{font-size:11px}}
  /* interactive states */
  .vs-sec{cursor:pointer}
  .vs-sec:focus{outline:none}
  .vs-sec.hot{fill:var(--sel-soft);stroke:var(--sel);stroke-width:1.6}
  .vs-graha{cursor:pointer}
  .vs-graha:focus{outline:none}
  .vs-gdot{fill:var(--surface);stroke:var(--line-strong);stroke-width:1;transition:.15s}
  .vs-graha:hover .vs-gdot,.vs-graha.hot .vs-gdot{fill:var(--sel);stroke:var(--sel)}
  .vs-gtxt{font-family:var(--font-body);font-size:9.5px;font-weight:700;
    fill:var(--ink-body);text-anchor:middle;pointer-events:none;transition:.15s}
  .vs-graha:hover .vs-gtxt,.vs-graha.hot .vs-gtxt{fill:var(--on-sel)}
  .vs-cell.has{cursor:pointer}
  .vs-cell.has:focus{outline:none}
  .vs-cell.has:hover .vs-pada,.vs-cell.hot .vs-pada{fill:var(--sel-soft);stroke:var(--sel);stroke-width:1.2}
  .vs-cell.hot .vs-pname{fill:var(--sel);font-weight:700}

  /* detail panel */
  .vs-detail{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);
    padding:16px 18px;margin-top:12px;min-height:190px}
  .vs-dt-empty{color:var(--muted);font-size:13px;line-height:1.6;text-align:center;padding:22px 6px}
  .vs-dt-hd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}
  .vs-dt-hd h4{font-family:var(--font-display);font-size:19px;font-weight:600;color:var(--ink);margin:0}
  .vs-dt-deg{font-family:var(--font-mono);font-size:11.5px;color:var(--muted);letter-spacing:.03em}
  .vs-dt-facts{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:11px}
  .vs-dt-facts span{background:var(--surface-2);border:1px solid var(--line);
    border-radius:99px;padding:5px 11px;font-size:12.5px;color:var(--ink)}
  .vs-dt-facts i{font-style:normal;color:var(--muted);font-size:11px;margin-right:6px;
    text-transform:uppercase;letter-spacing:.05em;font-weight:600}
  html[lang="hi"] .vs-dt-facts i{text-transform:none;letter-spacing:.02em}
  .vs-dt-pads{margin-top:10px;font-size:12px;color:var(--ink-body);line-height:1.6}
  .vs-dt-pads i{font-style:normal;display:block;color:var(--muted);font-size:11px;
    text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:3px}
  html[lang="hi"] .vs-dt-pads i{text-transform:none}
  .vs-dt-none{color:var(--muted);font-style:italic}
  /* mandala */
  .vs-pada{fill:var(--surface);stroke:var(--line);stroke-width:.6}
  .vs-pada.alt{fill:var(--surface-2)}
  .vs-pada.bs{fill:var(--sel-soft);stroke:var(--sel);stroke-width:1.1}
  .vs-pname{font-family:var(--font-body);font-size:5.6px;font-weight:500;
    fill:var(--ink-body);text-anchor:middle}
  .vs-pname.bs{font-family:var(--font-display);font-size:9px;font-weight:600;fill:var(--sel)}
  .vs-marma{fill:var(--brand);opacity:.45}
  .vs-mgrid{stroke:var(--line-strong);stroke-width:.9;fill:none}

  /* direction cards — replaces the old zone table */
  .vs-dirs{display:grid;grid-template-columns:repeat(2,1fr);gap:11px}
  @media(max-width:620px){.vs-dirs{grid-template-columns:1fr}}
  .vs-dir{border:1px solid var(--line);border-radius:var(--r-sm);
    background:var(--surface);padding:13px 15px;position:relative;overflow:hidden}
  .vs-dir.on{border-color:var(--brand);box-shadow:inset 3px 0 0 var(--brand)}
  .vs-dir h4{font-family:var(--font-display);font-size:15.5px;font-weight:600;
    color:var(--ink);margin:0 0 2px}
  .vs-dir .meta{font-size:11.5px;color:var(--muted);margin-bottom:9px;
    font-family:var(--font-mono);letter-spacing:.03em}
  .vs-claim{font-size:13px;line-height:1.62;color:var(--ink-body);margin:0 0 9px;
    padding-left:11px;border-left:2px solid var(--line)}
  .vs-claim:last-child{margin-bottom:0}
  .vs-src{display:block;font-size:11px;color:var(--muted);margin-top:3px;
    font-family:var(--font-mono);letter-spacing:.02em}

  .vs-tag{display:inline-block;font-family:var(--font-body);font-size:10px;
    font-weight:600;letter-spacing:.06em;text-transform:uppercase;
    padding:2px 7px;border-radius:99px;background:var(--surface-3);
    color:var(--muted);border:1px solid var(--line);margin-left:6px;vertical-align:1px}
  .vs-tag.mod{background:var(--gold-soft);border-color:transparent;color:var(--gold)}
  html[lang="hi"] .vs-tag{letter-spacing:.02em;text-transform:none}

  /* room verdict rows */
  .vs-rooms-list{display:flex;flex-direction:column;gap:10px}
  .vs-room{display:flex;align-items:center;gap:14px;border:1px solid var(--line);
    border-radius:var(--r-sm);background:var(--surface);padding:13px 15px}
  .vs-room .dial{flex:0 0 44px;width:44px;height:44px}
  .vs-room .body{flex:1 1 auto;min-width:0}
  .vs-room .nm{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink)}
  .vs-room .zn{font-size:12px;color:var(--muted);font-family:var(--font-mono);margin-top:1px}
  .vs-room .say{margin-top:5px;font-size:12.5px;color:var(--ink-body);line-height:1.5}
  .vs-stance{display:inline-block;font-weight:600;font-size:12.5px}
  .vs-stance.preferred{color:var(--ok)}
  .vs-stance.acceptable{color:var(--ink-body)}
  .vs-stance.advised-against{color:var(--brand)}
  .vs-stance.unstated{color:var(--muted);font-weight:500}

  /* ---- analysis: plain-language reading -------------------------------- */
  .vs-verdict{border:1px solid var(--line);border-left:3px solid var(--gold);
    border-radius:var(--r);background:linear-gradient(180deg,var(--surface),var(--surface-2));
    padding:16px 18px;margin:0 0 20px}
  .vs-verdict-hd{font-family:var(--font-body);font-size:10.5px;font-weight:600;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-bottom:7px}
  html[lang="hi"] .vs-verdict-hd{letter-spacing:.04em;text-transform:none}
  .vs-verdict-lead{margin:0;font-size:14px;line-height:1.68;color:var(--ink)}
  .vs-tally{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}
  .vs-t{font-size:12px;font-weight:600;padding:4px 11px;border-radius:99px;
    border:1px solid var(--line);background:var(--surface)}
  .vs-t.ok{color:var(--ok);border-color:var(--ok)}
  .vs-t.mid{color:var(--ink-body)}
  .vs-t.bad{color:var(--brand);border-color:var(--brand)}
  .vs-t.neu{color:var(--muted)}
  .vs-look{margin-top:14px}
  .vs-look i{font-style:normal;display:block;color:var(--muted);font-size:11px;
    text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:6px}
  html[lang="hi"] .vs-look i{text-transform:none;letter-spacing:.02em}
  .vs-look ol{margin:0;padding-left:18px}
  .vs-look li{font-size:13px;line-height:1.6;color:var(--ink-body);margin-bottom:5px}
  .vs-look li.s3::marker,.vs-look li.s2::marker{color:var(--brand)}

  .vs-room2{border:1px solid var(--line);border-radius:var(--r-sm);
    background:var(--surface);padding:14px 16px;border-left:3px solid var(--line-strong)}
  .vs-room2.st-preferred{border-left-color:var(--ok)}
  .vs-room2.st-acceptable{border-left-color:var(--line-strong)}
  .vs-room2.st-advised-against{border-left-color:var(--brand)}
  .vs-room2.st-unstated{border-left-color:var(--line)}
  .vs-room2.st-spread{border-left-color:var(--gold)}
  .vs-room2.st-out{border-left-color:var(--brand);border-style:dashed}
  .vs-room2-hd{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .vs-room2 .nm{font-family:var(--font-display);font-size:16px;font-weight:600;color:var(--ink)}
  .vs-room2 .where{font-size:12.5px;color:var(--muted);margin-top:3px;line-height:1.5}
  .vs-room2 .where b{color:var(--ink-body)}
  .vs-pill{font-size:11.5px;font-weight:600;padding:3px 10px;border-radius:99px;
    background:var(--surface-2);color:var(--ink-body);border:1px solid var(--line)}
  .vs-pill.preferred{background:var(--ok-soft,var(--surface-2));color:var(--ok);border-color:var(--ok)}
  .vs-pill.advised-against{background:var(--brand-soft);color:var(--brand);border-color:var(--brand)}
  .vs-pill.unstated{color:var(--muted)}
  .vs-plainline{margin:9px 0 0;font-size:13.5px;line-height:1.68;color:var(--ink-body)}
  .vs-plainline.ok{color:var(--ok)}
  .vs-plainline.warn{color:var(--brand)}
  .vs-srcline{margin-top:8px;font-family:var(--font-mono);font-size:11px;
    color:var(--muted);letter-spacing:.02em}

  .vs-dirgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:11px}
  @media(max-width:640px){.vs-dirgrid{grid-template-columns:1fr}}
  .vs-dircard{border:1px solid var(--line);border-radius:var(--r-sm);
    background:var(--surface);padding:13px 15px}
  .vs-dircard.used{border-color:var(--sel);box-shadow:inset 3px 0 0 var(--sel)}
  .vs-dircard .hd{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:6px}
  .vs-dircard .hd b{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink)}
  .vs-dircard .hd span{font-size:12px;color:var(--muted)}
  .vs-dircard p{margin:0;font-size:12.5px;line-height:1.6;color:var(--ink-body)}
  .vs-dircard .fit{margin-top:6px;font-size:12px;line-height:1.5;padding-left:14px;position:relative}
  .vs-dircard .fit::before{position:absolute;left:0;top:0;font-weight:700}
  .vs-dircard .fit.ok{color:var(--ok)}
  .vs-dircard .fit.ok::before{content:"\2713"}
  .vs-dircard .fit.no{color:var(--muted)}
  .vs-dircard .fit.no::before{content:"\00d7"}
  .vs-dircard .has{margin-top:9px;padding-top:8px;border-top:1px dashed var(--line);
    font-size:12px;color:var(--ink-body)}
  .vs-dircard:not(.used) .has{color:var(--muted);font-style:italic}

  /* source cards */
  .vs-srcbox{border:1px solid var(--line);border-radius:var(--r-sm);
    background:var(--surface);padding:14px 16px;margin-bottom:11px;position:relative}
  .vs-srcbox .hd{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
  .vs-srcbox b{font-family:var(--font-display);font-size:15.5px;font-weight:600;color:var(--ink)}
  .vs-srcbox .yr{font-family:var(--font-mono);font-size:11.5px;color:var(--muted);letter-spacing:.03em}
  .vs-srcbox p{margin:7px 0 0;font-size:13px;line-height:1.62;color:var(--ink-body)}

  .vs-note{font-size:12.5px;line-height:1.6;color:var(--muted);margin:14px 0 0;
    padding:12px 14px;background:var(--surface-2);border-radius:var(--r-sm);
    border:1px solid var(--line)}
  .vs-empty{padding:30px 20px;text-align:center;color:var(--muted);font-size:13.5px;
    line-height:1.65;border:1px dashed var(--line-strong);border-radius:var(--r);
    background:var(--surface-2)}

  .vs-bhava{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}
  @media(max-width:620px){.vs-bhava{grid-template-columns:repeat(2,1fr)}}
  @media(max-width:400px){.vs-bhava{grid-template-columns:1fr}}
  .vs-bh{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);
    padding:11px 13px}
  .vs-bh .n{font-family:var(--font-mono);font-size:11px;color:var(--brand);font-weight:600}
  .vs-bh .d{font-family:var(--font-display);font-size:14.5px;font-weight:600;
    color:var(--ink);margin-top:2px}
  .vs-bh .s{font-size:11.5px;color:var(--muted);margin-top:3px;line-height:1.45}

  .row2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  @media(max-width:520px){.row2{grid-template-columns:1fr}}
  .bnn-bbhead{text-align:center;padding:22px 16px 18px;margin-bottom:14px;
    background:radial-gradient(circle at 50% 40%,var(--surface-2),var(--surface));
    border:1px solid var(--line);border-radius:var(--r)}
  .bnn-bbsign{font-family:var(--font-display);font-size:30px;font-weight:600;
    color:var(--ink);line-height:1.1}
  .bnn-bbdeg{font-family:var(--font-mono);font-size:15px;color:var(--brand);margin-top:3px}
  .bnn-bbsub{font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;
    color:var(--muted);margin-top:7px;font-weight:600}
  html[lang="hi"] .bnn-bbsub{letter-spacing:.03em;text-transform:none}
  .bnn-est{color:var(--muted);font-style:italic}
  .bnn-disp{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
    color:var(--gold);background:var(--gold-soft);border-radius:99px;padding:2px 7px;margin-left:6px}
  html[lang="hi"] .bnn-disp{letter-spacing:.02em;text-transform:none}
  /* ---- BNN strings ---- */
  .bnn-str-read{margin-top:9px;padding-top:9px;border-top:1px solid var(--line);
    font-size:12.5px;line-height:1.65;color:var(--ink-body)}
  .bnn-str-read b{color:var(--ink)}
  /* One planet per row: name in a fixed column, its themes beside it. The
     previous single run-on line put eight planets' meanings into one grey
     paragraph with no spaces after the commas, which is not readable at any
     width. */
  .bnn-str-rows{margin-top:11px;display:flex;flex-direction:column;gap:1px;
    border-top:1px solid var(--line);padding-top:10px}
  .bnn-str-row{display:flex;align-items:baseline;gap:12px;padding:4px 0}
  .bnn-str-row.lead .bnn-str-p{color:var(--gold)}
  .bnn-str-p{flex:0 0 88px;font-weight:600;font-size:12.5px;color:var(--ink-body);
    display:flex;align-items:baseline;gap:5px}
  .bnn-str-p .bnn-r{font-style:normal;font-size:10px;color:var(--brand)}
  .bnn-str-th{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.65;color:var(--muted)}
  /* A middle dot with real space either side, instead of a bare comma. */
  .bnn-str-th em{font-style:normal;color:var(--line-strong);padding:0 7px}
  .bnn-str-read{margin-top:10px;padding-top:10px;border-top:1px solid var(--line);
    font-size:12.5px;line-height:1.65;color:var(--ink-body)}
  .bnn-str-read b{color:var(--ink)}
  @media(max-width:560px){
    .bnn-str-row{flex-direction:column;gap:2px;padding:6px 0}
    .bnn-str-p{flex-basis:auto}
    .bnn-str-th em{padding:0 5px}
  }

  .bnn-real{border-left:2px solid var(--ok);padding-left:10px}
  .bnn-mean{border-left:2px solid var(--gold);padding-left:10px}
  .bnn-pass{display:inline-block;font-family:var(--font-mono);font-size:11px;
    font-variant-numeric:tabular-nums;padding:2px 7px;margin:1px 2px 1px 0;
    border-radius:6px;background:var(--surface-3);color:var(--ink-body)}
  .bnn-pass.retro{background:var(--brand-soft);color:var(--brand)}
  .bnn-was{color:var(--muted);font-size:11px;opacity:.7}
  .bnn-str{border:1px solid var(--line);border-radius:var(--r-sm);padding:12px 14px;margin-bottom:9px;
    background:var(--surface-2)}
  /* A string reaching four or more bodies is the dominant theme, so it gets
     the gold edge. Everything shorter stays quiet. */
  .bnn-str.big{border-left:3px solid var(--gold)}
  .bnn-str-hd{display:flex;align-items:baseline;gap:10px;margin-bottom:9px}
  .bnn-str-hd b{font-family:var(--font-display);font-size:14px;color:var(--ink)}
  .bnn-str-n{margin-left:auto;font-family:var(--font-mono);font-size:10.5px;
    font-variant-numeric:tabular-nums;color:var(--muted)}
  .bnn-str-flow{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
  .bnn-str-node{display:flex;align-items:center;gap:6px;flex-wrap:wrap;
    background:var(--surface-3);border-radius:8px;padding:6px 9px}
  .bnn-str-node>i{font-style:normal;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;
    color:var(--muted);margin-right:2px}
  html[lang="hi"] .bnn-str-node>i{letter-spacing:.02em;text-transform:none}
  .bnn-str-node b{font-weight:600;font-size:13px;color:var(--ink);display:inline-flex;
    align-items:baseline;gap:4px}
  .bnn-str-node b em{font-style:normal;font-family:var(--font-mono);font-size:10.5px;
    font-variant-numeric:tabular-nums;color:var(--muted)}
  .bnn-str-arrow{color:var(--muted);font-size:11px}
  .bnn-str-join{color:var(--gold);font-size:14px}
  @media(max-width:560px){
    .bnn-str-flow{gap:5px}
    .bnn-str-node{padding:5px 8px}
    .bnn-str-node b{font-size:12.5px}
  }

  .bnn-chain{border:1px solid var(--line);border-radius:var(--r-sm);padding:13px 15px;    margin-bottom:10px;background:var(--surface)}
  .bnn-chain.intact{border-left:3px solid var(--ok)}
  .bnn-chain.partial{border-left:3px solid var(--gold)}
  .bnn-chain.broken{border-left:3px solid var(--line-strong);opacity:.75}
  .bnn-chain-hd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:9px}
  .bnn-chain-hd b{font-family:var(--font-display);font-size:15px;color:var(--ink)}
  .bnn-chain-score{font-size:12px;color:var(--muted)}
  .bnn-chain-state{margin-left:auto;font-size:11.5px;font-weight:600;color:var(--muted)}
  .bnn-chain.intact .bnn-chain-state{color:var(--ok)}
  .bnn-chain-flow{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
  .bnn-node{font-size:13.5px;font-weight:600;color:var(--ink);background:var(--surface-2);
    border:1px solid var(--line);border-radius:99px;padding:5px 12px}
  .bnn-node i{font-style:normal;color:var(--muted);font-weight:400;font-size:12px}
  .bnn-link{font-family:var(--font-mono);letter-spacing:-1px}
  .bnn-link.on{color:var(--ok)}
  .bnn-link.off{color:var(--line-strong)}
  .bnn-chain-note{margin:9px 0 0;font-size:12.5px;line-height:1.55;color:var(--muted)}
  .bnn-axis{border:1px solid var(--line);border-radius:var(--r);padding:16px;
    background:radial-gradient(circle at 50% 40%,var(--surface-2),var(--surface));margin-bottom:14px}
  .bnn-axis-pair{display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap}
  .bnn-axis-rel{font-size:11.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
    padding:4px 11px;border-radius:99px;background:var(--surface-3);color:var(--muted)}
  .bnn-axis-rel.conjunct{background:var(--brand-soft);color:var(--brand)}
  .bnn-axis-rel.drishti{background:var(--gold-soft);color:var(--gold)}
  html[lang="hi"] .bnn-axis-rel{letter-spacing:.02em;text-transform:none}
  .bnn-h4{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--ink);
    margin:22px 0 8px;padding-bottom:6px;border-bottom:1px solid var(--line)}
  .bnn-pv{border:1px solid var(--line);border-radius:var(--r-sm);padding:13px 15px;
    margin-bottom:10px;background:var(--surface)}
  .bnn-pv-pair{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:center}
  .bnn-pv-swap{font-size:20px;color:var(--brand);line-height:1}
  /* ---- the reading, inside the graha panel ---- */
  .ga-phala{border:1px solid var(--line);border-left:3px solid var(--brand);
    border-radius:var(--r);padding:16px 18px;margin:16px 0 4px;
    background:var(--surface-2)}
  .ga-phala .ph-lead:last-child{margin-bottom:0}
  .ga-phala .ph-note{font-size:12px;line-height:1.6;color:var(--muted);
    border:1px dashed var(--line-strong);border-radius:8px;padding:9px 11px;margin:0 0 12px}

  /* ---- phala readings ---- */
  .ph-card{border:1px solid var(--line);border-radius:var(--r-lg);padding:20px 22px;
    margin:0 0 14px;background:var(--surface)}
  .ph-head{display:flex;align-items:flex-start;gap:13px;margin:0 0 14px;
    padding-bottom:13px;border-bottom:1px solid var(--line)}
  .ph-gl{flex:0 0 auto;width:38px;height:38px;border-radius:11px;display:grid;
    place-items:center;font-size:19px;background:var(--surface-2);border:1px solid var(--line);color:var(--ink)}
  .ph-head h3{margin:0;font-family:var(--font-display);font-size:16px;color:var(--ink)}
  .ph-sub{margin:3px 0 0;font-family:var(--font-mono);font-size:10.5px;
    letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}
  .ph-score{margin-left:auto;font-family:var(--font-mono);font-size:10.5px;
    letter-spacing:.06em;text-transform:uppercase;color:var(--muted);white-space:nowrap;
    padding:5px 10px;border-radius:999px;border:1px solid var(--line);background:var(--surface-2)}
  .ph-score b{color:var(--ink);font-size:12px;margin-left:3px}
  .ph-score.ok{color:#1f7a55;border-color:rgba(31,122,85,.3)}
  .ph-score.bad{color:var(--brand-deep);border-color:var(--brand-soft);background:var(--brand-soft)}
  /* the reading itself, sized to be read rather than scanned */
  /* Matched to the effects section below it, so the two read as one document
     rather than two panels that happen to sit together. */
  .ph-lead{margin:0 0 11px;font-size:14px;line-height:1.65;color:var(--ink-body)}
  .ph-lead.ph-first{font-family:var(--font-mono);font-size:12.7px;letter-spacing:.12em;
    text-transform:uppercase;color:var(--brand);font-weight:700;line-height:1.5;margin-bottom:10px}
  /* the working, folded away by default */
  .ph-tech{margin-top:16px;border-top:1px solid var(--line);padding-top:12px}
  .ph-tech summary{cursor:pointer;list-style:none;font-family:var(--font-mono);
    font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);
    display:flex;align-items:center;gap:7px;user-select:none}
  .ph-tech summary::-webkit-details-marker{display:none}
  .ph-tech summary::before{content:"+";font-size:13px;line-height:1;color:var(--brand)}
  .ph-tech[open] summary::before{content:"\2212"}
  .ph-tech summary:hover{color:var(--ink)}
  .ph-tech p{margin:12px 0 0;font-size:12.8px;line-height:1.72;color:var(--muted)}
  .ph-card p{margin:0 0 11px;font-size:13.8px;line-height:1.8;color:var(--ink-body)}
  .ph-card p:last-child{margin-bottom:0}

  @media(max-width:600px){ .ph-card{padding:16px 15px} }

  /* ---- navatara chakra ---- */
  .nt-view{margin:0 0 14px}
  .nt-chart{display:flex;justify-content:center;padding:4px 0 2px}
  .nt-svg{width:100%;max-width:600px;height:auto;overflow:visible}
  .nt-svg .nt-cell{stroke:var(--line);stroke-width:.7}
  .nt-svg .nt-ring{fill:none;stroke:var(--line);stroke-width:.7}
  .nt-svg .nt-rim{fill:none;stroke:var(--line-strong);stroke-width:1.1}
  .nt-svg .nt-spoke{stroke:var(--line-strong);stroke-width:.8}
  .nt-svg .nt-cellt{font-family:var(--font-body);font-size:10.2px;font-weight:700;
    fill:var(--ink);text-anchor:middle;dominant-baseline:middle;letter-spacing:.005em}
  .nt-svg .nt-tnum{font-family:var(--font-body);font-size:10.2px;font-weight:700;
    text-anchor:middle;dominant-baseline:middle;opacity:.6}
  .nt-svg .nt-tname{font-family:var(--font-body);font-size:10.2px;font-weight:700;
    text-anchor:middle;dominant-baseline:middle;letter-spacing:.005em}
  .nt-svg .nt-gl{font-family:var(--font-mono);font-size:8.6px;font-weight:700;
    letter-spacing:-.01em;fill:var(--ink);text-anchor:middle;dominant-baseline:middle}
  .nt-svg .nt-hub{fill:var(--surface);stroke:var(--line-strong);stroke-width:1.1}
  .nt-svg .nt-hubt{font-family:var(--font-mono);font-size:7.4px;fill:var(--muted);
    text-anchor:middle;letter-spacing:.13em;text-transform:uppercase}
  .nt-svg .nt-hubn{font-family:var(--font-display);font-size:15px;fill:var(--ink);text-anchor:middle}
  @media(max-width:600px){
    .nt-svg .nt-cellt,.nt-svg .nt-tname,.nt-svg .nt-tnum{font-size:9.6px}
    .nt-svg .nt-tname{font-size:8.8px}
    .nt-svg .nt-tnum{font-size:10px}
  }

  /* ---- nava tara ---- */
  .nt-janma{font-size:13px;color:var(--ink-body);margin:0 0 12px}
  .nt-tbl{width:100%;border-collapse:collapse;min-width:640px;font-size:12px}
  .nt-tbl th{font-family:var(--font-mono);font-size:9.6px;letter-spacing:.06em;
    text-transform:uppercase;color:var(--muted);font-weight:600;padding:8px 9px;
    border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
  .nt-tbl td{padding:9px;border-bottom:1px solid var(--line-2);vertical-align:top;
    color:var(--ink-body);line-height:1.5}
  .nt-tbl .nt-n{white-space:nowrap;font-weight:600}
  .nt-tbl .nt-n b{font-family:var(--font-mono);font-size:10px;color:var(--muted);margin-right:5px}
  .nt-tbl .nt-k{font-size:11.5px;color:var(--muted)}
  .nt-tbl .nt-r{font-size:11.5px}
  .nt-tbl .nt-o{white-space:nowrap;font-weight:600;color:var(--ink)}
  .nt-tbl tr.nt-good .nt-n{color:#1f7a55}
  .nt-tbl tr.nt-bad .nt-n{color:var(--brand-deep)}
  .nt-tbl tr.nt-mixed .nt-n{color:var(--gold)}
  .nt-tbl tr.nt-bad{background:var(--brand-soft)}
  @media(max-width:600px){ .nt-tbl{min-width:600px;font-size:11.4px} }

  /* ---- maitri tables ---- */
  .mt-h{font-family:var(--font-display);font-size:14.5px;color:var(--ink);margin:20px 0 4px}
  .mt-h:first-child{margin-top:0}
  .mt-note{font-size:11.5px;color:var(--muted);margin:0 0 10px;line-height:1.5}
  .mt-tbl{width:100%;border-collapse:collapse;min-width:560px;font-size:11.5px}
  .mt-tbl th{font-family:var(--font-mono);font-size:9.6px;letter-spacing:.06em;
    text-transform:uppercase;color:var(--muted);font-weight:600;padding:8px 6px;
    border-bottom:1px solid var(--line);text-align:center;white-space:nowrap}
  .mt-tbl tbody th{text-align:left;border-right:1px solid var(--line);
    color:var(--ink-body);padding-left:0}
  .mt-tbl td{padding:7px 6px;text-align:center;border-bottom:1px solid var(--line-2);
    white-space:nowrap;font-weight:600}
  .mt-tbl .m-am{color:#0f6b4a;background:rgba(15,107,74,.11)}
  .mt-tbl .m-fr{color:#2f9e8f}
  .mt-tbl .m-nu{color:var(--muted)}
  .mt-tbl .m-en{color:var(--brand-deep)}
  .mt-tbl .m-as{color:var(--brand-deep);background:var(--brand-soft)}
  .mt-tbl .m-self{color:var(--faint,var(--muted));background:var(--surface-2)}
  @media(max-width:600px){ .mt-tbl{min-width:520px;font-size:10.8px} }

  /* ---- flat controls -----------------------------------------------------
     Every button in the app was carrying a drop shadow and, in several cases,
     a vertical gradient — the two things that read as a raised, three-
     dimensional key. Panels and cards keep their elevation, because that is
     what tells a surface from a control sitting on it; the controls
     themselves are now flat, and lean on fill, border and colour instead.
     Declared last so it lands regardless of where each rule was defined. */
  .subtabs button,
  .cstyle-toggle button,
  .dsys button,
  .lang button,
  .nowbtn,
  .varga-info-btn,
  .acct-btn,
  .cw-btn,
  .cw-btn-main,
  .mode-btn,
  .chip,
  .btn,
  button.primary,
  button.ghost,
  .kbtn,
  .ep-go,
  .rect-go,
  .vs-go{
    box-shadow:none !important;
    text-shadow:none;
    filter:none;
  }
  /* gradients flattened to their own solid fill */
  .cw-btn-main{background:var(--fill-strong)}
  .subtabs button[aria-selected="true"]{background:var(--sel)}
  .cstyle-toggle button[aria-selected="true"]{background:var(--sel)}
  .nowbtn{background:var(--surface-2)}
  .acct-btn{background:var(--fill-strong)}
  .varga-info-btn{background:var(--surface-2)}

  /* the press was a lift-and-drop; make it a simple tint change instead */
  .subtabs button:active,
  .cstyle-toggle button:active,
  .dsys button:active,
  .nowbtn:active,
  .acct-btn:active,
  .cw-btn:active,
  .mode-btn:active,
  .btn:active{ transform:none; filter:brightness(.94) }

  /* the selected-tab underline was a glowing bar; keep the bar, drop the glow */
  .mode-btn[aria-selected="true"]::after{ box-shadow:none !important }
  /* The credit line when a coupon beat it: shown, struck through, so the
     ledger still explains itself instead of a row silently vanishing. */
  .acct-sum-row.unused i{text-decoration:line-through;opacity:.5}
  .acct-sum-row.unused b{opacity:.6}

  /* The way back to a discussion somebody left to buy a plan. */
  .cm-back{position:fixed;left:50%;bottom:22px;transform:translate(-50%,14px);
    z-index:80;display:flex;align-items:center;gap:12px;flex-wrap:wrap;
    background:var(--surface);border:1px solid var(--brand);border-radius:999px;
    padding:10px 18px;box-shadow:var(--sh-3);opacity:0;
    transition:opacity .25s,transform .25s;max-width:calc(100vw - 28px)}
  .cm-back.go{opacity:1;transform:translate(-50%,0)}
  .cm-back span{font-size:13px;color:var(--muted)}
  .cm-back a{font-size:13px;font-weight:600;color:var(--brand);text-decoration:none;white-space:nowrap}
  .cm-back a:hover{text-decoration:underline}

/* Typing must not zoom the page.

   iOS Safari zooms in whenever a focused field is set below 16px, and every
   field here was 13–14.5px. The page then sits magnified and off-centre and
   the only way back is to pinch out — which reads as the site breaking when
   somebody starts to write.

   The usual shortcut is maximum-scale=1 on the viewport tag. That is not used
   here: it disables pinch-zoom for everybody, including people who need it to
   read at all. Sixteen pixels on the field itself fixes the zoom and takes
   nothing away. Only on touch screens, so the desk layout is untouched. */
@media (pointer: coarse) {
  input,select,textarea,.in,.cpw-in{font-size:16px}
}

  /* The two-month tag.

     It carried "Ultra saving" beside the six-month plan, which now saves three
     times as much — identical words on both made the weaker claim look like
     the stronger one. This says what the plan actually is: the shortest way
     in. It moves, because it is competing with a gold badge and a red one for
     the same glance. */
  .pw-plan-quick{
    position:absolute;top:-9px;left:50%;transform:translateX(-50%);
    padding:3px 10px;border-radius:999px;white-space:nowrap;
    font-size:9px;font-weight:800;letter-spacing:.10em;text-transform:uppercase;
    color:#08313f;
    background:linear-gradient(110deg,#7fe7e0,#41c9be 45%,#7fe7e0 90%);
    background-size:220% 100%;
    box-shadow:0 3px 10px color-mix(in srgb,#41c9be 38%,transparent);
    animation:pwQuickSheen 2.6s linear infinite, pwQuickBob 3.2s ease-in-out infinite;
  }
  @keyframes pwQuickSheen{ to{ background-position:-220% 0 } }
  @keyframes pwQuickBob{
    0%,100%{ transform:translateX(-50%) translateY(0) }
    50%    { transform:translateX(-50%) translateY(-2px) }
  }
  @media(prefers-reduced-motion:reduce){ .pw-plan-quick{animation:none} }

  /* ---- buying a plan from inside the account panel ----

     Class names of its own. `.acct-plan` was already taken by the small plan
     chip beside a subscriber's name, which on phones carries
     `order:3; margin-left:66px` — so these tiles inherited a 66px indent and
     a reshuffle, and the block looked thrown together for reasons no amount of
     new CSS would explain. */
  .acct-buy{margin:16px 0 4px}
  .acct-buy-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
    gap:10px;grid-auto-rows:1fr;align-items:stretch}
  .acct-buy-note{margin:12px 0 0;font-size:11.5px;color:var(--muted);text-align:center}

  .acct-buy-tile{position:relative;display:flex;flex-direction:column;align-items:center;
    justify-content:center;gap:5px;min-height:88px;height:100%;margin:0;
    padding:14px 10px;border-radius:14px;cursor:pointer;
    border:1.5px solid var(--line-strong);background:var(--surface-2);
    color:var(--ink);font-family:inherit;text-align:center;
    transition:border-color .16s, transform .16s, box-shadow .16s, background .16s}
  .acct-buy-tile:hover{border-color:var(--brand);transform:translateY(-2px);
    box-shadow:0 8px 20px -10px var(--brand)}
  .acct-buy-tile:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
  .acct-buy-tile i{font-style:normal;font-size:10px;letter-spacing:.09em;line-height:1;
    text-transform:uppercase;color:var(--muted);font-weight:700}
  .acct-buy-tile b{font:700 20px/1.05 var(--font-display);letter-spacing:-.02em}
  /* Every tile keeps three lines, so a plan with no saving does not sit
     shorter than the one beside it. */
  .acct-buy-tile em{font-style:normal;font-size:11px;line-height:1;font-weight:700;
    color:var(--ok);min-height:11px}
  .acct-buy-tile em.flat{color:var(--muted);font-weight:600}

  .acct-buy-tile.best{grid-column:1/-1;min-height:78px;border-color:var(--gold);
    background:linear-gradient(180deg,var(--gold-soft),transparent 80%)}
  .acct-buy-tile.best i{color:var(--gold)}
  .acct-buy-tile.best b{font-size:22px}

  .acct-buy-tile.sel{border-color:var(--brand);background:var(--brand-soft);
    box-shadow:0 0 0 2px var(--brand-soft)}
  .acct-buy-tile.sel i{color:var(--brand)}

  @media(max-width:360px){
    .acct-buy-grid{gap:8px}
    .acct-buy-tile{min-height:80px;padding:12px 8px}
    .acct-buy-tile b{font-size:18px}
  }

/* [hidden] must mean hidden.

   The browser's own rule is `[hidden]{display:none}`, which any author rule
   that sets `display` outranks — so `.acct-change{display:flex}` quietly kept
   a button on screen that the code had hidden. Nearly three hundred classes in
   this file set display, so rather than guard them one at a time, one rule
   restores what the attribute is supposed to mean.

   !important is the right tool exactly once: for a rule that must beat every
   other rule by design. */
[hidden]{display:none !important}

  /* ---- the invitation to install ---- */
  .install-bar{position:fixed;left:50%;bottom:16px;z-index:70;
    transform:translate(-50%,16px);opacity:0;
    transition:opacity .28s,transform .28s cubic-bezier(.34,1.4,.64,1);
    display:flex;align-items:center;gap:12px;
    width:min(calc(100vw - 24px),420px);padding:10px 10px 10px 12px;
    border-radius:16px;background:var(--surface);
    border:1px solid var(--line-strong);
    box-shadow:0 14px 40px -12px rgba(35,10,77,.35),0 2px 8px rgba(35,10,77,.12)}
  .install-bar.in{opacity:1;transform:translate(-50%,0)}
  .install-bar img{width:38px;height:38px;border-radius:9px;flex:none}
  .install-t{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
  .install-t b{font-size:13.5px;font-weight:700;color:var(--ink);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .install-t span{font-size:11.5px;color:var(--muted);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .install-go{flex:none;border:0;border-radius:99px;cursor:pointer;
    background:var(--brand);color:#fff;font-family:inherit;
    font-size:12.5px;font-weight:700;padding:9px 16px;
    box-shadow:0 4px 14px -3px var(--brand);transition:transform .15s}
  .install-go:hover{transform:translateY(-1px)}
  .install-no{flex:none;width:30px;height:30px;border-radius:50%;cursor:pointer;
    border:1px solid var(--line);background:none;color:var(--muted);
    font-size:17px;line-height:1;font-family:inherit}
  .install-no:hover{color:var(--ink);border-color:var(--line-strong)}
  /* It must never sit on top of the free-account bar. */
  body.has-free-bar .install-bar{bottom:74px}
  @media(max-width:380px){
    .install-bar{gap:9px;padding:9px}
    .install-t span{display:none}
  }
  @media(prefers-reduced-motion:reduce){ .install-bar{transition:none} }

  /* ---- installing, from the account panel ---- */
  .acct-install{display:flex;align-items:center;gap:12px;margin-top:18px;
    padding:13px 13px 13px 15px;border-radius:14px;
    border:1.5px solid var(--line-strong);background:var(--surface-2)}
  .acct-install-t{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}
  .acct-install-t b{font-size:13.5px;font-weight:700;color:var(--ink)}
  .acct-install-t span{font-size:11.5px;line-height:1.45;color:var(--muted)}
  .acct-install-go{flex:none;border:0;border-radius:99px;cursor:pointer;
    background:var(--brand);color:#fff;font-family:inherit;
    font-size:12.5px;font-weight:700;padding:10px 18px;white-space:nowrap;
    box-shadow:0 4px 14px -3px var(--brand);transition:transform .15s}
  .acct-install-go:hover{transform:translateY(-1px)}
  .acct-install-go:active{transform:translateY(0) scale(.97)}
  .acct-install-go[disabled]{opacity:.55;cursor:default;transform:none;box-shadow:none}
  /* Already installed: a statement, not an offer. */
  .acct-install.done{border-color:var(--ok)}
  .acct-install.done .acct-install-go{background:none;color:var(--ok);
    box-shadow:none;cursor:default;font-weight:700}
  @media(max-width:400px){
    .acct-install{flex-direction:column;align-items:stretch;gap:10px}
    .acct-install-go{width:100%}
  }

  /* ---- the coupon box, made findable ----

     People were not seeing it. It looked exactly like the state field above
     it — same label, same border, same weight — so it read as one more form
     field to skip rather than money being offered. Somebody holding a code
     could not find where to put it.

     Now it has an edge of its own, a tinted ground, and a heading that says
     what it is for rather than what it is called. */
  .pw-coup-hi{
    position:relative;margin-top:14px;padding:13px 13px 14px;
    border:1.5px dashed var(--gold);border-radius:14px;
    background:var(--gold-soft);
  }
  .pw-coup-hi label{
    display:block;margin-bottom:8px;
    font-size:11.5px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;
    color:var(--gold);
  }
  .pw-coup-hi .pw-coup-wrap{display:flex;gap:8px;align-items:stretch}
  .pw-coup-hi input{
    flex:1;min-width:0;border-radius:10px;
    border:1.5px solid var(--gold);background:var(--surface);
    font-family:var(--font-mono);font-size:15px;font-weight:700;
    letter-spacing:.08em;text-transform:uppercase;padding:11px 12px;
    color:var(--ink);
  }
  .pw-coup-hi input::placeholder{color:var(--muted);opacity:.55;font-weight:500}
  .pw-coup-hi input:focus{outline:none;border-color:var(--brand);
    box-shadow:0 0 0 3px var(--brand-soft)}
  .pw-coup-hi button{
    flex:none;border:0;border-radius:10px;cursor:pointer;
    background:var(--gold);color:var(--on-strong);
    font-family:inherit;font-size:13.5px;font-weight:800;
    letter-spacing:.03em;padding:0 20px;white-space:nowrap;
    transition:transform .15s,background .15s;
  }
  .pw-coup-hi button:hover{background:var(--brand);color:#fff;transform:translateY(-1px)}
  .pw-coup-hi button:active{transform:translateY(0) scale(.97)}

  /* A quiet shimmer along the dashed edge, so the eye lands on it once
     without it competing with the pay button below. */
  .pw-coup-hi::after{
    content:"";position:absolute;inset:-1.5px;border-radius:14px;pointer-events:none;
    box-shadow:0 0 0 0 var(--gold);
    animation:coupHi 3.6s ease-out infinite;
  }
  @keyframes coupHi{
    0%   { box-shadow:0 0 0 0 color-mix(in srgb,var(--gold) 45%,transparent) }
    55%  { box-shadow:0 0 0 7px color-mix(in srgb,var(--gold) 0%,transparent) }
    100% { box-shadow:0 0 0 0 color-mix(in srgb,var(--gold) 0%,transparent) }
  }
  @media(prefers-reduced-motion:reduce){ .pw-coup-hi::after{animation:none} }

  @media(max-width:420px){
    .pw-coup-hi{padding:11px 11px 12px}
    .pw-coup-hi input{font-size:15px;padding:10px}
    .pw-coup-hi button{padding:0 15px;font-size:13px}
  }

/* --- no automatic zoom on touch ---

   iOS Safari zooms the whole page whenever a field it is about to focus has
   text smaller than 16px. Nothing asked it to; it simply decides the text is
   too small to type into. Tapping the coupon box lurched the screen, and the
   person then had to pinch back out to see the rest of the form.

   So every field that can take focus is at least 16px on a touch device.
   !important because this has to beat every class in the file, and because it
   was written once before and quietly lost when a nearby block was rewritten.

   Note what this does NOT do: maximum-scale and user-scalable=no would also
   stop the zoom, by taking pinch-zoom away from everybody for ever. Somebody
   who wants to zoom must still be able to. */
@media (pointer: coarse) {
  input, select, textarea,
  input[type="text"], input[type="email"], input[type="password"],
  input[type="number"], input[type="tel"], input[type="search"],
  input[type="date"], input[type="time"], input[type="url"],
  [contenteditable="true"] {
    font-size: 16px !important;
  }
}

  /* ---- the Install button in the bar ---- */
  .install-btn{border-color:rgba(63,185,132,.45);color:var(--ok)}
  .install-btn:hover{border-color:var(--ok);background:rgba(63,185,132,.10)}
  .install-btn .ic{color:var(--ok)}
  /* Once it is installed the button becomes a statement and stops inviting. */
  .install-btn.done{border-color:var(--line);color:var(--muted);cursor:default}
  .install-btn.done:hover{background:none;border-color:var(--line)}
  .install-btn.done .ic{color:var(--muted)}

/* ---- PMP member badge (account panel) ---- */
.acct-plan.pmp{display:inline-flex;align-items:center;gap:6px;max-width:none;flex:0 0 auto;overflow:visible;
  padding:5px 12px 5px 9px;border-radius:99px;border:1px solid rgba(255,224,150,.55);
  background:linear-gradient(135deg,#FFE7A3 0%,#F2C35B 45%,#C8902B 100%);color:#3A2500;
  font-family:var(--font-display);font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;
  box-shadow:0 0 0 3px rgba(242,195,91,.14),0 6px 18px -6px rgba(200,144,43,.7),inset 0 1px 0 rgba(255,255,255,.6);
  text-shadow:0 1px 0 rgba(255,255,255,.35);position:relative;isolation:isolate}
.acct-plan.pmp svg{width:13px;height:13px;flex:none;color:#7A4E00;filter:drop-shadow(0 1px 0 rgba(255,255,255,.4))}
.acct-plan.pmp::after{content:"";position:absolute;inset:0;border-radius:inherit;z-index:-1;
  background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.55) 48%,transparent 66%);background-size:250% 100%;
  animation:acctPmpShine 4.5s ease-in-out infinite}
@keyframes acctPmpShine{0%,60%{background-position:120% 0}100%{background-position:-120% 0}}
@media (prefers-reduced-motion:reduce){.acct-plan.pmp::after{animation:none;display:none}}
