/* Extracted from assistant_widget.php on 2026-09-10 — see the note there for why.
 * Byte-for-byte the CSS that used to be inlined into EVERY page of this site.
 * Do not re-inline it: /assets/** is served immutable, max-age=31536000, so this file is
 * fetched once per visitor and then never again, while an inline block is re-sent with every
 * single page view because HTML is not cacheable. */
/* ⚠️ --aria-grad lives on :root, not on #ariaWidget, because #ariaFab is reparented out of the
   widget into the drawer — a variable scoped to the old parent simply stopped resolving there and
   the button silently lost its gradient (it rendered as a bare dark pill). Same root cause as the
   click gate below: an element that can be moved must not depend on where it used to live.
   #ariaFab restates the font for the same reason. */
:root{--aria-grad:linear-gradient(135deg,#7c5cff,#00d4ff)}
#ariaWidget{font-family:'Vazirmatn',system-ui,-apple-system,sans-serif}
/* ── THE FLOATING RAIL ────────────────────────────────────────────────────
   One right-aligned column for every floating widget, defined once here and
   consumed by tanin_fab.php + fab_hub.php too. Owner request, 2026-08-06: the
   icons were "پخش و پلا" — scattered — because #ariaFab was anchored to the
   logical START and the (now-retired) hub to the logical END, so they sat on
   OPPOSITE sides and swapped physical corners with direction. In Persian that
   put Aria bottom-RIGHT, exactly where a browser-extension button lives.

   Three independent stacked buttons, bottom to top (2026-08-08 redesign —
   the hub's expand/collapse menu and its Live-radio item were retired; Tanin
   and Report-a-bug became standalone rail occupants instead of hidden-until-
   tapped menu items):
     slot 0 (bottom) → #bugFab    (fab_hub.php)
     slot 1          → #taninFab (tanin_fab.php)
     slot 2 (top)    → #ariaFab  (here)

   PHYSICAL right, deliberately, not inset-inline-end: the column must not move
   when the reader switches language. This is the one place in the codebase
   where a logical inset is the wrong tool.

   --mibl-rail-clear reserves room UNDER the column for browser-extension
   buttons (Adobe Acrobat, password managers), which cluster in the bottom-right
   on desktop. Those live in the browser's own layer, NOT in our DOM, so no
   amount of JS can measure them — this is a reservation, not a detection, and
   it is a variable so it can be tuned without hunting through rules. Applied
   only under pointer:fine, because phones have no extension buttons. */
:root{
  --mibl-rail-right:16px;
  --mibl-rail-bottom:18px;
  --mibl-rail-gap:12px;
  --mibl-rail-slot0:50px;        /* height of #bugFab (fab_hub.php), the bottom occupant */
  --mibl-rail-slot1:50px;        /* height of #taninFab (tanin_fab.php), the middle occupant */
  --mibl-rail-clear:0px;
  --rail-tuck-peek:44px;         /* resting-state visible width (fab_hub.php's tuck rule) — full
                                     icon + padding, wide enough that the label is entirely clipped */
}
@media(pointer:fine){ :root{ --mibl-rail-clear:64px; } }
/* Phones: clear the 59px .mnav bottom bar as before; the icon-only button is narrower there
   (no label to clip away), so a smaller peek still reads as "about half tucked". */
@media(max-width:560px){ :root{ --mibl-rail-bottom:74px; --rail-tuck-peek:24px; } }

/* Slot 2 — top of the column, above Tanin (slot 1) and the bug button (slot 0). */
#ariaFab{position:fixed;z-index:8999;inset-inline-start:auto;right:var(--mibl-rail-right,16px);
  bottom:calc(var(--mibl-rail-bottom,18px) + var(--mibl-rail-clear,0px)
              + var(--mibl-rail-slot0,50px) + var(--mibl-rail-gap,12px)
              + var(--mibl-rail-slot1,50px) + var(--mibl-rail-gap,12px)
              + env(safe-area-inset-bottom,0px));
  display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border:0;border-radius:999px;cursor:pointer;
  background:var(--aria-grad);color:#fff;font-weight:800;font-size:14px;
  font-family:'Vazirmatn',system-ui,-apple-system,sans-serif;
  box-shadow:0 8px 26px rgba(124,92,255,.45);animation:ariaPulse 3s infinite}
#ariaFab .aria-orb{width:24px;height:24px;border-radius:50%;display:block;flex:none;filter:drop-shadow(0 0 4px rgba(255,255,255,.5))}
/* Draggable to move it off any button. Resting visibility (permanently tucked to the edge,
   revealed on hover, via clip-path rather than transform — see the shared rule below for why)
   is the shared rail rule below, which is why clip-path is listed in the transition here even
   though the rule that animates it is separate: transition-property only takes effect once BOTH
   the property and a value change are present on the same element, from any source. */
#ariaFab{touch-action:none;transition:left .18s ease,top .18s ease,opacity .22s ease,transform .2s ease,clip-path .25s cubic-bezier(.2,1,.3,1)}
/* ── Shared resting state for the whole rail (#ariaFab here + #taninFab/#bugFab defined
   elsewhere) ─────────────────────────────────────────────────────────────────────────────────
   Owner request, 2026-08-08: instead of fully visible by default, all three buttons now rest
   permanently tucked to the edge, dimmed, revealed only on hover (a tap/click still fires from
   the tucked state directly — click listeners don't care about clip-path — so mobile, which has
   no real hover, needs no separate reveal step: one tap opens/navigates immediately).

   row-reverse puts each button's ICON nearest the true screen edge and its LABEL innermost, so
   clipping away the inner side hides only the label, leaving a clean icon-only "nub" at rest —
   and because clip-path leaves the box's own position:fixed geometry completely untouched (only
   the visible/interactive WINDOW grows on reveal, nothing moves), a cursor already hovering the
   visible nub stays inside the box through the whole reveal transition. transform:translateX was
   tried first and rejected: shifting the box itself moves its hit-region out from under a
   stationary cursor mid-transition, so hover would immediately re-trigger the tucked state and
   the button could never actually stay open (verified live with Playwright).

   Lives HERE, not fab_hub.php: that file has its own early return for NOVA_Player.php (unrelated
   to this rule — it's about not stacking a 2nd super-fab-hub-style menu onto NOVA's own dense
   UI), which used to silently drop this shared rule too since it was defined there, leaving
   Aria/Tanin fully visible instead of tucked on that one page (reported live by the owner,
   2026-08-08). assistant_widget.php has no such exclusion, so the rule now reaches #ariaFab and
   #taninFab wherever they render, including NOVA.

   ⚠️ SINCE 2026-08-13 this is the FALLBACK, not the live design: the drawer further down docks
   all three on every surface and overrides each of these with !important. What is left here is
   what paints in the moment before the script runs, and what remains if it never does. Do not
   "tidy" it away — and do not tune it either, because on a working page nobody ever sees it. */
#ariaFab,#taninFab,#bugFab{flex-direction:row-reverse;touch-action:none;
  clip-path:inset(0 0 0 calc(100% - var(--rail-tuck-peek,44px)) round 999px);opacity:.4}
/* row-reverse is direction-relative (its main-start is the writing mode's inline-end), but the
   clip-path above is physical — it always keeps the rightmost sliver visible. In LTR, inline-end
   IS physical right, so row-reverse correctly puts the icon (1st DOM child) in that visible sliver.
   But these buttons sit inside <html dir="rtl"> on Persian pages (they set no dir of their own),
   and under RTL, row-reverse's main-start flips to physical LEFT — so the icon gets shoved into
   the clipped-away side and the LABEL (truncated) shows in the sliver instead: exactly the
   "no icon, truncated text" bug reported 2026-08-08. Undoing the reversal in RTL restores the
   same physical result: plain row's inline-start is physical right under RTL, so the icon
   (1st child) lands in the visible sliver again, matching LTR. */
html[dir="rtl"] #ariaFab,html[dir="rtl"] #taninFab,html[dir="rtl"] #bugFab{flex-direction:row}
#ariaFab:hover,#taninFab:hover,#bugFab:hover{clip-path:none;opacity:1}
#taninFab,#bugFab{transition:clip-path .25s cubic-bezier(.2,1,.3,1),opacity .25s ease}
@media(prefers-reduced-motion:reduce){#ariaFab,#taninFab,#bugFab{transition:none}}

/* ══ THE DRAWER — every surface ═════════════════════════════════════════════════════════════
   Owner request 2026-08-13, from a phone screenshot: make these three "slide out from the edge,
   somewhere sensible, without getting in the way". Then, seeing it: do the same on desktop.

   WHY THE OLD DESIGN COULD NOT WORK ON A PHONE, measured on a 390x844 phone before changing
   anything: the tuck above is a two-state design — a dim sliver at rest, full reveal on :hover —
   and A TOUCH SCREEN HAS NO HOVER, so the second state was unreachable. All three buttons sat
   permanently at opacity .4, clipped to a 24px sliver, forever. The comment above reasons that
   mobile "needs no separate reveal step" because a tap fires from the tucked state; true for the
   CLICK, but it left the visual half of the design with no way to ever complete. Add the three
   20x20 grips (below the 44px touch minimum) and a 390px-wide screen was carrying SIX permanent
   floating objects over the content.

   ONE MECHANISM, TWO TRIGGERS. The drawer is the same everywhere; only what opens it differs:
   a tap on touch, and simply arriving with the pointer on a mouse — so desktop pays no extra
   click for the tidier resting state, and the site looks like itself on every surface. Six
   resting objects become one on desktop too.

   ⚠️ WHAT THIS GIVES UP, deliberately and worth knowing: the per-button drag grips, an owner
   request from 2026-08-08, are gone. They existed because the rail lived in the bottom-right
   corner, where browser extensions inject their own floating buttons (that is what
   --mibl-rail-clear reserves room for) and something had to be movable out of the way. The
   drawer sits at the vertical middle of the edge instead, where nothing else is, so the problem
   the grips solved no longer occurs. If it ever does, the tab is the thing to make draggable —
   one grip, not three.

   The rail rules ABOVE are not dead: they are what paints before this script runs and the
   fallback if it never does. Everything the dock needs is !important precisely because those
   rules are ID-level and would otherwise win.
   ═════════════════════════════════════════════════════════════════════════════════════════ */
/* `@media all` is a deliberate no-op wrapper, kept only so this 60-line drawer stays one visually
   grouped block after its guard was widened from (hover:none) to every surface. */
@media all {
  /* ⚠️ PHYSICAL right and physical padding, and the RTL override below is not optional.
     For a COLUMN flex container the cross axis is horizontal, so align-items follows the INLINE
     direction: `flex-end` is physical right in LTR but physical LEFT under <html dir="rtl">.
     Persian pages therefore right-pinned the dock and then left-aligned the buttons inside it,
     parking them across the middle of the screen (measured: lefts 117/154 on a 390px phone).
     Flipping the alignment in RTL restores the same PHYSICAL result — which is what the rest of
     the rail already does deliberately, so the column does not move when the reader switches
     language. Right padding clears the tab, which stays put as the explicit way to close. */
  .mibl-dock{
    position:fixed;z-index:8999;inset-inline-end:auto;right:0;top:50%;
    transform:translateY(-50%);
    display:flex;flex-direction:column;align-items:flex-end;gap:10px;
    padding-right:36px;pointer-events:none}
  html[dir="rtl"] .mibl-dock{align-items:flex-start}

  /* A soft scrim while open. There is no permanently empty band on a phone — the first build
     centred the drawer and it landed across the track title and the LIVE badge, reading as
     buttons colliding with text rather than as a panel. The scrim settles that: the drawer is
     plainly ON TOP of the page for the second it is open, the page behind stays legible enough
     to keep your place, and it makes "tap anywhere to dismiss" look like what it is.
     Lighter than the site's modal scrim (.72 + 6px blur) on purpose — this is a two-second
     detour, not a dialog. */
  body.mibl-dock-open::after{
    content:'';position:fixed;inset:0;z-index:8998;pointer-events:none;
    background:rgba(4,4,12,.42);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);
    animation:miblDockScrim .28s ease both}
  @keyframes miblDockScrim{from{opacity:0}to{opacity:1}}
  @media(prefers-reduced-motion:reduce){body.mibl-dock-open::after{animation:none}}

  /* ⚠️ `> *`, NOT `> button`. #taninFab is an <a>, not a <button> — a `> button` selector matched
     the other two and silently left Tanin behind at its original fixed position, outside the
     drawer entirely, visible at all times (measured: it never moved between open and closed).
     The three rail buttons are three elements from three files and are not the same tag.

     !important throughout because each is an ID-level rule (#ariaFab/#taninFab/#bugFab set their
     own position/inset), and an ID beats any class selector this file can write. Inline left/top
     from an earlier drag would beat even that, so the JS clears it when it docks.

     The offset must clear the dock's own right padding as well as the button's width, or the
     parked button stops 20px short and leaves a sliver on screen — which is exactly the
     permanent clutter this whole change is removing. */
  /* ⚠️ opacity needs !important like the rest. The resting rail dims itself to .4 from an
     ID-level rule (#ariaFab,#taninFab,#bugFab), which outranks anything class-based here — so a
     plain `opacity:1` lost silently and the drawer rendered at 40%: the page text read straight
     through every button. Invisible in the functional tests, which all passed; caught only by
     looking at a 3x screenshot. Same trap as the `> button` selector above. */
  .mibl-dock>*{
    position:static!important;inset:auto!important;margin:0!important;
    clip-path:none!important;opacity:1!important;
    transform:translateX(calc(100% + 44px));
    /* ⚠️ !important here too, and for a reason that is not tidiness. Each button arrives with its
       own ID-level `transition`: #ariaFab lists transform, #taninFab/#bugFab list only clip-path
       and opacity. Left alone, Aria animated its slide while the other two teleported — so the
       staggered open ran on one third of the drawer, and Aria was repeatedly caught still parked
       a full 131px out while the others had arrived. The dock positions these elements, so the
       dock owns how they move; anything else is three components disagreeing about one gesture. */
    transition:transform .34s cubic-bezier(.2,1,.3,1),opacity .22s ease!important;
    pointer-events:none;box-shadow:0 10px 30px rgba(0,0,0,.45)}
  /* Labels earn their space here: at rest nothing shows at all, so when the drawer is open each
     button can say what it is instead of being an unlabelled circle. */
  .mibl-dock>* .bf-label,.mibl-dock>* .tf-label,.mibl-dock>* .aria-fab-label{display:inline!important}
  .mibl-dock>*{padding:11px 15px!important;border-radius:999px!important;min-height:46px}

  body.mibl-dock-open .mibl-dock>*{transform:none!important;pointer-events:auto}
  /* ⚠️ The OPEN dock must be hit-testable itself, not just its buttons. The dock's right padding
     leaves a ~10px channel between a button's edge and the tab, and while the dock was
     pointer-events:none that channel belonged to the page underneath — so a mouse travelling
     from the tab to a button crossed a strip where neither existed, which read as "the pointer
     left" and shut the drawer mid-reach. Reported by the owner in exactly those words: the
     buttons close before he can get to them. Closed, it stays click-through so it never steals a
     click from the page behind. */
  body.mibl-dock-open .mibl-dock{pointer-events:auto}
  /* Opens outward from the tab, closes back into it — the stagger runs top-down on the way out
     and is dropped on the way back so dismissing feels immediate rather than sluggish. */
  body.mibl-dock-open .mibl-dock>*:nth-child(2){transition-delay:.045s}
  body.mibl-dock-open .mibl-dock>*:nth-child(3){transition-delay:.09s}

  /* ── The tab ──────────────────────────────────────────────────────────────────────────────
     Visually slim so it never competes with the page; the ::before gives it a ~48x78 touch
     target anyway, extending INWARD where there is nothing to hit by accident. */
  .mibl-dock-tab{
    position:fixed;z-index:9000;inset-inline-end:0;right:0;top:50%;
    transform:translateY(-50%);
    width:26px;height:64px;padding:0;border:0;cursor:pointer;
    border-radius:15px 0 0 15px;
    background:rgba(10,10,26,.62);
    -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
    box-shadow:-5px 0 20px rgba(0,0,0,.34),inset 1px 0 0 rgba(255,255,255,.13);
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
    opacity:.75;transition:transform .34s cubic-bezier(.2,1,.3,1),opacity .25s ease}
  .mibl-dock-tab::before{content:'';position:absolute;top:-8px;bottom:-8px;right:0;left:-22px}
  .mibl-dock-tab:active{opacity:1}
  .mibl-dock-tab i{width:5px;height:5px;border-radius:50%;display:block;flex:none}
  /* One dot per button, in that button's own colour — the tab previews its contents. */
  .mibl-dock-tab i.d-aria{background:#00d4ff}
  .mibl-dock-tab i.d-tanin{background:#a78bfa}
  .mibl-dock-tab i.d-bug{background:#f43f5e}
  /* The tab STAYS while open — the dock's right padding leaves room for it — so there is always
     one obvious way to put the drawer away. Hiding it was tried first and rejected: it left the
     drawer with no visible close control at all, and the anchor the buttons appeared to come out
     of vanished the moment they appeared. */
  body.mibl-dock-open .mibl-dock-tab{opacity:1;background:rgba(22,22,48,.82)}

  /* The lyric drawer and Aria's own panel own the whole screen while open. */
  body.lrc-open .mibl-dock,body.lrc-open .mibl-dock-tab{opacity:0!important;pointer-events:none!important}

  @media(prefers-reduced-motion:reduce){
    .mibl-dock>button,.mibl-dock-tab{transition:opacity .01s!important;transition-delay:0s!important}
  }
}
#ariaMini{position:fixed;z-index:8999;inset-inline-start:auto;right:calc(var(--mibl-rail-right,16px) + 10px);
  bottom:calc(var(--mibl-rail-bottom,18px) + var(--mibl-rail-clear,0px) + var(--mibl-rail-slot0,50px) + var(--mibl-rail-gap,12px) + var(--mibl-rail-slot1,50px) + var(--mibl-rail-gap,12px) + env(safe-area-inset-bottom,0px));
  width:36px;height:36px;border:0;border-radius:50%;cursor:pointer;padding:0;background:none;line-height:0;
  opacity:.45;box-shadow:0 4px 14px rgba(124,92,255,.35);transition:opacity .2s,transform .15s}
#ariaMini img{width:36px;height:36px;border-radius:50%;display:block}
#ariaMini:hover{opacity:1;transform:scale(1.1)}
@keyframes ariaPulse{0%{box-shadow:0 8px 26px rgba(124,92,255,.45),0 0 0 0 rgba(124,92,255,.5)}70%{box-shadow:0 8px 26px rgba(124,92,255,.45),0 0 0 13px rgba(124,92,255,0)}100%{box-shadow:0 8px 26px rgba(124,92,255,.45),0 0 0 0 rgba(124,92,255,0)}}
#ariaTease{position:fixed;z-index:8999;inset-inline-start:auto;right:var(--mibl-rail-right,16px);bottom:calc(var(--mibl-rail-bottom,18px) + var(--mibl-rail-clear,0px) + var(--mibl-rail-slot0,50px) + var(--mibl-rail-gap,12px) + var(--mibl-rail-slot1,50px) + var(--mibl-rail-gap,12px) + 56px + env(safe-area-inset-bottom,0px));max-width:265px;
  background:#fff;color:#15182a;border-radius:16px;border-end-start-radius:5px;padding:12px 14px 10px;box-shadow:0 14px 40px rgba(0,0,0,.32);
  font-size:13.5px;line-height:1.55;animation:ariaPop .35s cubic-bezier(.16,1,.3,1)}
@keyframes ariaPop{from{opacity:0;transform:translateY(10px) scale(.96)}to{opacity:1;transform:none}}
#ariaTease .aria-tease-x{position:absolute;top:6px;inset-inline-end:8px;border:0;background:none;font-size:13px;color:#9aa;cursor:pointer;line-height:1}
#ariaTease .aria-tease-txt{display:block;padding-inline-end:10px}
#ariaTease .aria-tease-off{margin-top:8px;border:0;background:none;color:#7c5cff;font-weight:700;font-size:11.5px;cursor:pointer;padding:0;font-family:inherit}
/* Aria share-nudge pop-over — fired at a moment of peak delight (a like / 3 songs in). */
#ariaNudge{position:fixed;z-index:8999;inset-inline-start:auto;right:var(--mibl-rail-right,16px);bottom:calc(var(--mibl-rail-bottom,18px) + var(--mibl-rail-clear,0px) + var(--mibl-rail-slot0,50px) + var(--mibl-rail-gap,12px) + var(--mibl-rail-slot1,50px) + var(--mibl-rail-gap,12px) + 56px + env(safe-area-inset-bottom,0px));max-width:288px;
  background:linear-gradient(165deg,#1a1d33,#111426);color:#eef1ff;border:1px solid rgba(0,212,255,.3);
  border-radius:18px;border-end-start-radius:6px;padding:14px 15px 13px;box-shadow:0 18px 48px rgba(0,0,0,.5),0 0 0 1px rgba(124,92,255,.12);
  opacity:0;transform:translateY(12px) scale(.96);transition:opacity .35s ease,transform .4s cubic-bezier(.16,1,.3,1)}
#ariaNudge.show{opacity:1;transform:none}
#ariaNudge .aria-nudge-x{position:absolute;top:8px;inset-inline-end:10px;border:0;background:none;font-size:13px;color:#8b93b4;cursor:pointer;line-height:1}
#ariaNudge .aria-nudge-row{display:flex;gap:10px;align-items:flex-start;padding-inline-end:12px}
#ariaNudge .aria-nudge-av{flex:none;border-radius:50%;box-shadow:0 4px 14px rgba(124,92,255,.45)}
#ariaNudge .aria-nudge-txt{font-size:13.5px;line-height:1.55;font-weight:600}
#ariaNudge .aria-nudge-share{display:block;width:100%;margin-top:12px;border:0;border-radius:12px;padding:11px;cursor:pointer;font-family:inherit;
  font-weight:800;font-size:13.5px;color:#04121a;background:linear-gradient(135deg,#00d4ff,#7c5cff);box-shadow:0 8px 22px rgba(0,140,255,.4);
  transition:transform .15s ease,box-shadow .2s ease}
#ariaNudge .aria-nudge-share:hover{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,140,255,.55)}
#ariaNudge .aria-nudge-share.ok{background:linear-gradient(135deg,#22d39a,#12b886);animation:ariaOkPop .4s ease}
@keyframes ariaOkPop{0%{transform:scale(.9)}60%{transform:scale(1.05)}100%{transform:scale(1)}}
@media(prefers-reduced-motion:reduce){#ariaNudge{transition:none}}
/* CRITICAL: an id-specificity display rule overrides the UA [hidden]{display:none}, so the panel
   would never hide (stuck open, ✕ dead). Re-assert hiding for the hidden attribute explicitly. */
#ariaWidget [hidden]{display:none!important}
#ariaPanel{position:fixed;z-index:9001;inset-inline-start:auto;right:var(--mibl-rail-right,16px);bottom:calc(var(--mibl-rail-bottom,18px) + var(--mibl-rail-clear,0px) + env(safe-area-inset-bottom,0px));
  width:min(370px,calc(100vw - 32px));height:min(560px,calc(100dvh - 90px));display:flex;flex-direction:column;overflow:hidden;
  background:#0e1020;border:1px solid rgba(255,255,255,.1);border-radius:20px;box-shadow:0 24px 70px rgba(0,0,0,.55);
  animation:ariaPop .3s cubic-bezier(.16,1,.3,1);color:#eef0ff}
.aria-hd{display:flex;align-items:center;gap:10px;padding:13px 12px;background:var(--aria-grad);color:#fff}
.aria-hd-orb{width:34px;height:34px;border-radius:50%;display:block;flex:none;box-shadow:0 2px 8px rgba(0,0,0,.25)}
.aria-hd-id{flex:1;line-height:1.2}.aria-hd-id b{font-size:15px}.aria-hd-id small{display:block;opacity:.9;font-size:11px}
.aria-hd-btn{border:0;background:rgba(255,255,255,.18);color:#fff;width:28px;height:28px;border-radius:50%;cursor:pointer;font-size:15px;line-height:1}
.aria-msgs{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:14px 12px;display:flex;flex-direction:column;gap:9px}
.aria-b{max-width:84%;padding:9px 12px;border-radius:15px;font-size:13.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.aria-b.bot{align-self:flex-start;background:#1b1e34;border-end-start-radius:5px}
.aria-b.me{align-self:flex-end;background:var(--aria-grad);color:#fff;border-end-end-radius:5px}
/* Sales-engine signup card (guest + member-gated topic) */
.aria-cta{align-self:stretch;position:relative;overflow:hidden;margin:2px 0 3px;padding:14px 14px 13px;border-radius:16px;
  background:linear-gradient(135deg,rgba(0,212,255,.14),rgba(124,92,255,.16));border:1px solid rgba(0,212,255,.32);
  box-shadow:0 8px 26px rgba(0,120,255,.18)}
.aria-cta::before{content:"";position:absolute;inset:-40% 30% auto -10%;height:120px;background:radial-gradient(60% 100% at 30% 0,rgba(0,212,255,.35),transparent 70%);filter:blur(14px);pointer-events:none}
.aria-cta>*{position:relative}
.aria-cta-t{font-weight:800;font-size:13.5px;color:#eaf6ff;margin-bottom:3px}
.aria-cta-s{font-size:12px;line-height:1.5;color:#b7c2e0;margin-bottom:10px}
.aria-cta-btn{display:block;text-align:center;text-decoration:none;font-weight:800;font-size:13px;padding:11px 12px;border-radius:12px;
  background:linear-gradient(135deg,#00d4ff,#7c5cff);color:#04121a;box-shadow:0 8px 22px rgba(0,140,255,.4);transition:transform .15s,box-shadow .2s}
.aria-cta-btn:hover{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,140,255,.55)}
.aria-b.typing{display:flex;align-items:center;gap:8px;align-self:flex-start;background:#1b1e34;padding:8px 12px}
.aria-think-av{width:24px;height:24px;border-radius:50%;flex:none;box-shadow:0 0 0 0 rgba(124,92,255,.5);animation:ariaThink 1.1s ease-in-out infinite}
.aria-think-dots{display:inline-flex;gap:4px}
.aria-b.typing i{width:6px;height:6px;border-radius:50%;background:#8a90b8;animation:ariaDot 1.1s infinite}
.aria-b.typing i:nth-child(2){animation-delay:.18s}.aria-b.typing i:nth-child(3){animation-delay:.36s}
@keyframes ariaThink{0%,100%{transform:scale(1) rotate(0);box-shadow:0 0 0 0 rgba(124,92,255,.45)}50%{transform:scale(1.13) rotate(7deg);box-shadow:0 0 0 6px rgba(124,92,255,0)}}
/* Header avatar springs to life while Aria is thinking */
#ariaPanel.aria-busy .aria-hd-orb{animation:ariaThink 1s ease-in-out infinite}
@keyframes ariaDot{0%,100%{opacity:.3;transform:translateY(0)}50%{opacity:1;transform:translateY(-3px)}}
.aria-b b{font-weight:800}.aria-b em{font-style:italic;opacity:.92}
.aria-intro{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:9px;padding:26px 0 8px}
.aria-intro img{width:74px;height:74px;border-radius:50%;box-shadow:0 8px 30px rgba(124,92,255,.5);animation:ariaIntroPop .55s cubic-bezier(.2,1.25,.35,1) both}
.aria-intro .aria-intro-name{font-weight:800;font-size:16px;background:var(--aria-grad);-webkit-background-clip:text;background-clip:text;color:transparent;opacity:0;animation:ariaIntroName .3s ease .35s forwards}
@keyframes ariaIntroPop{0%{transform:scale(.2) rotate(-12deg);opacity:0}60%{transform:scale(1.14) rotate(3deg)}100%{transform:scale(1) rotate(0);opacity:1}}
@keyframes ariaIntroName{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
.aria-b.bot.aria-in{animation:ariaBubbleIn .32s cubic-bezier(.16,1,.3,1) both}
@keyframes ariaBubbleIn{from{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.aria-intro img,.aria-intro .aria-intro-name,.aria-b.bot.aria-in{animation:none;opacity:1}}
.aria-sugg{display:flex;flex-wrap:wrap;gap:6px;padding:0 12px 8px}
.aria-sugg button{border:1px solid rgba(124,92,255,.5);background:rgba(124,92,255,.12);color:#cfd3ff;border-radius:999px;
  padding:6px 11px;font-size:12px;cursor:pointer;font-family:inherit}
.aria-sugg button:hover{background:rgba(124,92,255,.25)}
.aria-input{display:flex;gap:8px;padding:10px 12px;border-top:1px solid rgba(255,255,255,.08)}
.aria-input input{flex:1;background:#191c30;border:1px solid rgba(255,255,255,.1);border-radius:12px;color:#eef0ff;padding:10px 12px;font-size:13.5px;font-family:inherit;outline:none}
.aria-input input:focus{border-color:rgba(124,92,255,.7)}
.aria-input button{border:0;background:var(--aria-grad);color:#fff;width:42px;border-radius:12px;cursor:pointer;font-size:15px}
.aria-foot{padding:12px;border-top:1px solid rgba(255,255,255,.08);font-size:12.5px;color:#aab}
.aria-foot .aria-off-q{display:block;margin-bottom:8px}
.aria-foot button{border:0;border-radius:9px;padding:7px 14px;font-size:12.5px;font-weight:700;cursor:pointer;font-family:inherit;margin-inline-end:7px}
.aria-foot .aria-off-no{background:rgba(255,255,255,.14);color:#fff}
.aria-foot .aria-off-yes{background:#f43f5e;color:#fff}
/* NOTE: no bottom override for #ariaFab here any more. It used to hard-set 74px,
   which on a phone put Aria BELOW the hub instead of above it — the rail already
   carries the 74px through --mibl-rail-bottom, and re-stating it here silently
   dropped Aria's slot offset and inverted the stack. Only the shape changes on
   a phone: the label is dropped so the pill becomes a round button. */
@media(max-width:560px){#ariaFab .aria-fab-label{display:none}#ariaFab{padding:11px}
  #ariaTease{bottom:calc(var(--mibl-rail-bottom,18px) + var(--mibl-rail-clear,0px) + var(--mibl-rail-slot0,56px) + var(--mibl-rail-gap,12px) + 56px + env(safe-area-inset-bottom,0px))}
  #ariaPanel{bottom:0;inset-inline-start:0;width:100vw;height:min(78dvh,640px);border-radius:20px 20px 0 0}}
@media(prefers-reduced-motion:reduce){#ariaFab{animation:none}#ariaTease,#ariaPanel{animation:none}}
