/* boss-guide.css — shared PVE mode-hub boss-guide engine styling.
   Extracted verbatim from advent-expedition.html (2026-08-xx, Raid build)
   so every future PVE Guides mode hub (raid.html, and later Sudden Raid/
   Power Up Dungeon/Castle Rush) shares the exact same boss-selector +
   guide-content CSS instead of a hand-copied twin -- see
   ADVENT_EXPEDITION_NOTES.md / RAID_NOTES.md for the extraction writeup.
   Every page that loads this file must ALSO define its own standard
   reset/:root palette/nav/page-header CSS locally (hand-copied per
   .claude/rules/deployment.md's own standing convention) -- that part is
   deliberately NOT in here. */
    /* GLASSY BOSS SELECTOR SUBHEADER + horizontal boss cards */
    .boss-selector{border-radius:var(--RL);overflow:hidden;margin-bottom:24px;
      background:linear-gradient(135deg,var(--gold-glow),var(--card)cc);
      backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
      border:1px solid var(--gold-dim);box-shadow:0 0 40px #e8962a11,inset 0 0 60px #00000022;}
    .boss-selector-head{padding:12px 18px;border-bottom:1px solid #e8962a33;display:flex;align-items:center;gap:10px;}
    .boss-selector-head-label{font-size:11px;color:var(--gold);font-weight:800;letter-spacing:3px;text-transform:uppercase;}
    .boss-selector-head-line{flex:1;height:1px;background:linear-gradient(90deg,#e8962a44,transparent);}
    .boss-selector-row{padding:14px 18px;display:flex;flex-wrap:nowrap;justify-content:center;gap:12px;}
    .boss-card{cursor:pointer;text-align:left;padding:0;position:relative;border:none;background:none;
      font:inherit;color:inherit;transition:all .2s;flex:1 1 0;min-width:0;max-width:280px;}
    /* Mobile: stack the boss cards, added 2026-09-08 -- same "mobile pass"
       this session already did for codex.html/pets.html, now starting on
       the PVE hub. `flex-wrap:nowrap` squeezed all 3 (or more) boss cards
       into one row regardless of viewport, truncating names ("Destroy...",
       "Iron Dev..."). One shared fix here covers all 7 PVE hub pages since
       they all load this file. */
    @media (max-width:760px){
      .boss-selector-row{flex-direction:column;gap:8px;padding:10px 14px;}
      .boss-card{max-width:none;}
      /* Shorter banner (not a full icon+text row redesign -- the name
         lives absolutely-positioned INSIDE .boss-card-art in the shared
         markup, restructuring that cleanly needs a markup change in
         every one of the 5 pages that render this, not just CSS), added
         2026-09-08 -- direct report: "the Choose a boss panels are all
         so big." 5/2 (137px tall at this width) down to 16/4.2 (~90px) --
         meaningfully more compact while keeping the existing name-over-
         scrim look intact. */
      .boss-card-art{aspect-ratio:16/4.2;}
    }
    .boss-card:hover,.boss-card.selected{transform:translateY(-2px);}
    .boss-card.selected{box-shadow:0 0 24px #e8962a44;}
    .boss-card:hover:not(.selected){box-shadow:0 0 16px #e8962a22;}
    .boss-card-inner{border:1px solid var(--border);border-radius:var(--R);overflow:hidden;
      background:linear-gradient(180deg,var(--surface),var(--card));}
    .boss-card.selected .boss-card-inner,.boss-card:hover .boss-card-inner{border-color:var(--gold);}
    .boss-card-art{aspect-ratio:5/2;position:relative;overflow:hidden;background:linear-gradient(180deg,var(--bg) 0%,#06101c 100%);}
    .boss-card-art img{width:100%;height:100%;object-fit:cover;object-position:center 20%;transition:filter .2s;}
    .boss-card-art img.not-live{filter:grayscale(70%) brightness(.5);}
    .boss-card-scrim{position:absolute;inset:0;background:linear-gradient(0deg,#06101cee 0%,#06101c66 40%,transparent 75%);}
    .boss-card-soon{position:absolute;top:8px;right:8px;font-size:8px;font-weight:800;padding:3px 7px;
      border-radius:var(--RS);letter-spacing:1px;text-transform:uppercase;background:var(--card)cc;
      color:var(--text-dim);border:1px solid var(--border);}
    .boss-card-name{position:absolute;bottom:8px;left:12px;right:12px;font-size:14px;font-weight:800;
      color:var(--text);transition:color .15s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
    .boss-card.selected .boss-card-name,.boss-card:hover .boss-card-name{color:var(--gold);}
    .boss-card-bar{height:3px;background:var(--gold);}

    /* ═══ MOBILE: 2-column shell collapse + collapsible boss panel,
       2026-09-08 -- see project_hero_detail_mobile_pattern_2026_09_08
       memory (this is the SAME playbook applied to the PVE hub engine
       it flagged as the next target). `.bg-shell-row` (bossGuideShellHtml())
       and `.bg-boss-panel`/`.bg-boss-strip`/`.bg-boss-panel-body`
       (renderBossPanelLeft()) are set via inline `style=` on JS-templated
       elements -- !important needed on the ones overriding an inline
       value, same reasoning as every other inline-styled element fixed
       this session (a plain class rule can never beat an inline style on
       its own). ═══ */
    @media (max-width:760px){
      .bg-shell-row{flex-direction:column !important;}
      .bg-boss-panel{position:static !important;width:100% !important;}
      /* Direct report: "The word 'Physical' is too long in mobile... at
         least reduce the font size for those two." Applies to every
         .phase-tab-btn on mobile (not just Power Up Dungeon's own 4-tab
         case) -- a smaller, tighter label reads fine at any tab count. */
      .phase-tab-btn{font-size:11px !important;letter-spacing:1px !important;padding:12px 6px !important;}
      /* Direct report: "Remove 'Open Overlay' option entirely on Mobile.
         It doesnt work well in this context. It is supposed to help PC
         playing." A pop-out browser WINDOW (window.open(), see
         openSkillQueuePopup()) is a desktop-only concept -- most mobile
         browsers either ignore it or open a new tab, neither of which is
         the "stays on top while you play" use case this button exists
         for at all. */
      .ae-skillqueue-popout{display:none !important;}
    }
    .bg-boss-strip{display:none;}
    @media (max-width:760px){
      .bg-boss-strip{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;background:transparent;border:none;cursor:pointer;font-family:'SKR Global','Lato',sans-serif;text-align:left;}
      .bg-boss-panel.expanded .bg-boss-strip{border-bottom:1px solid var(--border2);}
      .bg-boss-strip-thumb{width:36px;height:36px;border-radius:var(--RS);object-fit:cover;object-position:center 15%;flex-shrink:0;border:1px solid var(--border2);background:var(--card2);}
      .bg-boss-strip-name{flex:1;min-width:0;font-size:14px;font-weight:800;letter-spacing:.3px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
      .bg-boss-strip-chevron{flex-shrink:0;color:var(--text-dim);font-size:12px;transition:transform .2s ease;}
      .bg-boss-panel.expanded .bg-boss-strip-chevron{transform:rotate(180deg);}
      .bg-boss-panel-body{display:none;}
      .bg-boss-panel.expanded .bg-boss-panel-body{display:block;}
    }

    /* SELECTED BOSS CONTENT reveal */
    @keyframes fadeSlideDown{from{opacity:0;transform:translateY(-14px);}to{opacity:1;transform:translateY(0);}}
    .boss-content{animation:fadeSlideDown .35s cubic-bezier(.2,.8,.3,1);}
    .boss-soon{background:var(--surface);border:1px solid var(--border);border-radius:var(--RL);
      padding:60px 32px;text-align:center;margin-bottom:20px;}
    .boss-soon-icon{font-size:40px;margin-bottom:12px;opacity:.5;}
    .boss-soon-title{font-family:'Bebas Neue',sans-serif;font-size:26px;letter-spacing:1px;color:var(--gold);margin-bottom:8px;}
    .boss-soon-desc{font-size:12px;color:var(--text-mid);max-width:420px;margin:0 auto;}
    /* Two-state translucency for the sticky phase-tabs bar — same site-wide
       pattern as every other page's sticky bars, handled by
       SiteChrome.mountScrollDarken()'s default selector (.ae-phase-tabs is
       already in it). */
    .ae-phase-tabs{background:#0d1a2a26;transition:background-color .25s ease;}
    .ae-phase-tabs.is-stuck{background:#0d1a2ad9;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);}
    /* Diagonal light-sweep hover effect for the Phase 1/2 segmented tabs
       -- a skewed gradient band sits just off the button's left edge and
       sweeps across on hover. */
    .phase-tab-btn{position:relative;overflow:hidden;}
    .phase-tab-btn::before{
      content:"";position:absolute;top:0;left:-75%;width:45%;height:100%;
      background:linear-gradient(115deg,transparent 0%,rgba(255,255,255,.4) 50%,transparent 100%);
      transform:skewX(-20deg);pointer-events:none;
    }
    .phase-tab-btn:hover::before{animation:phaseTabShine .85s ease;}
    @keyframes phaseTabShine{
      from{left:-75%;}
      to{left:130%;}
    }

    /* ═══════════════════════════════════════════════════════════════
       2026-08-24 REWRITE (Phases B/C/D) — CSS for the God of Destruction
       guide's own interactive elements. Every one of these used to be a
       React onMouseEnter/onMouseLeave pair swapping inline styles; since
       each swap was a static color/shadow/transform change (never
       content), a plain :hover/.is-open rule reproduces it with zero JS.
       `--tc`/`--tc-glow`/`--tc-bg` are per-element CSS custom properties
       set inline at render time (see this file's own JS) — never
       `var(--tc)NN`-style suffix concatenation, which is invalid CSS (see
       CLAUDE.md's standing rule) — any alpha-blended variant is its own
       separate custom property with the alpha already baked in. */
    /* Glow lives on `.ae-hero-card-clip` (the inner overflow:hidden/
       border-radius wrapper that exactly matches the panel's own rounded-
       rect, see boss-guide.js's renderHeroPanelCard) as a box-shadow, NOT
       a `filter:drop-shadow` on `.ae-hero-card` itself. drop-shadow's glow
       silhouette follows the rendered content's own ALPHA shape, not the
       element's box -- harmless back when hero-panel.css's `.hero-cell`
       had an opaque background (the alpha shape WAS the panel rectangle),
       but once that background went transparent (2026-09-08, so a hero's
       own portrait/BG shows through instead of a flat navy fill) the same
       drop-shadow started hugging the portrait's own cutout silhouette
       instead of the panel shape. box-shadow has no such dependency -- it
       always follows the element's own border-box/border-radius,
       regardless of what's opaque or transparent inside it, and (per spec)
       is never clipped by that same element's own overflow:hidden either,
       so it can sit on the clip wrapper safely. */
    .ae-hero-card{transition:transform .18s ease;}
    /* REST-state elevation shadow -- direct correction: "what i meant was
       the dropshadow BEFORE the hover... u werent looking at the right
       settings". .hero-cell (hero-panel.css) already HAS its own real
       box-shadow (0 5.77px 17.31px rgba(0,0,0,.45)) -- but it's a
       DESCENDANT of THIS element, which has overflow:hidden, and an
       ANCESTOR's overflow:hidden genuinely DOES clip a descendant's
       box-shadow (confirmed: .hero-cell's shadow extends past .ae-hero-
       card-clip's own boundary since the scaled content fills it edge to
       edge, so the whole shadow was silently clipped away). This is a
       different mechanism from the hover comment above ("never clipped
       by that same element's own overflow:hidden") -- that rule only
       covers a shadow declared directly ON the clip element itself,
       which is exactly why the fix is to declare the rest-state shadow
       HERE too, matching arena.html's own rest-state value
       (0 4px 14px rgba(0,0,0,.4)), rather than trying to un-clip
       .hero-cell's version. */
    .ae-hero-card-clip{box-shadow:0 4px 14px rgba(0,0,0,.4);transition:box-shadow .18s ease;}
    .ae-alt-preview{transition:transform .18s ease, filter .18s ease;}
    .ae-alt-preview-img{filter:brightness(0.22);transition:filter .18s ease;}
    /* `@media(hover:hover)` -- real bug, not just style, added 2026-09-08 --
       direct report: "In Alt Teams, when clicking on a hero, the animation
       and glow happens as usual. But clicking on them again does not undo
       the state." These were plain `:hover` rules with NO click/tap JS
       behind them at all (confirmed -- no click listener is wired to
       .ae-alt-preview anywhere in this file). A touchscreen fakes `:hover`
       on tap since there's no real pointer to "unhover" with, so the
       glow/lift got stuck on until something ELSE stole focus -- looked
       exactly like a broken toggle from the user's side, but was never a
       toggle to begin with. `hover:hover` is the standard media feature
       for "the primary input can actually hover" (true for mouse, false
       for touch) -- gating these rules behind it means a touch tap simply
       never enters the hover state in the first place, nothing to get
       stuck. Also folded the duplicate `.ae-alt-preview`/`.ae-alt-preview:
       hover` block (both rules were declared twice, byte-identical) into
       one while touching this area. .ae-hero-card (the main formation grid
       cards, not just Alt Teams) had the exact same latent bug and gets
       the same fix -- same root cause, same fix, per this project's own
       standing "check every consumer" rule. */
    /* Ring term added to the hero-card glow (2026-09-08) -- direct
       request, porting arena.html's own hover-glow recipe ("I'm IN LOVE
       with this type-coloured glow style... replicate this for the pve
       hero panels... our cards here in arena have a drop shadow, i want
       that added too"): a thin SOLID ring (0 0 0 1.5px var(--tc)) is what
       arena's version has that this one didn't -- the existing diffuse
       glow alone reads softer/less crisp. Kept on .ae-hero-card-clip
       (never .ae-hero-card itself) for the same box-shadow-vs-drop-
       shadow reason as the rest of this block's own comment. Drop-shadow
       term first tried at arena's own exact value (0 4px 14px
       rgba(0,0,0,.4)) -- direct follow-up report: "drop shadow not
       visible, the other two are great". At this component's real
       on-screen size (~81x193px on Castle Rush, confirmed via direct
       measurement -- far smaller than arena's own ~344x661px card,
       though none of these box-shadow values are affected by the
       panel's OWN internal transform:scale(), they're all on the
       unscaled outer wrapper), the glow term's 14px blur + 2px spread
       (~16px symmetric reach) was painting over nearly the same pixels
       as the drop-shadow's own reach, and since box-shadow list order
       paints front-to-back (glow listed after the ring but before the
       drop-shadow means it visually sits in FRONT of, i.e. over, the
       drop-shadow), the bright glow was masking the darker, similarly-
       sized shadow underneath rather than actually failing to render.
       Fix: pushed the drop-shadow's own reach (8px offset, 18px blur,
       2px spread, darker .55 alpha -- was 4px/14px/none/.4) clearly
       past the glow's ~16px symmetric footprint so it pokes out
       visibly beyond it instead of competing for the same pixels.
       .ae-alt-preview is a different, smaller UI element (Alt Teams
       preview icon, not a hero panel) using filter:drop-shadow for a
       real reason explained above -- left as-is, not in scope for
       "the hero panels." */
    @media (hover:hover){
      .ae-hero-card:hover{transform:translateY(-4px);}
      .ae-hero-card:hover .ae-hero-card-clip{box-shadow:0 0 0 1.5px var(--tc), 0 0 14px 2px var(--tc-glow), 0 8px 18px 2px rgba(0,0,0,.55);}
      .ae-alt-preview:hover{transform:translateY(-4px);filter:drop-shadow(0 6px 18px #00000066) drop-shadow(0 0 14px var(--tc-glow));}
      .ae-alt-preview:hover .ae-alt-preview-img{filter:brightness(1) !important;}
    }
    /* Usable Heroes by Role (2026-08-24) -- a REFERENCE list, not an
       at-a-glance team preview, so portraits stay fully lit always rather
       than dimmed-until-hover. Source order matters: this rule must win
       over the plain .ae-alt-preview-img rule above (equal specificity,
       later wins) without needing !important of its own. */
    .ae-alt-preview-img-bright{filter:brightness(1);}

    .ae-pet-row-btn.is-open{background:#e8962a18;border-color:#e8962a;}
    .ae-pet-row-btn.is-open>div:last-child>div:first-child{color:#e8962a;}

    /* Background only swaps on actual `open` (matches the pre-rewrite
       React version exactly -- its own onMouseEnter/Leave never touched
       background, only the box-shadow/transform "glow" below, which was
       keyed off `hovered||open` together). */
    .ae-speed-btn.is-open{background:#e8962a22;}
    .ae-speed-btn:hover,.ae-speed-btn.is-open{
      box-shadow:0 0 16px 3px #e8962ab0, inset 0 0 8px #e8962a66;transform:scale(1.04);
    }
    .ae-speed-btn:hover img,.ae-speed-btn.is-open img{filter:drop-shadow(0 0 5px #e8962a);}
    .ae-speed-btn:hover span,.ae-speed-btn.is-open span{color:#e8962a;}

    .ae-video-card{border-radius:8px 0 8px 0;overflow:hidden;cursor:pointer;border:1px solid #1a2e42;background:#111f30;box-shadow:none;transition:all .15s;}
    .ae-video-card:hover{border-color:#e05070;box-shadow:0 0 12px #e0507030;}
    .ae-video-card:hover .ae-video-play{background:#e05070;}

    .ae-boss-skill-btn{width:72px;height:72px;border-radius:0;border:2px solid #1a2e42;background:#0d1a2a;cursor:pointer;font-size:30px;display:flex;align-items:center;justify-content:center;transition:all .15s;padding:0;overflow:hidden;}
    /* Hover border uses its own `--tc-hover` (tc+"88" alpha) -- deliberately
       NOT the same value `.is-open` uses (plain opaque `--tc`), matching the
       pre-rewrite React version's own distinct onMouseEnter vs. open-state
       border colors exactly. */
    .ae-boss-skill-btn:hover{transform:scale(1.1);border-color:var(--tc-hover);}
    .ae-boss-skill-btn.is-open{border-color:var(--tc);background:var(--tc-bg);transform:scale(1.12);}
    .ae-boss-skill-btn.is-open:hover{border-color:var(--tc);}

    .ae-anchor-close-x{transition:none;}

    .hb-cell-gear{transition:border-color .18s,box-shadow .18s;}
    .hb-cell-gear:hover{border-color:#d4721a;box-shadow:0 0 20px #d4721a18;}
    .hb-cell-acc{transition:border-color .18s,box-shadow .18s;}
    .hb-cell-acc:hover{border-color:#1e90ff;box-shadow:0 0 20px #1e90ff18;}
    .hb-cell-dedi{transition:border-color .18s,box-shadow .18s;}
    .hb-cell-dedi:hover{border-color:#e05070;box-shadow:0 0 24px #e050701a;}
    .hb-gear-icon-box{transition:opacity .15s;}
    .hb-gear-icon-box:hover{opacity:.85;}
    .hb-acc-slot{border:1px solid #1e90ff22;background:#111f30;box-shadow:none;transition:all .18s;}
    .hb-acc-slot:hover{border-color:#1e90ff88;box-shadow:0 0 16px #1e90ff18;}
    .hb-acc-slot.recommended{border-color:#1e90ff66;background:#1e90ff0a;}
    .hb-acc-slot.recommended:hover{border-color:#1e90ff66;box-shadow:0 0 16px #1e90ff18;}
    .hb-calc-link{display:flex;align-items:center;gap:5px;flex-shrink:0;padding:5px 10px;border-radius:8px 0 8px 0;background:#c8922a1a;border:1px solid #c8922a33;font-family:'SKR Global','Lato',sans-serif;font-size:11px;font-weight:700;letter-spacing:.3px;color:#c8922a;text-decoration:none;transition:all .15s;}
    .hb-calc-link:hover{background:#c8922a2e;border-color:#c8922a;box-shadow:0 0 10px #c8922a26;}
    .hb-viewfull{background:#e8962a1a;color:#e8962a;border:1px solid #e8962a44;border-radius:8px;padding:8px 16px;font-size:13px;font-weight:700;cursor:pointer;text-decoration:none;display:inline-block;transition:all .15s;}
    .hb-viewfull:hover{background:#e8962a;color:#08111e;}
    .ae-modal-close-lit{transition:all .15s;}
    .ae-modal-close-lit:hover{background:#ef4444;color:#fff;border-color:#ef4444;}

    /* ═══ Crit Rate & Weakness Hit table, mobile, 2026-09-08 -- direct
       report: "crit weakness hit table data cant be seen due to rigid
       width. The title column is WAY too wide while the hero columns are
       compacted." The label column was a flat 140px regardless of
       viewport, on a phone that alone ate close to half the table's real
       width before the 4-5 hero columns even got a share -- --stat-label-w
       is set inline (renderStatTable(), boss-guide.js) specifically so a
       plain class rule here can shrink JUST that one custom property
       (!important needed to beat the inline value, same reasoning as
       every other inline-styled element this session). ═══ */
    @media (max-width:760px){
      .bg-stat-table-grid{--stat-label-w:56px !important;}
      .bg-stat-label-cell{font-size:11px !important;padding-left:6px !important;padding-right:4px !important;}
      .bg-stat-hero-name{font-size:11px !important;min-width:0 !important;}
    }

    /* Usable Heroes by Role: mobile subcategory/role label size, 2026-09-08
       -- direct report: "Subcategory font text feels too big." Icon size
       itself is handled at the JS layer (renderUsableHeroesSection()'s own
       `mobile` branch -- the portrait crop's shiftY needs proportional
       adjustment alongside the box size, not something a CSS override
       alone can do correctly), this is just the accompanying text. */
    /* KEYWORD TOOLTIPS -- byte-exact port of codex.html's own .kw/#kw-tooltip
       rules (2026-09-16, direct user parity request -- see boss-guide.js's
       own renderEffectLine()/ensureKwTooltip() comments for the full why).
       Rendered via JS at a fixed screen position (see ensureKwTooltip()),
       never clipped by a modal's own overflow:auto scroll container. */
    .kw{font-weight:700;cursor:help;border-bottom:1px dashed currentColor;display:inline;}
    .kw.buff{color:#6ab0f8;}
    .kw.debuff{color:#f07070;}
    .kw.unique{color:#e8d040;}
    #kw-tooltip{
      display:none;
      position:fixed;
      background:#0d1e30;border:1px solid var(--border2);
      border-radius:var(--RS);padding:10px 12px;
      font-size:12px;color:var(--text-mid);
      z-index:99999;
      box-shadow:0 6px 24px #000000cc;
      pointer-events:none;
      max-width:300px;
      line-height:1.5;
    }
    .kw-tip-inner{display:flex;gap:10px;align-items:flex-start;}
    .kw-tip-icon{width:60px;height:60px;border-radius:var(--RS);background:#162436;border:1px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:26px;flex-shrink:0;}
    .kw-tip-text{font-size:12px;color:var(--text-mid);padding-top:2px;line-height:1.6;white-space:pre-line;}

    @media (max-width:760px){
      .bg-uh-role-title{font-size:11px !important;}
      .bg-uh-subcat-label{font-size:9.5px !important;}
    }
