/* ===== style.css ===== */
:root{
  --bg:#0c161b;--bg2:#122129;--panel:#17282f;--panel-l:#21363f;--panel-x:#2b4652;--line:#35525d;--line-l:#4f707c;
  --text:#FFF6E2;--muted:#c2c9c9;--dim:#8a9aa1;--ink:#11201f;
  --gold:#EFC851;--gold-d:#c8962c;--gold-x:#ffe08a;--red:#FF5555;--red-d:#a8291f;--hp:#ff6058;--blue:#87CEEB;--blue-d:#2f7fb8;
  --teal:#3fd8cf;--teal-d:#1f8f8a;--green:#7FFF00;--green-d:#3f8a33;--purple:#EE82EE;--purple-d:#6e3a9a;--orange:#FFA518;
  --ironclad:#d62000;--silent:#3fa34d;--defect:#2f9fd8;--necrobinder:#c15be6;--regent:#e6b23a;--colorless:#c9c9c9;--curse:#7a4bb0;--status:#8a8a8a;
  --attack:#c9342a;--skill:#3a9da6;--power:#e0a72d;--quest:#8a6cc9;
  --r-basic:#a8a8a8;--r-common:#d9d9d9;--r-uncommon:#5cc3ff;--r-rare:#f7c948;--r-ancient:#ff7d3b;
  --font-t:'Kreon','Georgia',serif;--font-b:'Kreon','Georgia',serif;--font-d:'Spectral','Georgia',serif;--font-i:'Bitter','Georgia',serif;
  --radius:10px;--cw:9.5rem;
  /* layout and spacing tokens (docs/wave2/layout.md): the topbar height the rail and drawer hang from, the rail width, the content
     column cap, and fluid gutter / panel padding / grid gap / block rhythm that shrink on phones and settle at the desktop numbers */
  --tb-h:65px;--rail-w:13.5rem;--rail-w-open:13.5rem;--rail-w-closed:68px;--content-max:calc(70rem - 160px);--safe:calc(var(--gutter)*2); /* --rail-w drops to --rail-w-closed under html[data-rail="closed"] (app/rail.css, docs/wave3/rail.md) */
  --gutter:clamp(.85rem,.5rem + 1.1vw,1.6rem);--pad:clamp(12px,.55rem + .55vw,18px);--gap:clamp(10px,.4rem + .5vw,16px);--stack:clamp(12px,.5rem + .5vw,18px);
  color-scheme:dark;
}
*{box-sizing:border-box}
html{font-size:clamp(15px,calc(10px + 0.42vw),20px);scrollbar-width:thin;scrollbar-color:var(--line-l) rgba(0,0,0,.3)}
::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:rgba(0,0,0,.3)}::-webkit-scrollbar-thumb{background:var(--line-l);border-radius:6px;border:2px solid rgba(0,0,0,.3)}
body{margin:0;font-family:var(--font-b);font-size:1rem;line-height:1.45;color:var(--text);background:var(--bg);min-height:100vh;-webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:var(--gold);text-decoration:none}a:hover{text-decoration:underline}
a.iconlink:hover,a.iconlink:focus-visible{text-decoration:none} /* a picture link (a relic, potion or power icon) never underlines (audit 25 Sep 2026: the keyword pages' "Named by" boxes) */
/* anything that opens a hover plate keeps the arrow, never the text cursor (Bean, 25 Sep 2026, on "TEXT" in Changes by version: "the curcor shouldnt go to
   that stand up line when hovering over somethign that gives you a tool tip"); :where keeps it weakest, so an explicit help cursor still wins; links, buttons, fields and
   everything inside them keep their own */
:where([data-tip],[data-tipside],.kwt,.card[data-kind],.relic[data-kind],.potion[data-kind],.power[data-kind]):not(:where(a,button,summary,label,input,textarea,select,[role=button],[contenteditable],a *,button *,summary *,label *)),:where([data-tip],[data-tipside],.kwt) :not(:where(a,button,summary,label,input,textarea,select,[role=button],[contenteditable],a *,button *,summary *,label *)){cursor:default}
/* .hx: a label that looks like a heading but is not one (the side menu's group names, the footer's column names, the "Purchase today" block), so every page's outline is its own H1 and its own sections (SEO pass, 23 Sep 2026) */
h1,h2,h3,h4,.hx{font-family:var(--font-t);font-weight:700;margin:0;line-height:1.1;text-wrap:balance;letter-spacing:.005em}
h1{font-family:var(--font-d);font-size:clamp(1.9rem,1.3rem + 1.6vw,2.4rem);color:var(--gold);text-shadow:0 2px 0 rgba(0,0,0,.6),0 0 18px rgba(245,198,91,.15)}
h2{font-size:1.7rem;color:var(--gold);margin:0 0 .5rem}
h3{font-size:1.25rem;margin:1.3rem 0 .45rem;color:var(--gold-x)}
h4{font-size:1rem;margin:0 0 .3rem;color:var(--muted)}
p{margin:.35rem 0 .75rem}
.lead{color:var(--muted);max-width:66ch;font-size:1.06rem}
.dim{color:var(--dim)}.muted{color:var(--muted)}.num{color:var(--blue);font-weight:600}.kw{color:var(--gold);font-weight:600}.red{color:var(--red)}
.up{color:var(--green);font-weight:700}
:focus-visible{outline:3px solid #fff;outline-offset:2px}
button{font-family:inherit}select,input,textarea{font-family:inherit;font-size:1rem}
hr{border:0;border-top:2px solid rgba(255,255,255,.08);margin:1.2rem 0}
code{font-family:'Source Code Pro',ui-monospace,monospace;background:rgba(0,0,0,.3);padding:0 .3em;border-radius:4px;font-size:.92em}
.sr{position:absolute;left:-9999px}
/* energy / star glyphs inside card text */
.energy,.energy-ico{display:inline-block;width:1.05em;height:1.05em;vertical-align:-.15em;margin:0 .06em;background:var(--energy-img,radial-gradient(circle at 35% 35%,#fff 0,#87CEEB 35%,#2f7fb8 70%,#173a55 100%));background-size:contain;background-repeat:no-repeat}
.star{display:inline-block;width:1em;height:1em;vertical-align:-.12em;background:radial-gradient(circle,#ffe08a 0,#f5c65b 55%,transparent 60%)}

/* ---------- background stage ---------- */
.bgstage{position:fixed;inset:0;z-index:-1;overflow:hidden;background:var(--bg)}
/* the room art stays clearly visible: a light dim on the image and a vignette that only darkens the edges (the panels carry their own
   near-opaque backgrounds, so text never sits on bare art); the room stands still (no pointer parallax since 23 Sep 2026) */
/* wave 5 (Bean, 22 Sep 2026: "Lower all main page background opacities by 15% across the whole site"): brightness .8 -> .66. Measured on the export at 1900 px, same page,
   same room, the old filter forced back for the comparison (docs/wave5/scratch/shell/lumprobe.js): the rendered backdrop is 15 % darker where the vignette is light (the band
   beside a page's title) and 10 % in the corners, where the unchanged vignette scrim sets most of the light (.68 gave 13 % / 8 %). Done as brightness, not opacity, so a cross-fade
   never dips towards the page colour halfway. The rooms themselves are whole scenes now (app/rooms.js). The room stands still (Bean, 23 Sep 2026: "Please keep the background stagnant, it shouldnt move with the users mouse"). */
.bg-img{position:absolute;inset:-4%;background:center/cover no-repeat;filter:saturate(.95) brightness(.66);opacity:0;transition:opacity .5s ease;/* 1.2 s until 22 Sep 2026 (Bean: "Then fades the new background in later. The fading in feels pretty slow") */transform:scale(1.04)}
.bg-img.on{opacity:1}
.bg-prev{transition:none}   /* the last page's room, standing under the new one while it fades in (core.js BG); it never fades itself, and BG empties it once the new room is opaque */
.bg-img.charroom{filter:saturate(.95) brightness(.33)}   /* a character's own backdrop as the room: half the brightness of a room (Bean: "dim them by 50%"; was .4 of .8) */
.bg-img.dim2{filter:saturate(.95) brightness(.49)}   /* Card Properties (Bean, 22 Sep 2026: "The background on this page specifically is too bright ... just double that feedback on this page"): the rendered backdrop 30 % darker beside the title, 20 % in the corners (measured like .66 above) */
.bgstage::after{content:"";position:absolute;inset:0;background:radial-gradient(120% 90% at 50% 10%,rgba(12,22,27,.04) 0,rgba(12,22,27,.34) 55%,rgba(12,22,27,.66) 100%)}
#motes{position:absolute;inset:0;width:100%;height:100%;opacity:.7}

/* ---------- top bar: the run bar ---------- */
/* the bar's paint (gradient, dark rule, torn bottom edge) lives on ::before so the clip-path cannot clip the search dropdown, which is a
   descendant of the bar; the 13px bottom padding is the old 10px plus the 3px rule that moved onto the pseudo-element */
.topbar{position:sticky;top:0;z-index:60;display:flex;align-items:center;gap:var(--gap);min-height:var(--tb-h);padding:8px max(var(--gutter),env(safe-area-inset-right,0px)) 13px max(var(--gutter),env(safe-area-inset-left,0px));filter:drop-shadow(0 3px 3px rgba(0,0,0,.45)) drop-shadow(0 12px 14px rgba(0,0,0,.5))} /* viewport-fit=cover: the side padding grows into a landscape notch. The bar is a layer above the room with a diffused drop shadow (Bean, 17 Sep 2026: "a real diffused drop shadow makes what's under it look like it's below"): a filter on the bar itself, because the plate's box-shadow dies at its clip-path and a blurred clipped copy of the plate showed only a sliver ("just a line"). drop-shadow follows the torn edge; a tight contact layer plus a wide soft one. */
.topbar::before{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(#233841,#182a31 70%,#132229);border-bottom:3px solid #0a1216;box-shadow:0 4px 14px rgba(0,0,0,.5);clip-path:polygon(0 0,100% 0,100% calc(100% - 4px),97% 100%,93% calc(100% - 5px),88% 100%,80% calc(100% - 4px),70% 100%,60% calc(100% - 6px),50% 100%,40% calc(100% - 4px),30% 100%,20% calc(100% - 5px),10% 100%,4% calc(100% - 4px),0 100%)}
.brand{display:flex;align-items:center;gap:10px;flex:none;color:#fff}
.brand:hover{text-decoration:none}
.brand-box{width:44px;height:44px;border-radius:9px;background:linear-gradient(#3a5563,#1c2f37);border:2px solid #4a6a78;box-shadow:inset 0 2px 0 rgba(255,255,255,.12),0 3px 0 #0a1216;display:grid;place-items:center;overflow:hidden}
.brand-icon{width:40px;height:40px;object-fit:contain}
.brand-word{font-family:var(--font-t);font-size:1.35rem;line-height:1;text-shadow:0 2px 0 rgba(0,0,0,.6)}
.brand-word b{color:var(--gold)}.brand-word i{font-style:normal;color:var(--teal);font-size:.8em;margin-left:.2em;letter-spacing:.06em}
.search{position:relative;flex:1;max-width:620px;margin:0 auto}
.search input{width:100%;padding:9px 14px 8px 40px;border-radius:9px;border:2px solid #0a1216;background:#0f1c22 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a9aa1' stroke-width='2.4'%3E%3Ccircle cx='10.5' cy='10.5' r='6.5'/%3E%3Cpath d='M15.5 15.5 21 21'/%3E%3C/svg%3E") 12px center/18px no-repeat;color:#fff;font-size:1rem;box-shadow:inset 0 3px 0 rgba(0,0,0,.4)}
.search input::placeholder{color:var(--dim)}
.search input:focus{border-color:var(--teal);outline:0;box-shadow:inset 0 3px 0 rgba(0,0,0,.4),0 0 0 3px rgba(63,216,207,.2)}
.sugg{position:absolute;left:0;right:0;top:calc(100% + 6px);background:var(--panel);border:2px solid var(--line-l);border-radius:9px;box-shadow:0 8px 24px rgba(0,0,0,.6);overflow:hidden;z-index:70}
.sugg a{display:flex;align-items:center;gap:10px;padding:7px 12px;color:#fff;border-top:1px solid rgba(255,255,255,.06)}
.sugg a:first-child{border-top:0}.sugg a:hover,.sugg a.sel{background:var(--panel-l);text-decoration:none}
.sugg .k{font-size:.78rem;color:var(--dim);margin-left:auto;text-transform:uppercase;letter-spacing:.08em}
.sugg .sw{width:12px;height:16px;border-radius:3px;flex:none}
.sugg img{width:28px;height:28px;object-fit:contain}
.tb-right{display:flex;gap:8px;flex:none}
.tb-btn{display:inline-flex;align-items:center;gap:7px;min-height:40px;padding:7px 12px;font-family:var(--font-t);font-size:.98rem;cursor:pointer} /* the plate look (sprite, states, the gold .daily) is in app/buttons.css */
.tb-btn.ico{padding:7px 10px;min-width:40px;justify-content:center}
.tb-btn[aria-pressed="false"] .tb-ico.sound{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4 9v6h4l5 4V5L8 9z' fill='%23fff'/%3E%3Cpath d='M16 9l5 6M21 9l-5 6'/%3E%3C/svg%3E")}
.tb-ico{width:18px;height:18px;display:inline-block;background:center/contain no-repeat}
.tb-ico.map{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23f5c65b'%3E%3Cpath d='M4 3h13l3 3v15H4z'/%3E%3Cpath d='M8 8h8M8 12h8M8 16h5' stroke='%23231500' stroke-width='1.6'/%3E%3C/svg%3E")}
.tb-ico.sound{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M4 9v6h4l5 4V5L8 9z' fill='%23fff'/%3E%3Cpath d='M16 8a5 5 0 0 1 0 8M19 5a9 9 0 0 1 0 14'/%3E%3C/svg%3E")}
.navtog{display:none}

/* ---------- layout ---------- */
/* the rail docks at the left edge at every desktop width; the content column fills the rest up to --content-max and is centred in
   that space, so nothing floats in the middle of a wide screen and the footer lines up under the content */
.layout{display:grid;grid-template-columns:var(--rail-w) minmax(0,1fr);gap:var(--safe);padding:1.2rem max(var(--safe),env(safe-area-inset-right,0px)) 2rem max(var(--gutter),env(safe-area-inset-left,0px))}
.main{min-width:0;width:100%;max-width:min(var(--content-max),calc(100% - (var(--rail-w-open) - var(--rail-w))));margin:0 auto}
/* THE SAFE SPACE IS DOUBLE AND THE BARRIER IS TIGHTER (Bean, 21 Sep 2026: "Double the current safe space on left and right please. on larger monitors the content spans out too
   wide"): the content's distance to the rail (the layout's gap) and to the window's right edge (the layout's right padding) are both --safe = 2 x --gutter (they were one
   --gutter: about 26 px at a 1,640 px window, now 53), and --content-max went from 80rem to 70rem, so on a 1,920 px screen the column is about 1,265 px with about 190 px on
   each side (it was 1,445 with 101). The two stay EQUAL (his 19 Sep rule below), the rail keeps its own --gutter to the window's left edge, the top bar is untouched, and the
   single-column layout under 981 px keeps one --gutter (a phone has no room to give). Never set one of the two without the other.
   THE CONTENT 20 PX FURTHER IN ON EACH SIDE ON BIG WINDOWS (Bean, 23 Sep 2026: "left and right safe space max is still a little much, can we bring it in by
   20px on the right and left please"; after the lead had read it backwards and WIDENED the content: "the site content area is still too wide and feels
   overwhelming"; then, looking at his ~1,000 px preview pane with the rail open (content 715 px): "Its so thin"). So only the cap moves: --content-max is
   70rem - 40 px, the content 40 px narrower than on 21 Sep wherever the cap holds (from about 1,500 px; 1,920 px: 186 -> 206 a side). --safe, the space on
   windows below the cap, stays 2 x --gutter: a small window must not get thinner.
   ANOTHER 20 PX A SIDE, AT EVERY WIDTH (Bean, 23 Sep 2026: "another 20 px on each side please, site content still spans too wide"): --content-max 70rem - 80 px
   and --safe 2 x --gutter + 20 px, so big windows and small ones both lose 40 px of content width (under 981 px nothing changes).
   Then "another 40 px on each side please": --content-max 70rem - 160 px, --safe 2 x --gutter + 60 px.
   ONLY THE CAP (Bean, 23 Sep 2026, a ~1,000 px window with the rail closed: "All the safe space changes I made were to only effect a max width for the page
   content, like a literaly max width for people with full big monitors. To be clear the current max safe space is good, but it shouldnt effect these smaller
   screens like this."): --safe is back to 2 x --gutter, --content-max stays 70rem - 160 px. A window below the cap (under about 1,450 px) looks as it did before
   23 Sep; a capped window is unchanged (the column's centre does not depend on --safe). Side-space notes move the CAP, never --safe.
   the width barrier and the centring (Bean, 18 Sep 2026: with the rail collapsed or on a large monitor the content must not "go fully wide" and must "center from the left and
   right side instead of hugging edges"): .main and the footer stop at --content-max (80rem) and sit centred in their column.
   THE SAFE SPACE (Bean, 19 Sep 2026: "the content should be in equal distance from the left side nav and the right edge of the page"): the column runs from the rail to the
   window's right edge, its gap to the rail is the layout's right padding (both --gutter), and .main is centred in it, so the space between the rail and the content ALWAYS
   equals the space between the content and the right edge, rail open or closed, at every width. The layout takes NO extra right padding: the 18 Sep rules that centred the
   column on the WINDOW (a right padding of the rail's width, with the rail closed and from 1900 px) left 29 px beside the rail and 302 px at the right edge on a 1920 px
   window, which is what this note rejects. Never pad one side of .layout without the other. (The footer band below is full width and centres on the window on its own.)
   CLOSING THE RAIL NEVER WIDENS THE CONTENT (Bean, same day, with two screenshots of a site whose side panel closes: "this isnt a reference for how much safe space we
   need, instead how it should function", then "The site also still isn't having safe space between the left nav it is set to extend to it when you close it"): .main's
   cap is also the width it has with the rail OPEN, 100% of its column minus what the rail gave back (--rail-w-open - --rail-w: 0 when open, 13.5rem - 68px when closed).
   So on close the content keeps its width and re-centres: the freed room becomes equal safe space on both sides (1335 px window: 22 / 22 open, 96 / 96 closed, the
   content 1056 px in both). --rail-w-open must stay equal to --rail-w's default. */
.page{animation:pagein .28s ease-out}
@keyframes pagein{from{opacity:0;translate:0 12px}to{opacity:1;translate:0 0}}
/* the footer (18 Sep 2026, Bean: "a proper footer ... professional clean", contact hello@sts.wiki; then "its own section farther down and darker. It needs a background
   color", structured like a big site's footer): a full-width darker band under the whole layout (rail included), well below the last content, holding two rounded panels
   (brand + tagline; the rights line), four link columns and a bottom bar with the version badge and the contact address. Static HTML in shell.html (ssr.js copies the
   <footer> and rewrites its #/ hrefs), so the export needs no script for it. The band ignores the rail: its content centres on the window inside --content-max */
.foot{margin-top:64px;padding:44px max(var(--gutter),env(safe-area-inset-right,0px)) calc(30px + env(safe-area-inset-bottom,0px)) max(var(--gutter),env(safe-area-inset-left,0px));background:#070b0e;border-top:1px solid rgba(255,255,255,.07);color:var(--dim);font-size:.85rem}
.foot-in{max-width:var(--content-max);margin:0 auto;display:grid;gap:14px}
.foot-panel{display:flex;align-items:center;gap:14px 26px;flex-wrap:wrap;padding:18px 24px;border-radius:12px;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.07)}
.foot-panel p{margin:0;flex:1 1 30rem;line-height:1.5}
.foot-brand{font-family:var(--font-t);font-size:1.35rem;font-weight:700;color:var(--text);text-decoration:none;letter-spacing:.01em;white-space:nowrap}
.foot-brand b{color:var(--gold)}.foot-brand i{font-style:italic;font-weight:400;color:var(--muted)}
.foot-brand:hover,.foot-brand:focus-visible{text-decoration:none;color:var(--gold)}
/* the STS.WIKI lockup in place of the words (Bean, 25 Sep 2026: "put the logo here instead of the "slay the spire 2 wiki" text as well please"); the top bar's sprite */
.foot-logo{display:block;width:calc(46px * 3.7697);height:46px;background:var(--spr-brandw) center/contain no-repeat;transition:filter .15s ease}
.foot-brand:hover .foot-logo,.foot-brand:focus-visible .foot-logo{filter:brightness(1.12)}
.foot-tag{color:var(--muted)}
.foot-cols{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px 24px;padding:16px 8px 6px}
.foot-col .hx{margin:0 0 6px;font-family:var(--font-t);font-size:.76rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--gold)}
.foot-col a{display:block;padding:3px 0;color:var(--muted);text-decoration:none}
.foot-col a:hover,.foot-col a:focus-visible{color:var(--text);text-decoration:none}
.foot-bar{display:flex;flex-wrap:wrap;gap:6px 28px;align-items:baseline;justify-content:space-between;margin:0;padding:14px 8px 0;border-top:1px solid rgba(255,255,255,.07)}
.foot-bar .trust{white-space:nowrap;color:var(--muted)}
@media (max-width:700px){.foot-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.foot{margin-top:40px;padding-top:28px}}

/* ---------- the map rail: sections as map nodes joined by a pencil path ---------- */
/* sticky under the topbar; taller than the window on most screens, so it scrolls inside itself with a thin parchment-coloured
   scrollbar and its own wheel (overscroll-behavior keeps the page still until the last node is reached) */
.rail{position:sticky;top:calc(var(--tb-h) + 12px);align-self:start;width:var(--rail-w);max-height:calc(100vh - var(--tb-h) - 24px);overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;scrollbar-width:none;padding:14px 8px 14px 6px;border-radius:14px;background:
  radial-gradient(120% 100% at 50% 0%,rgba(80,64,40,.25),transparent 60%),linear-gradient(#2b2721,#1d1a16);border:2px solid #3b342b;box-shadow:inset 0 0 40px rgba(0,0,0,.45),0 6px 0 #0a0806}
.rail::-webkit-scrollbar{display:none}
.rail .hx{font-family:var(--font-t);font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:#a89a78;margin:10px 0 6px 14px;text-shadow:none}
.rail .hx:first-child,.rail .railhead+.hx{margin-top:0} /* .railhead (the open/close toggle, app/rail.css) is the rail's first child */
.mapnodes{position:relative;display:flex;flex-direction:column;gap:4px;margin:0;padding:0;list-style:none}   /* 4px: Bean, 18 Sep 2026, "2px more of height between each page" */
.mapnodes::before{content:"";position:absolute;left:23px;top:16px;bottom:16px;border-left:3px dotted #7a6a4e;opacity:.8}
.mapnode{position:relative;display:flex;align-items:center;gap:10px;padding:6px 10px 6px 8px;border-radius:9px;color:#e9dcc0;font-family:var(--font-t);font-size:1.02rem;border:2px solid transparent;transition:background .12s,translate .12s}
.mapnode:hover{background:rgba(255,235,190,.08);text-decoration:none;translate:2px 0}
.mapnode.on{background:rgba(245,198,91,.14);border-color:rgba(245,198,91,.5);color:#fff}
.mapnode .ico{width:32px;height:32px;flex:none;background:center/contain no-repeat;filter:drop-shadow(0 2px 0 rgba(0,0,0,.5));position:relative;z-index:1}
.mapnode.on .ico{animation:nodepulse 1.6s ease-in-out infinite}
@keyframes nodepulse{0%,100%{scale:1}50%{scale:1.1}}
.mapnode .n{margin-left:auto;font-size:.78rem;color:#a89a78;font-family:var(--font-b)}
.mapnode .marker{position:absolute;left:-2px;top:50%;translate:-100% -50%;width:18px;height:18px;background:center/contain no-repeat}

/* ---------- surfaces ---------- */
.room{position:relative;background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));border:2px solid var(--line);border-radius:12px;box-shadow:0 6px 0 rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.06);padding:var(--pad) calc(var(--pad) + 2px)}
.room+.room{margin-top:var(--stack)}
.room.tight{padding:calc(var(--pad) * .7) calc(var(--pad) * .8)}
.room.cut{border-radius:6px;clip-path:polygon(14px 0,calc(100% - 14px) 0,100% 14px,100% calc(100% - 14px),calc(100% - 14px) 100%,14px 100%,0 calc(100% - 14px),0 14px)}
.paper{background:linear-gradient(#f0e6cf,#e4d7b8);color:var(--ink);border-radius:8px;padding:12px 14px;text-shadow:none;box-shadow:inset 0 0 30px rgba(120,90,40,.2)}
.paper h4{color:#5a4a2c}
.row{display:flex;flex-wrap:wrap;gap:10px;align-items:center}.row.between{justify-content:space-between}
.stack{display:flex;flex-direction:column;gap:12px}
.grid{display:grid;gap:calc(var(--gap) + 4px) var(--gap)}
.grid.cards{grid-template-columns:repeat(auto-fill,minmax(var(--cw),1fr));justify-items:center;padding:8px 0}
.grid.two{grid-template-columns:repeat(auto-fit,minmax(16rem,1fr))}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(13rem,1fr))}
.grid.icons{grid-template-columns:repeat(auto-fill,minmax(6.4rem,1fr));gap:14px 10px}
.empty{color:var(--dim);padding:30px;text-align:center}
.mt{margin-top:var(--stack)}.mb{margin-bottom:var(--stack)}

/* ---------- buttons: .btn lives in app/buttons.css (the game's event-button sprite as a 9-slice, tinted per role; docs/wave2/buttons.md) ---------- */
.btnrow{display:flex;flex-wrap:wrap;gap:10px}
.pillrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.pill{position:relative;padding:6px 12px 5px;border-radius:999px;border:2px solid var(--line-l);background:rgba(0,0,0,.25);color:var(--muted);cursor:pointer;font-family:var(--font-t);font-size:.95rem;line-height:1}
.pill:hover{border-color:#fff;color:#fff}
.pill.on{background:var(--gold);color:#241600;border-color:var(--gold)}
.pill.on[data-c="ironclad"]{background:var(--ironclad);border-color:var(--ironclad);color:#fff}
.pill.on[data-c="silent"]{background:var(--silent);border-color:var(--silent);color:#fff}
.pill.on[data-c="defect"]{background:var(--defect);border-color:var(--defect);color:#fff}
.pill.on[data-c="necrobinder"]{background:var(--necrobinder);border-color:var(--necrobinder);color:#fff}
.pill.on[data-c="regent"]{background:var(--regent);border-color:var(--regent);color:#241600}
.pill.on[data-c="colorless"]{background:var(--colorless);border-color:var(--colorless);color:#111}
.pill .sw{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:6px;vertical-align:-1px}
.sel{position:relative;display:inline-block}
.sel select{appearance:none;-webkit-appearance:none;padding:8px 34px 7px 12px;border-radius:8px;border:2px solid var(--line-l);background:#0f1c22;color:#fff;cursor:pointer;font-family:var(--font-t)}
.sel::after{content:"";position:absolute;right:12px;top:50%;width:8px;height:8px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);rotate:45deg;translate:0 -70%;pointer-events:none}
/* the list under the plate is the browser's own (Bean, 22 Sep 2026, on a page-drawn restyle: "You changed the look of dropdowns, I didnt ask for that they were fine
   before. The issue wasnt the design, it was that they showed a blank grey background for a moment before they loaded"). That grey moment: Chrome creates the popup
   window in the page's colour scheme, light unless told otherwise, and paints our dark option rules a frame later. color-scheme:dark on the select makes the popup
   dark from its first frame, and the options keep the rules below. */
.sel select{color-scheme:dark}
.toolbar{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:center;margin:10px 0 8px}
.toolbar input[type=search]{padding:8px 12px 7px;border-radius:8px;border:2px solid var(--line-l);background:#0f1c22;color:#fff;min-width:200px}
.tabs{display:flex;gap:6px;flex-wrap:wrap;border-bottom:2px solid rgba(255,255,255,.1);padding-bottom:8px;margin-bottom:12px}
.tabs button{font-family:var(--font-t);font-size:1rem;padding:8px 14px 6px;border:0;border-radius:8px 8px 0 0;background:transparent;color:var(--muted);cursor:pointer}
.tabs button.on{background:var(--panel-l);color:#fff;box-shadow:inset 0 -3px 0 var(--gold)}
.chip{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:6px;background:rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.12);font-size:.85rem;color:var(--muted);line-height:1.3}
.chip.c-attack{border-color:var(--attack);color:#ffb3ad}.chip.c-skill{border-color:var(--skill);color:#a9e6ea}.chip.c-power{border-color:var(--power);color:#ffe0a0}
.chip.r-common{color:var(--r-common)}.chip.r-uncommon{color:var(--r-uncommon)}.chip.r-rare{color:var(--r-rare)}.chip.r-ancient{color:var(--r-ancient)}.chip.r-basic{color:var(--r-basic)}
.chip.ch-ironclad{border-color:var(--ironclad)}.chip.ch-silent{border-color:var(--silent)}.chip.ch-defect{border-color:var(--defect)}.chip.ch-necrobinder{border-color:var(--necrobinder)}.chip.ch-regent{border-color:var(--regent)}
.crumbs{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:.9rem;color:var(--dim);margin:0 0 10px}
.crumbs a{color:var(--muted)}.crumbs span::before{content:"›";margin:0 6px 0 2px;color:var(--dim)}
.toast{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom,0px));translate:-50% 20px;background:var(--panel-l);border:2px solid var(--line-l);color:#fff;padding:9px 16px;border-radius:9px;opacity:0;pointer-events:none;transition:opacity .2s,translate .2s;z-index:90;font-family:var(--font-t)}
.toast.show{opacity:1;translate:-50% 0}

/* ---------- cards: the game's 300x422 card composed from its own sprites (docs/DESIGN_SPEC.md §1) ----------
   1em inside .card = one card pixel (font-size = --cw / 300), so every offset below is the game's own number. */
.card{--u:calc(var(--cw) / 300);position:relative;width:var(--cw);height:calc(var(--cw) * 1.4067);flex:none;user-select:none;-webkit-user-select:none;cursor:pointer;font-size:calc(var(--cw) / 300);line-height:1;color:#FFF6E2;transform-origin:50% 50%;transition:transform .5s cubic-bezier(.16,1,.3,1),scale .5s cubic-bezier(.16,1,.3,1),filter .3s;z-index:1}
.card *{pointer-events:none;box-sizing:border-box}
.card .shadow{position:absolute;left:calc(12*var(--u));top:calc(12*var(--u));width:calc(300*var(--u));height:calc(422*var(--u));background:center/100% 100% no-repeat;filter:brightness(0);opacity:.25;z-index:0}
.card .glow{position:absolute;left:calc(-14*var(--u));top:calc(-14*var(--u));width:calc(328*var(--u));height:calc(450*var(--u));border-radius:calc(22*var(--u));box-shadow:0 0 0 calc(3*var(--u)) rgba(0,244,252,.9),0 0 calc(26*var(--u)) calc(8*var(--u)) rgba(0,244,252,.55);opacity:0;transition:opacity .25s;z-index:0}
.card .portrait{position:absolute;left:calc(25*var(--u));top:calc(43*var(--u));width:calc(250*var(--u));height:calc(190*var(--u));overflow:hidden;background:#141b1f;z-index:1}
.card .portrait img{width:100%;height:100%;object-fit:cover;display:block}
.card .portrait.tall img{object-fit:contain}
.card .frame{position:absolute;left:0;top:0;width:calc(300*var(--u));height:calc(422*var(--u));background:center/100% 100% no-repeat;z-index:2}
.card .pborder{position:absolute;left:calc(12.5*var(--u));top:calc(47*var(--u));width:calc(275*var(--u));height:calc(210*var(--u));background:center/100% 100% no-repeat;z-index:3}
.card .banner{position:absolute;left:calc(-13*var(--u));top:calc(4*var(--u));width:calc(327*var(--u));height:calc(83*var(--u));background:center/100% 100% no-repeat;z-index:4}
.card .title{position:absolute;left:calc(45*var(--u));top:calc(7*var(--u));width:calc(210*var(--u));height:calc(54*var(--u));display:flex;align-items:center;justify-content:center;font-family:var(--font-t);font-weight:400;font-size:calc(26*var(--u));letter-spacing:.04em;color:#FFF6E2;text-align:center;white-space:nowrap;z-index:5;paint-order:stroke fill;-webkit-text-stroke:.23em var(--tout,#4D4B40);text-shadow:.08em .08em 0 rgba(0,0,0,.19)}
.card .title.long{font-size:calc(22*var(--u));-webkit-text-stroke:.24em var(--tout,#4D4B40)}
.card .title.xlong{font-size:calc(18*var(--u));-webkit-text-stroke:.26em var(--tout,#4D4B40)}
.card .plaque{position:absolute;left:50%;top:calc(212*var(--u));translate:-50% 0;min-width:calc(61*var(--u));height:calc(37*var(--u));padding:0 calc(10*var(--u));display:flex;align-items:center;justify-content:center;background:center/100% 100% no-repeat;z-index:5}
.card .plaque span{font-family:var(--font-t);font-weight:700;font-size:calc(16*var(--u));color:rgba(0,0,0,.75);white-space:nowrap;translate:0 -.06em}
.card .energy{position:absolute;left:calc(-16*var(--u));top:calc(-16*var(--u));width:calc(64*var(--u));height:calc(64*var(--u));display:flex;align-items:center;justify-content:center;background:center/100% 100% no-repeat;z-index:6}
.card .energy span{font-family:var(--font-t);font-weight:700;font-size:calc(32*var(--u));color:#FFF6E2;paint-order:stroke fill;-webkit-text-stroke:.25em var(--eout,#5C5440);text-shadow:.06em .06em 0 rgba(0,0,0,.19);translate:0 -.04em}
/* star cost (card.tscn StarIcon): the game's energy_star sprite, set by cardHtml, at (-186,-189) 58x58 under the energy gem; Kreon bold 22, cream, outline (0.1008,0.3668,0.42) */
.card .energy.stars{background:center/100% 100% no-repeat}
.card .energy.stars span{-webkit-text-stroke:.25em #1A5E6B}
.card .energy.starbadge{left:calc(-36*var(--u));top:calc(22*var(--u));width:calc(58*var(--u));height:calc(58*var(--u));z-index:6}
.card .energy.starbadge span{font-size:calc(22*var(--u))}
.card .energy.unplayable span{color:#FF5555;-webkit-text-stroke:.25em #501717}
.card .desc{position:absolute;left:calc(28*var(--u));top:calc(248*var(--u));width:calc(243*var(--u));height:calc(136*var(--u));display:flex;align-items:center;justify-content:center;text-align:center;z-index:5;overflow:hidden}
.card .desc .tx{font-family:var(--font-t);font-size:calc(21*var(--u));line-height:1.08;color:#FFF6E2;text-shadow:.09em .09em 0 rgba(0,0,0,.25);word-wrap:break-word;max-width:100%}
.card .desc.long .tx{font-size:calc(18*var(--u))}.card .desc.xlong .tx{font-size:calc(15.5*var(--u))}.card .desc.xxlong .tx{font-size:calc(13*var(--u))}
.card .desc .kw{color:#EFC851;font-weight:400}.card .desc .num{color:#87CEEB}.card .desc .up{color:#7FFF00}.card .desc .up .num{color:#7FFF00}.card .desc .red{color:#FF5555}
.card .desc .energy-ico{display:inline-block;width:1.05em;height:1.05em;vertical-align:-.15em;background:center/contain no-repeat}
.card .sticker{position:absolute;right:calc(-10*var(--u));top:calc(-10*var(--u));padding:calc(4*var(--u)) calc(12*var(--u));border-radius:calc(8*var(--u));background:#EFC851;color:#241600;font-family:var(--font-t);font-weight:700;font-size:calc(20*var(--u));z-index:7;rotate:8deg;box-shadow:0 .15em 0 rgba(0,0,0,.5)}
.card.upgraded .title{color:#7FFF00;--tout:#1B6131}
/* pool tints: the atlas frame art is red; the game rotates its hue per pool (hsv.gdshader) */
.card[data-pool="ironclad"] .frame,.card[data-pool="ironclad"] .shadow{filter:hue-rotate(9deg) saturate(.85)}
.card[data-pool="silent"] .frame{filter:hue-rotate(115deg) saturate(.45) brightness(1.2)}
.card[data-pool="defect"] .frame{filter:hue-rotate(198deg) saturate(.9)}
.card[data-pool="necrobinder"] .frame{filter:hue-rotate(-13deg) saturate(.55) brightness(1.2)}
.card[data-pool="regent"] .frame{filter:hue-rotate(43deg) saturate(1.5) brightness(1.2)}
.card[data-pool="colorless"] .frame,.card[data-pool="status"] .frame,.card[data-pool="token"] .frame,.card[data-pool="event"] .frame{filter:saturate(0) brightness(1.2)}
.card[data-pool="curse"] .frame{filter:hue-rotate(306deg) saturate(.05) brightness(.55)}
.card .shadow{filter:brightness(0)!important}
/* rarity tints: banner, portrait border and plaque art is cyan-blue; common is desaturated, rare rotated to gold */
.card[data-rar="common"] .banner,.card[data-rar="common"] .pborder,.card[data-rar="common"] .plaque,.card[data-rar="basic"] .banner,.card[data-rar="basic"] .pborder,.card[data-rar="basic"] .plaque,.card[data-rar="token"] .banner,.card[data-rar="token"] .pborder,.card[data-rar="token"] .plaque{filter:saturate(0) brightness(.85)}
.card[data-rar="rare"] .banner,.card[data-rar="rare"] .pborder,.card[data-rar="rare"] .plaque{filter:hue-rotate(203deg) saturate(1.2) brightness(1.14)}
.card[data-rar="curse"] .banner,.card[data-rar="curse"] .pborder,.card[data-rar="curse"] .plaque{filter:hue-rotate(97deg) saturate(1.1) brightness(.9)}
.card[data-rar="status"] .banner,.card[data-rar="status"] .pborder,.card[data-rar="status"] .plaque{filter:hue-rotate(228deg) saturate(.35) brightness(.8)}
.card[data-rar="event"] .banner,.card[data-rar="event"] .pborder,.card[data-rar="event"] .plaque{filter:hue-rotate(315deg) saturate(.85) brightness(.9)}
.card[data-rar="quest"] .banner,.card[data-rar="quest"] .pborder,.card[data-rar="quest"] .plaque{filter:hue-rotate(185deg) saturate(1.7) brightness(.9)}
.card[data-rar="ancient"] .banner,.card[data-rar="ancient"] .pborder,.card[data-rar="ancient"] .plaque{filter:saturate(.2) brightness(.9)}
.card[data-rar="common"],.card[data-rar="basic"],.card[data-rar="token"]{--tout:#4D4B40}.card[data-rar="uncommon"]{--tout:#005C75}.card[data-rar="rare"]{--tout:#6B4B00}.card[data-rar="curse"]{--tout:#550B9E}.card[data-rar="status"]{--tout:#4F522F}.card[data-rar="event"]{--tout:#1B6131}.card[data-rar="quest"]{--tout:#7E3E15}.card[data-rar="ancient"]{--tout:#4D4B40}
.card[data-pool="ironclad"]{--eout:#802020}.card[data-pool="silent"]{--eout:#1A6625}.card[data-pool="defect"]{--eout:#1D5673}.card[data-pool="necrobinder"]{--eout:#803367}.card[data-pool="regent"]{--eout:#803D0E}.card[data-pool="quest"]{--eout:#431E14}
/* hover: the game jumps to full size at once and eases back over half a second (NCardHolder) */
/* hover-in: the grow is the separate `scale` property so it can ease over --hov-in while the tilt (transform) tracks the pointer at 80 ms; leave falls back to the .5s expo-out on .card */
.card.hov,.card:focus-visible{z-index:6;transition:transform 0s,scale var(--hov-in,.22s) cubic-bezier(.2,.7,.3,1)}
.card.hov:not(.still),.card:focus-visible:not(.still){scale:var(--hov-scale,1.15)}
.card.hov .glow,.card:focus-visible .glow{opacity:1}
.card.still{cursor:default}
/* 3D tilt (core.js tiltTo, docs/wave2/card-3d.md): --tx/--ty are the pointer's offset from the card centre (-1..1). The hovered card turns by up to --tilt-x/--tilt-y,
   its layers lift on Z (the bevelled frame stands off the recessed art, banner/plaque/gem sit on top), the shadow slides against the tilt, and a gold-white sheen masked to the
   frame ring (frame alpha minus the description plate) sweeps with the pointer. Tracking eases over 80 ms; leaving falls back to the half-second expo-out on .card.
   Performance (docs/wave2/card-3d.md "Performance"): a card at rest is flat and carries nothing 3D. transform-style:preserve-3d, the layer transitions and the sheen
   only apply while .hov, and while .settle, which setHover leaves on for the 550 ms return so the lifts, the shadow and the sheen ease back in sync with the turn.
   preserve-3d at rest made every layer of every card its own compositor layer (6,036 layers on /cards, 26 ms of commit per frame); the sheen element is created
   by tiltTo on first hover and is display:none at rest, so its two mask layers cost nothing on the 576 cards nobody is pointing at. */
.card{--tilt-x:14deg;--tilt-y:16deg;--sheen:.42}
.mini .card{--tilt-x:7deg;--tilt-y:8deg}
.card.hov,.card.settle{transform-style:preserve-3d}
.card.hov.tilt:not(.still){transform:perspective(800px) rotateX(calc(var(--ty,0) * -1 * var(--tilt-x))) rotateY(calc(var(--tx,0) * var(--tilt-y)));transition:transform .08s linear,scale var(--hov-in,.22s) cubic-bezier(.2,.7,.3,1)}
.card.hov .frame,.card.hov .pborder,.card.hov .banner,.card.hov .title,.card.hov .plaque,.card.hov .energy,.card.hov .desc,.card.hov .sticker,
.card.settle .frame,.card.settle .pborder,.card.settle .banner,.card.settle .title,.card.settle .plaque,.card.settle .energy,.card.settle .desc,.card.settle .sticker{transition:transform .5s cubic-bezier(.16,1,.3,1)}
.card.hov .shadow,.card.settle .shadow{transition:translate .5s cubic-bezier(.16,1,.3,1)}
.card.hov.tilt .frame,.card.hov.tilt .pborder,.card.hov.tilt .banner,.card.hov.tilt .title,.card.hov.tilt .plaque,.card.hov.tilt .energy,.card.hov.tilt .desc,.card.hov.tilt .sticker{transition:transform 0s}
/* the description text must sit above the frame sprite (which paints the dark plate) and the sheen, or it vanishes behind them */
.card.hov.tilt .desc{transform:translateZ(9px)}
.card.hov.tilt .frame{transform:translateZ(6px)}
.card.hov.tilt .pborder{transform:translateZ(8px)}
.card.hov.tilt .banner,.card.hov.tilt .plaque{transform:translateZ(12px)}
.card.hov.tilt .title{transform:translateZ(13px)}
.card.hov.tilt .energy{transform:translateZ(14px)}
.card.hov.tilt .sticker{transform:translateZ(16px)}
.card.hov.tilt .shadow{translate:calc(var(--tx,0) * -8 * var(--u)) calc(var(--ty,0) * -8 * var(--u));transition:translate .08s linear}
/* the sheen only exists on cards that have been hovered (tiltTo) and is only displayed while .hov/.settle; .hov shows it at opacity 0 (flushed by tiltTo before .tilt), so the .12s fade-in below still runs */
.card .sheen{display:none;position:absolute;left:0;top:0;width:calc(300*var(--u));height:calc(422*var(--u));z-index:3;opacity:0;transition:opacity .35s,transform .5s cubic-bezier(.16,1,.3,1);
  background:linear-gradient(calc(118deg + var(--tx,0) * 24deg - var(--ty,0) * 18deg),rgba(255,246,214,0) calc(22% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,246,214,var(--sheen)) calc(46% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,246,214,0) calc(70% + (var(--tx,0) + var(--ty,0)) * 18%));
  -webkit-mask-image:var(--frame),linear-gradient(#000,#000);-webkit-mask-size:100% 100%,calc(252*var(--u)) calc(190*var(--u));-webkit-mask-position:0 0,calc(24*var(--u)) calc(202*var(--u));-webkit-mask-repeat:no-repeat;-webkit-mask-composite:source-out;
  mask-image:var(--frame),linear-gradient(#000,#000);mask-size:100% 100%,calc(252*var(--u)) calc(190*var(--u));mask-position:0 0,calc(24*var(--u)) calc(202*var(--u));mask-repeat:no-repeat;mask-composite:subtract}
.card.hov .sheen,.card.settle .sheen{display:block}
.card.hov.tilt .sheen{opacity:1;transform:translateZ(7px);transition:opacity .12s,transform 0s}
.card.dis{filter:brightness(.5) saturate(.5)}
.mini .card{--cw:5.4rem}
.grid.cards{overflow:visible}

/* ---------- relics, potions, powers ---------- */
/* at rest an icon is a flat positioned box with its own stacking context (z-index:0 rather than isolation:isolate, which would force transform-style:flat) and nothing
   3D; the hover grow, the cursor tilt, the lift, the ground shadow, the outline rim and the sheen live in app/icons3d.css (docs/wave2/icons3d.md) and, like the
   cards, exist only while .hov / .settle. The .5s expo-out here is the return; .hov overrides it with the instant tracking transitions */
.relic,.potion,.power{position:relative;display:inline-grid;place-items:center;width:4.2rem;height:4.2rem;flex:none;cursor:pointer;z-index:0;transition:transform .5s cubic-bezier(.16,1,.3,1),scale .5s cubic-bezier(.16,1,.3,1)}
.relic img,.potion img,.power img{width:88%;height:88%;object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6));image-rendering:auto}
/* the halo: iconHtml emits it for relics; iconFx (core.js) adds one to potions and powers on their first hover (colours in icons3d.css) */
.relic .halo,.potion .halo,.power .halo{position:absolute;inset:8%;border-radius:50%;background:radial-gradient(circle,rgba(245,198,91,.55),transparent 65%);opacity:0;transition:opacity .16s;z-index:-1;pointer-events:none}
.relic:hover .halo,.relic.hov .halo,.potion:hover .halo,.potion.hov .halo,.power:hover .halo,.power.hov .halo{opacity:1}
.relic.r-shop .halo{background:radial-gradient(circle,rgba(63,216,207,.5),transparent 65%)}
.relic.r-rare .halo{background:radial-gradient(circle,rgba(247,201,72,.65),transparent 65%)}
.relic.r-ancient .halo{background:radial-gradient(circle,rgba(255,125,59,.6),transparent 65%)}
.itemcell{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;color:var(--text);font-family:var(--font-t);font-size:.9rem;line-height:1.15}
.itemcell:hover{text-decoration:none}
.itemcell .nm{max-width:7.5rem}
.itemcell .sub{font-size:.75rem;color:var(--dim);font-family:var(--font-b)}
.big .relic,.big .potion,.big .power{width:9rem;height:9rem}
.floaty{animation:floaty 3.2s ease-in-out infinite}
@keyframes floaty{0%,100%{translate:0 0;rotate:-1.2deg}50%{translate:0 -8px;rotate:1.2deg}}

/* ---------- hover tips: the game's hover_tip panel ----------
   scenes/ui/hover_tip.tscn draws a NinePatchRect of images/ui/hover_tip.png (320x96: a 3 px transparent margin, a 6 px slate rim, rounded corners, a dark
   body) with the title in gold (#EFC851, a 25 % black shadow offset 3,2) straight over the body text: no header band, no divider. Ported as a CSS
   border-image (16 px slices, drawn at 11 px: the game's tooltip is 22 px type, ours is ~15 px). The earlier CSS box (border + border-radius + a chamfer
   clip-path) clipped its own rim at the corners (Bean, 17 Sep 2026: "the border around the hover tooltip is cut off on the edges"). */
.tip{position:fixed;z-index:80;pointer-events:none;opacity:0;transition:opacity .1s;max-width:22rem;filter:drop-shadow(0 8px 14px rgba(0,0,0,.6))}
.tip.show{opacity:1}
/* the game's nine-slice hover box: since 22 Sep 2026 only the glossary page draws it, in the page (glossary.css .gl-tip, .cp-tipname); every hover tip is the plate (app/tipbox.css) */
.tipbox{border:11px solid transparent;border-image:url(/img/ui/hover_tip.webp) 16 fill / 11px stretch;color:#f3ead9;font-family:var(--font-b);font-size:.95rem;line-height:1.35}
.tipbox+.tipbox{margin-top:4px}
.tip-head{font-family:var(--font-t);font-weight:700;color:#efc851;padding:1px 4px 0;text-shadow:2px 1px 0 rgba(0,0,0,.3);display:flex;align-items:center;gap:8px}
.tip-head img{width:26px;height:26px;object-fit:contain}
.tip-body{padding:4px 4px 3px}
.tip-head+.tip-body{padding-top:3px}
.tip-body .kw{color:var(--gold)}.tip-body .num{color:var(--blue)}
.tip-foot{padding:3px 4px 2px;display:flex;flex-wrap:wrap;gap:6px}
.tipbox.big{max-width:26rem;font-size:1rem}
.tipwrap{display:flex;flex-direction:column;gap:6px}
/* keyword links (core.js fmt): gold with a dotted underline that firms up on hover, like every other link's hover underline; only a real link ever looks like this */
a.kwt{border-bottom:1px dotted rgba(245,198,91,.6);text-decoration:none}a.kwt:hover,a.kwt:focus-visible{text-decoration:none;border-bottom:1px solid var(--gold)}

/* ---------- list page header, filters, results ---------- */
.ptitle-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px 18px;margin-bottom:10px}
.ptitle-row .cnt{font-family:var(--font-t);color:var(--dim);font-size:1rem}
.filters{display:flex;flex-wrap:wrap;gap:var(--gap) calc(var(--gap) + 4px);align-items:center;padding:calc(var(--pad) * .7) calc(var(--pad) * .8);border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);margin-bottom:var(--stack)}
.filters input[type=search]{min-width:0;flex:1 1 12rem}
.filters label{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-t);font-size:.92rem;color:var(--muted)}
.results{min-height:8rem}
.section-lead{display:flex;gap:18px;align-items:center;flex-wrap:wrap}

/* ---------- detail hero ---------- */
/* the showcase column is auto (the card, relic, stage or event art at its own size); the info column keeps at least 18rem so a wide showcase can never
   starve it (the event art did: an auto track takes the image's intrinsic width, see the min-width:761px cap in the responsive section) */
.hero{display:grid;grid-template-columns:auto minmax(min(100%,18rem),1fr);gap:calc(var(--gap) + 10px);align-items:start}
.hero .showcase{display:flex;flex-direction:column;align-items:center;gap:12px;padding:18px;border-radius:14px;background:radial-gradient(100% 80% at 50% 30%,rgba(63,216,207,.1),transparent 70%),rgba(0,0,0,.25);border:1px solid rgba(255,255,255,.08);min-width:14rem}
.hero .showcase .card{--cw:15rem}
.hero .infocol{min-width:0;max-width:64rem}
.hero h1{margin-bottom:4px}
.hero .gametext{font-size:1.15rem;line-height:1.5;padding:12px 16px;border-left:3px solid var(--gold);background:rgba(0,0,0,.25);border-radius:0 10px 10px 0;margin:10px 0 14px}
.hero .gametext .kw{color:var(--gold)}.hero .gametext .num{color:var(--blue)}.hero .gametext .up{color:var(--green)}
.facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));gap:8px 14px;margin:10px 0}
.fact{padding:8px 10px;border-radius:8px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08)}
.fact .l{display:block;font-size:max(.72rem,11px);letter-spacing:.1em;text-transform:uppercase;color:var(--dim);font-family:var(--font-t)}
.fact .v{display:block;font-family:var(--font-t);font-size:1.08rem;color:#fff;margin-top:2px}
.fact .v a{color:var(--gold)}
.upg-toggle{display:inline-flex;border:2px solid var(--line-l);border-radius:8px;overflow:hidden}
.upg-toggle button{font-family:var(--font-t);font-size:.95rem;padding:7px 14px;background:transparent;border:0;color:var(--muted);cursor:pointer}
.upg-toggle button.on{background:var(--green-d);color:#fff}

.shelf{display:flex;gap:14px;overflow-x:auto;padding:10px 4px 14px;scroll-snap-type:x proximity;scrollbar-width:thin;-webkit-overflow-scrolling:touch}
.shelf>*{scroll-snap-align:start}
.related{display:flex;flex-wrap:wrap;gap:8px}
.related a{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:8px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.1);color:var(--text);font-family:var(--font-t);font-size:.92rem}
.related a img{width:22px;height:22px;object-fit:contain}
.related a:hover{border-color:var(--gold);text-decoration:none}

/* ---------- chapters (prose sections) ---------- */
.chap{position:relative;margin:var(--stack) 0 0;border-radius:12px;background:rgba(0,0,0,.26);border:1px solid rgba(255,255,255,.08);overflow:hidden}
.chap::before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;background:var(--acc,var(--gold))}
.chap-h{display:flex;align-items:center;flex-wrap:wrap;gap:12px;padding:12px var(--pad) 8px}
/* a long title wraps BESIDE its icon, never under it (the headings name their item since the SEO pass, 23 Sep 2026: "Cards that synergize with Decisions,
   Decisions" left the icon alone on its own row at 390 px); only when the title ends the header, so a button or link after it keeps its place (character.css has the same) */
.chap-h>.chap-t:last-child{flex:1 1 11rem;min-width:0}
.chap-ico{width:34px;height:34px;display:grid;place-items:center;border-radius:9px;background:rgba(255,255,255,.06);color:var(--acc,var(--gold));font-family:var(--font-t);font-size:1.2rem;flex:none}
.chap-t h2{font-size:1.35rem;margin:0}.chap-t h2:only-child{padding:.2rem 0}.chap-tag{display:block;font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);font-family:var(--font-t)}.chap-tag.code{text-transform:none;letter-spacing:.03em;font-size:.82rem}
.chap-b{padding:4px var(--pad) 16px;max-width:78ch}
.chap-b p{margin:.4rem 0 .8rem}.chap-b p.lede{font-size:1.08rem;color:#fff}
.chap-b ul{padding-left:1.2rem}.chap-b li{margin:.25rem 0}
.chap-b h3.kick{font-size:1.05rem;color:var(--gold-x);margin:1rem 0 .3rem}
.ch-how{--acc:var(--teal)}.ch-syn{--acc:var(--green)}.ch-anti{--acc:var(--red)}.ch-upg{--acc:var(--gold)}.ch-src{--acc:var(--blue)}.ch-notes{--acc:var(--purple)}.ch-moves{--acc:var(--orange)}.ch-table{--acc:var(--muted)}
details.more summary{cursor:pointer;color:var(--gold);font-family:var(--font-t);list-style:none;display:inline-flex;gap:10px;align-items:center;padding:4px 0}
details.more summary::-webkit-details-marker{display:none}
details.more summary::before{content:"▸";transition:rotate .15s}details.more[open] summary::before{rotate:90deg}
.tbl{width:100%;border-collapse:collapse;font-size:.95rem}
.tbl th,.tbl td{padding:7px 10px;border-bottom:1px solid rgba(255,255,255,.08);text-align:left;vertical-align:top}
.tbl th{font-family:var(--font-t);font-weight:700;color:var(--gold);font-size:.85rem;letter-spacing:.05em;text-transform:uppercase}
.tbl td.num,.tbl th.num{text-align:right;font-variant-numeric:tabular-nums}
.tbl tr:hover td{background:rgba(255,255,255,.03)}
.tblwrap{overflow:auto;max-width:100%;border-radius:8px;border:1px solid rgba(255,255,255,.08);scrollbar-width:thin;-webkit-overflow-scrolling:touch}
.credit{font-size:.82rem;color:var(--dim);margin:14px 0 0}

/* ---------- home: the map ---------- */
.homehero{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:24px;align-items:center}
.homehero h1{font-size:clamp(2rem,4vw,3.2rem)}
/* .mapboard (the act map board), the rotating title word and the map keyframes live in app/home.css */
.dailybox{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:center}
.bignum{font-family:var(--font-t);font-size:2.6rem;color:var(--gold);line-height:1;text-shadow:0 3px 0 rgba(0,0,0,.6)}
.center{text-align:center}
.spot{display:grid;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));gap:14px}
.spot .room{display:flex;gap:14px;align-items:center}
.charfan{display:flex;gap:10px;flex-wrap:wrap}
.charbtn{display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px 12px;border-radius:12px;background:rgba(0,0,0,.3);border:2px solid rgba(255,255,255,.08);color:var(--text);font-family:var(--font-t);min-width:6.5rem;transition:border-color .15s,translate .15s}
.charbtn:hover{border-color:color-mix(in srgb,var(--c,var(--gold)) 75%,#000);translate:0 -3px;text-decoration:none} /* a tile that carries its character's colour (--c, the home tiles: the colour of its .sw bar) lights up in that colour, not gold (Bean, 17 Sep 2026); a quarter darker than the colour itself (Bean, 22 Sep 2026: "make the outer glow / highlight on the characters on the homepage brightness down by 25%", "the hover highlight I mean") */
.charbtn[href$="/ironclad"]:hover{border-color:color-mix(in srgb,var(--ironclad) 42%,#35302e)} /* the Ironclad red a quarter darker was too saturated; a darker, muted brick red (about rgb 121 41 27; Bean, 23 Sep 2026: "the red outline on ironclad on hover is too deep of a red", then "too saturated of a red, actually better if that outline is darker") */
.charbtn img{width:64px;height:64px;object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.charbtn .sw{width:100%;height:4px;border-radius:2px}

/* ---------- enemies ---------- */
.stage{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-height:18rem;padding:24px 16px 14px;border-radius:14px;background:radial-gradient(60% 50% at 50% 100%,rgba(0,0,0,.6),transparent 70%),rgba(0,0,0,.2);border:1px solid rgba(255,255,255,.08);overflow:hidden}
.stage .creature{max-height:22rem;max-width:100%;object-fit:contain;filter:drop-shadow(0 12px 10px rgba(0,0,0,.6));animation:breathe 3.4s ease-in-out infinite;transform-origin:50% 100%}
@keyframes breathe{0%,100%{transform:scaleY(1) translateY(0)}50%{transform:scaleY(1.018) translateY(-2px)}}
.stage .intent{position:absolute;top:10px;left:50%;translate:-50% 0;display:flex;align-items:center;gap:6px;font-family:var(--font-t);font-size:1.3rem;color:#fff;text-shadow:0 2px 0 #000;animation:intentbob 1.4s ease-in-out infinite}
.stage .intent img{width:44px;height:44px;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.6))}
@keyframes intentbob{0%,100%{translate:-50% 0}50%{translate:-50% -5px}}
.hpbar{position:relative;width:min(22rem,90%);height:14px;border-radius:7px;background:#3a0b09;border:2px solid #120404;box-shadow:0 2px 0 rgba(0,0,0,.5);margin-top:8px;overflow:visible}
.hpbar .fill{position:absolute;inset:0;border-radius:6px;background:linear-gradient(#ff7b71,#d6362c);width:var(--hp,100%)}
.hpbar .lbl{position:absolute;left:50%;top:50%;translate:-50% -50%;font-family:var(--font-t);font-weight:700;color:#fff;text-shadow:0 1px 0 #000,0 0 4px #000;font-size:.95rem;white-space:nowrap}
.hpbar .blk{position:absolute;left:-14px;top:50%;translate:0 -50%;width:26px;height:30px;display:grid;place-items:center;font-family:var(--font-t);font-weight:700;color:#fff;text-shadow:0 1px 0 #000;background:linear-gradient(#8fd8ff,#2f7fb8);clip-path:polygon(50% 0,100% 20%,100% 60%,50% 100%,0 60%,0 20%)}
.moves{display:grid;gap:10px}
.move{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start;padding:10px 12px;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08)}
.move .icons{display:flex;gap:4px;flex-wrap:wrap;min-width:3rem}
.move .icons img{width:38px;height:38px;object-fit:contain}
.move .mn{font-family:var(--font-t);font-size:1.1rem;color:#fff}
.move .mv{color:var(--muted);font-size:.95rem}
.move .mv b{color:var(--blue)}
.asc-tog{display:inline-flex;gap:6px;align-items:center;font-family:var(--font-t);font-size:.9rem;color:var(--muted)}
.asc-tog input{accent-color:var(--gold)}

/* ---------- daily: lethal board ---------- */
.lethal{display:grid;grid-template-columns:minmax(0,1fr);gap:14px}
.hand{display:flex;justify-content:center;align-items:flex-end;gap:8px;flex-wrap:wrap;padding:14px 8px 6px;min-height:calc(var(--cw) * 1.6)}
.hand .card{--cw:8.4rem;transition:transform .16s,opacity .3s;cursor:pointer}
.hand .card.dis{filter:brightness(.55) saturate(.6);cursor:not-allowed}
.hand .card.picked{transform:translateY(-14px) scale(1.06)}
.playlog{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:2rem}
.playlog .step{display:inline-flex;align-items:center;gap:6px;padding:4px 9px;border-radius:8px;background:rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.12);font-family:var(--font-t);font-size:.9rem}
.playlog .step b{color:var(--red)}
.playlog .arrow{color:var(--dim)}
.lctl{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between}
.win{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:center;padding:16px;border-radius:12px;background:linear-gradient(90deg,rgba(63,216,207,.12),transparent);border:1px solid rgba(63,216,207,.4);margin-top:12px}
.win.lost{background:linear-gradient(90deg,rgba(230,74,63,.12),transparent);border-color:rgba(230,74,63,.4)}
.kv{display:flex;gap:18px;flex-wrap:wrap;margin:10px 0}
.kv div{display:flex;flex-direction:column;align-items:center;min-width:4.5rem}
.kv b{font-family:var(--font-t);font-size:1.6rem;color:#fff}.kv span{font-size:.78rem;color:var(--dim);text-transform:uppercase;letter-spacing:.08em}
.dist{display:grid;gap:4px;max-width:22rem}
.dist>div{display:grid;grid-template-columns:1.6rem 1fr;gap:6px;align-items:center;font-size:.85rem}
.dist .bar{background:var(--line-l);color:#fff;padding:2px 6px;border-radius:4px;text-align:right;font-family:var(--font-t)}
.dist .bar.me{background:var(--green-d)}
.share-out{width:100%;min-height:6rem;background:#0f1c22;color:#fff;border:2px solid var(--line-l);border-radius:8px;padding:8px;margin-top:8px}
.howto summary{cursor:pointer;color:var(--gold);font-family:var(--font-t)}
.dl-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.dl-input{position:relative;max-width:26rem;margin:8px 0}
.dl-input input{width:100%;padding:10px 14px;border-radius:9px;border:2px solid var(--line-l);background:#0f1c22;color:#fff;font-size:1rem}
.dl-sugg{position:absolute;left:0;right:0;top:calc(100% + 4px);background:var(--panel);border:2px solid var(--line-l);border-radius:9px;overflow:hidden;z-index:20;box-shadow:0 8px 20px rgba(0,0,0,.6)}
.dl-sugg button{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:7px 12px;background:transparent;border:0;border-top:1px solid rgba(255,255,255,.06);color:#fff;cursor:pointer;font-size:.98rem}
.dl-sugg button:hover,.dl-sugg button.sel{background:var(--panel-l)}
.dl-sugg button img{width:30px;height:42px;object-fit:cover;border-radius:3px}
.gu{display:grid;grid-template-columns:5.6rem repeat(5,1fr);gap:8px;align-items:stretch;margin:8px 0}
.gu .who{display:flex;flex-direction:column;align-items:center;gap:4px;font-family:var(--font-t);font-size:.85rem;text-align:center}
.tile{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:8px 6px;border-radius:8px;text-align:center;background:#2b333a;color:#fff;animation:flip .5s ease both;animation-delay:var(--fd,0s);font-family:var(--font-t)}
.tile .lab{font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.7)}
.tile .val{font-size:1rem;line-height:1.15}
.tile.ok{background:var(--green-d)}.tile.close{background:#9c7420}.tile.no{background:#3a3f48}
.tile .arrow{margin-left:4px}
@keyframes flip{from{transform:rotateX(90deg);opacity:0}to{transform:rotateX(0);opacity:1}}
.legend{display:flex;flex-wrap:wrap;gap:14px;color:var(--dim);font-size:.85rem;margin-top:8px}
.legend i{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:5px;vertical-align:-1px}
.games{display:grid;grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));gap:14px}
.gamecard{display:flex;flex-direction:column;gap:8px;padding:16px;border-radius:12px;background:rgba(0,0,0,.3);border:2px solid rgba(255,255,255,.1);color:var(--text)}
.gamecard:hover{border-color:var(--gold);text-decoration:none}
.gamecard h3{margin:0}
.gamecard .st{font-size:.85rem;color:var(--dim)}
.gamecard .creature,.spot .creature,.room .creature{max-height:8rem;width:auto;max-width:100%;object-fit:contain;filter:drop-shadow(0 6px 6px rgba(0,0,0,.6))}
/* THE ENEMIES ROSTER IS A GRID OF THE ACT PAGE'S FIGHT CARDS (pages.js mtCard / mtBoard; Bean, 20 Sep 2026: "Just copy that exact formula over to the enemies page"): the
   card itself is acts.css .arena (room stage, name plate, boss node, the dark foot with the HP); only the grid and the foot's one-line rule are the roster's own. Every
   card is the same height (18 Sep: "These can not be different heights"): the foot never wraps (its right end holds the tags: Elite / Minion / Pet, Fight), a long name takes two lines ON
   the art instead of running out of the card. */
.arenas.mtgrid{grid-template-columns:repeat(auto-fill,minmax(min(100%,16.5rem),1fr))}
.mtidx .mt-h{margin:1.6rem 0 .7rem}.mtidx .results>.mt-h:first-child{margin-top:.4rem}
.mtc .arena-name{white-space:normal;width:max-content;max-width:86%;text-align:center;text-wrap:balance}
.mtc .arena-f{flex-wrap:nowrap;min-height:2.95rem}
.mtc .arena-hp{flex:none;white-space:nowrap}
.mtc .mt-q{margin-left:.15em;color:var(--muted);font-size:.92rem}
.mtc .arena-hp b+.mt-q,.mtc .arena-hp .mt-q:first-of-type{margin-left:0}
.mtc .mt-tags{flex:none;display:inline-flex;align-items:center;gap:6px;margin-left:auto}
.mq-kind{flex:none;font-family:var(--font-t);font-size:.66rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;border-radius:6px;padding:2px 7px;border:1px solid var(--line-l);background:rgba(0,0,0,.55);color:#fff6e2}
.mq-fight{color:var(--gold);border-color:rgba(239,200,81,.5)}
.mq-kind{display:inline-flex;align-items:center}.mq-kind .kind-i{width:1.7em;height:1.7em;margin:-.45em .35em -.4em -.3em}
.mq-boss{border-color:#c4382e;background:rgba(122,24,20,.78)}
.mq-elite{border-color:#b04ac0;background:rgba(84,30,108,.78)}
.gamecard:hover .creature{animation:breathe 2.2s ease-in-out infinite}


/* ---------- events ---------- */
/* the option plate is app/events.css alone: the first-draft .evopt box that lived here (a bordered, clip-pathed rectangle) kept drawing behind the
   game's plate sprite and clipped its hover ring, which Bean saw as "weird square line outlines" (18 Sep 2026). Do not style .evopt here. */
.evart{width:100%;max-height:22rem;object-fit:contain;border-radius:12px;background:rgba(0,0,0,.3)}

/* ---------- timeline / misc ---------- */
.timeline{list-style:none;margin:0;padding:0 0 0 18px;border-left:3px solid var(--line-l)}
.timeline li{position:relative;padding:4px 0 12px 14px}
.timeline li::before{content:"";position:absolute;left:-10px;top:12px;width:11px;height:11px;border-radius:50%;background:var(--gold);border:2px solid var(--bg)}
.vtag{font-family:var(--font-t);color:var(--gold);margin-right:6px}
.tfacts{display:grid;grid-template-columns:repeat(auto-fit,minmax(13rem,1fr));gap:10px;list-style:none;padding:0;margin:8px 0}
.tfact{padding:10px 12px;border-radius:9px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08)}
.badge-v{display:inline-block;padding:2px 8px;border-radius:6px;background:rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.12);font-family:var(--font-t);font-size:.8rem;color:var(--muted)}

/* ---------- responsive ---------- */
/* breakpoints (docs/wave2/layout.md): 1180 the home hero stacks over the map (round 2: beside the rail the map column was 330 px at 1024,
   legend text under 9 px); 980 the rail becomes a drawer and the other side-by-side panels stack; 760 the detail hero stacks;
   640 phone chrome (icon-only topbar, tighter panels, two-column card grid); short desktop windows get a denser rail */
/* wide showcases (event art, a wide creature) are capped so the auto column of .hero cannot take the image's intrinsic width: at 1024 the
   1400 px event art squeezed the info column to 35 px and the page scrolled sideways; under 761 the hero stacks and the art may fill the width */
@media (min-width:761px){.hero .showcase>.evart,.hero .showcase .stage .creature{max-width:min(30rem,40vw)}}
@media (max-width:1180px){.homehero{grid-template-columns:1fr}}
@media (max-width:980px){.layout{grid-template-columns:1fr;padding:1rem max(var(--gutter),env(safe-area-inset-right,0px)) 1.5rem max(var(--gutter),env(safe-area-inset-left,0px))}
  /* the drawer: align-self:auto is required, the sticky rule's align-self:start makes a fixed grid child size to its content and sit at the top of the window (behind the topbar) */
  /* closed = visibility:hidden after the slide, so the 23 off-screen links leave the tab order and the accessibility tree (they stay in the HTML); the dim behind the open drawer is the .railscrim element core.js creates (app/rail.css), which also takes the outside click */
  .rail{position:fixed;top:var(--tb-h);left:0;bottom:0;width:min(85vw,20rem);z-index:55;translate:-110% 0;visibility:hidden;transition:translate .2s,visibility 0s .2s;max-height:none;align-self:auto;border-radius:0 14px 14px 0;padding-left:calc(6px + env(safe-area-inset-left,0px));padding-bottom:calc(14px + env(safe-area-inset-bottom,0px))}
  .rail.open{translate:0 0;visibility:visible;transition:translate .2s,visibility 0s}
  .navtog{display:inline-flex}.brand-word{display:none}}
@media (max-width:760px){.hero{grid-template-columns:1fr}.hero .showcase{min-width:0}.hero .infocol{max-width:none}}
@media (max-width:640px){.topbar{gap:8px;padding:8px max(10px,env(safe-area-inset-right,0px)) 10px max(10px,env(safe-area-inset-left,0px))}.tb-txt{display:none}.tb-btn,.tb-btn.ico{padding:8px;min-width:42px;min-height:42px;justify-content:center}
  .search input{padding-left:36px;background-position:10px center}.search{position:static}.sugg{left:10px;right:10px;top:calc(100% + 2px)}
  input,select,textarea{font-size:max(1rem,16px)}
  h2{font-size:1.5rem}.chap-t h2{font-size:1.25rem}.lead{font-size:1.02rem}
  .room{padding:14px 12px}.room.tight{padding:10px}.chap-h{padding:10px 12px 6px;gap:10px}.chap-b{padding:4px 12px 14px}.filters{padding:10px}
  .facts{grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));gap:6px 8px}.move{gap:8px;padding:8px 10px}
  .stage{min-height:14rem;padding:20px 10px 12px}.stage .creature{max-height:16rem}
  .gu{grid-template-columns:4.4rem repeat(5,1fr);gap:4px}.tile{padding:6px 3px}.tile .val{font-size:.8rem}.tile .lab{font-size:.58rem}.hand .card{--cw:6.4rem}
  .grid.cards{--cw:9.6rem}}
@media (min-width:981px) and (max-height:900px){.mapnode{padding:4px 10px 4px 8px}.mapnodes{gap:3px}.rail .hx{margin:8px 0 4px 14px}}
/* touch: every tappable control at least 40px tall (measured at the 15px phone root: pill 40, tab 42, related link 40, summary 42, crumb 42, linked chip 41,
   footer link 40; the plate buttons are in app/buttons.css, the sortable table headers in app/tables.css; inline links inside prose are left as text) */
@media (hover:none) and (pointer:coarse){.pill{padding:12px 15px 10px}.tabs button{padding:11px 14px 9px}.upg-toggle button{padding:12px 14px}.sel select{padding:10px 34px 9px 12px}.toolbar input[type=search],.filters input[type=search]{padding:10px 12px}.numin{padding:8px}.related a{padding:10px 12px}details.more summary,.howto summary{padding:10px 0}.crumbs{gap:8px;margin-bottom:2px}.crumbs a{display:inline-block;padding:10px 0}.itemcell{padding:4px 0}a.chip{padding:11px 12px}.asc-tog{min-height:40px}.asc-tog input{width:18px;height:18px}.foot-col a{padding:9px 0}}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.001s!important;animation-iteration-count:1!important;transition-duration:.001s!important}.page{animation:none}}

/* ===== app/account.css ===== */
/* ===== ACCOUNT: the rail's account slot, the top bar's avatar button and its menu, the sign-in prompt (wave 6, COMMUNITY stream; app/account.js) =====
   Bean, 23 Sep 2026: sign in with Steam "where the daily puzzles button is now" / "it will show their AVI in the top right with a small dropdown icon".
   html[data-auth="in"] (set before the first paint from the display hint) picks what shows, so nothing appears or moves after the page is drawn; "off" (a file://
   copy without a server) hides it all. The pictures are the game's own: the Steam mark from the mods screen (ui/mods/steam_logo), the profile slot icon as the
   avatar's stand-in (ui/profile/profile_icon_1), the rail's little arrow as the chevron; all three travel in app/shellsprites.css so they are in the first frame. */

/* the rail slot: the avatar and name, signed in only (signing in is the top bar's plate) */
.rail .acct-slot{display:flex;margin:0 0 12px}
html:not([data-auth="in"]) .rail .acct-slot{display:none}
/* the top bar's Sign in with Steam plate, left of Sound (Bean, 23 Sep 2026); 640 px and under the Steam mark alone, like the Map button */
.tb-signin{gap:8px;padding:7px 14px 7px 12px;white-space:nowrap}
.tb-signin .acct-steam{width:20px;height:20px}
@media (max-width:640px){.tb-signin{gap:0}}
.acct-steam{display:inline-block;flex:none;width:20px;height:20px;background:var(--spr-steam) center/contain no-repeat;filter:drop-shadow(0 1px 0 rgba(0,0,0,.55))}
.rail .acct-me{position:relative;display:flex;align-items:center;gap:10px;width:100%;min-width:0;padding:6px 10px 6px 8px;border-radius:9px;border:2px solid rgba(245,198,91,.28);background:linear-gradient(90deg,rgba(245,198,91,.12),rgba(245,198,91,.03) 75%);color:#e9dcc0;font-family:var(--font-t);text-decoration:none;transition:background .12s,translate .12s}
.rail .acct-me:hover{background:linear-gradient(90deg,rgba(245,198,91,.2),rgba(245,198,91,.06) 75%);text-decoration:none;translate:2px 0}
.rail .acct-me:focus-visible{outline:2px solid #fff;outline-offset:-2px}
.rail .acct-me .lbl{display:flex;flex-direction:column;gap:2px;min-width:0}
.acct-nm{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.rail .acct-me .acct-nm{font-size:1rem;font-weight:700;color:var(--gold-x);line-height:1.1}
.acct-sub{font-family:var(--font-b);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:#a89a78;line-height:1}
.acct-av{display:inline-block;flex:none;width:32px;height:32px;border-radius:50%;background:var(--av,none) center/cover no-repeat,#1c2a30 var(--spr-avatar) center/118% no-repeat;box-shadow:0 0 0 2px #b8903d,0 2px 0 2px rgba(0,0,0,.45)}
html[data-auth="in"] .acct-signin{display:none}
html:not([data-auth="in"]) .acct-me{display:none}
html[data-auth="off"] .acct-slot,html[data-auth="off"] .tb-acct,html[data-auth="off"] .tb-signin{display:none}
/* the closed strip (desktop): the Steam mark or the avatar alone, centred like the nodes */
@media (min-width:981px){
  html[data-rail="closed"] .rail .acct-slot{margin:0 0 8px}
  html[data-rail="closed"] .rail .acct-slot .lbl{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
  html[data-rail="closed"] .rail .acct-me{justify-content:center;padding:6px 0;gap:0;border-color:transparent;background:none}
}

/* the top bar: a round avatar at the far right with a small chevron; shown only while signed in */
.tb-acct{display:none;position:relative;align-items:center;gap:5px;height:42px;margin:0 0 0 2px;padding:0 4px 0 3px;border:0;border-radius:24px;background:none;color:#d8c9a4;cursor:pointer;-webkit-tap-highlight-color:transparent}
html[data-auth="in"] .tb-acct{display:inline-flex}
.tb-acct .acct-av{width:34px;height:34px;transition:box-shadow .12s,scale .5s cubic-bezier(.16,1,.3,1)}
.tb-chev{flex:none;width:11px;height:11px;background:currentColor;-webkit-mask:var(--spr-arrow) center/contain no-repeat;mask:var(--spr-arrow) center/contain no-repeat;mask-mode:luminance;rotate:90deg;transition:rotate .2s,color .12s}
.tb-acct:hover,.tb-acct[aria-expanded="true"]{color:var(--gold-x)}
.tb-acct:hover .acct-av,.tb-acct[aria-expanded="true"] .acct-av{box-shadow:0 0 0 2px var(--gold-x),0 2px 0 2px rgba(0,0,0,.45),0 0 12px rgba(245,198,91,.35)}
.tb-acct:hover .acct-av{scale:1.05;transition-duration:.05s}
.tb-acct[aria-expanded="true"] .tb-chev{rotate:-90deg}
.tb-acct:focus-visible{outline:2px solid #fff;outline-offset:2px}

/* the menu: the site's tooltip plate (app/tipbox.css .tp-plate: dark slate, a rim, a hard ledge, the gold stripe down the left) */
.acct-menu{position:fixed;z-index:85;min-width:230px;max-width:calc(100vw - 16px);padding:0 0 6px 4px;border-radius:12px;overflow:hidden;color:#f3ead9;font-family:var(--font-b);
  background:linear-gradient(rgba(25,43,51,.985),rgba(14,25,31,.99));box-shadow:0 0 0 2px color-mix(in srgb,var(--gold-d) 48%,#243c46),0 5px 0 rgba(0,0,0,.55),0 10px 22px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.09)}
.acct-menu[hidden]{display:none}
.acct-menu::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(color-mix(in srgb,var(--gold-d) 80%,#fff),var(--gold-d) 40%,color-mix(in srgb,var(--gold-d) 70%,#000))}
.am-head{display:flex;align-items:center;gap:11px;padding:12px 16px 11px 12px;margin:0 0 5px;border-bottom:1px solid rgba(255,255,255,.08)}
.am-head .acct-av{width:40px;height:40px}
.am-id{display:flex;flex-direction:column;gap:3px;min-width:0}
.am-id .acct-nm{font-family:var(--font-t);font-size:1.05rem;color:#efc851;text-shadow:2px 1px 0 rgba(0,0,0,.3);max-width:180px}
.am-sub{display:flex;align-items:center;gap:5px;font-size:.76rem;color:var(--muted)}
.am-sub .acct-steam{width:14px;height:14px}
.acct-menu [role="menuitem"]{display:flex;align-items:center;width:100%;margin:0;padding:9px 16px 9px 12px;border:0;background:none;color:#f3ead9;font-family:var(--font-t);font-size:.98rem;font-weight:700;line-height:1.2;text-align:left;text-decoration:none;cursor:pointer}
.acct-menu [role="menuitem"]:hover,.acct-menu [role="menuitem"]:focus{outline:none;background:rgba(245,198,91,.14);color:var(--gold-x);text-decoration:none}
.acct-menu [role="menuitem"]:focus-visible{box-shadow:inset 2px 0 0 var(--gold-x)}
.am-sep{height:1px;margin:5px 0;background:rgba(255,255,255,.08)}

/* the sign-in prompt the profile shows signed out (and the Builds and Tier list pages may use: sts2Account.signInPromptHtml) */
.acct-prompt{display:flex;flex-direction:column;align-items:flex-start;gap:14px;max-width:34rem;padding:20px 22px 22px;border-radius:12px;background:linear-gradient(rgba(25,43,51,.9),rgba(14,25,31,.92));box-shadow:0 0 0 2px rgba(122,106,78,.45),0 5px 0 rgba(0,0,0,.45)}
.acct-prompt p{margin:0;color:var(--muted);line-height:1.5}
.acct-prompt .acct-signin{font-size:.95rem}
.acct-prompt-ico{width:48px;height:48px;background:var(--spr-steam) center/contain no-repeat;filter:drop-shadow(0 2px 0 rgba(0,0,0,.5))}
.acct-prompt .acct-prompt-off{display:none;font-size:.88rem;color:var(--dim)}
html[data-auth="off"] .acct-prompt .acct-signin{display:none}
html[data-auth="off"] .acct-prompt .acct-prompt-off{display:block}
@media (max-width:640px){.tb-acct{height:40px;padding:0 2px}.tb-acct .acct-av{width:32px;height:32px}.tb-chev{width:9px;height:9px}}

/* ===== app/achievements.css ===== */
/* ---------- Achievements & badges (app/pages_achievements.js, docs/wave3/achievements.md) ----------
   Rows in Steam's achievement-list order of things (icon, title over description, the global unlock share at the right as a number over a thin bar)
   drawn with the game's own pieces: the statistics screen's achievement holder (achievement_holder.tscn: a 100 px icon with achievement_border laid
   over it, the 64 px achievement_lock centred while locked; locked icon at s .2 v .5, locked border at h .4 s .4 v .8, i.e. hue-rotate(144deg)
   saturate(.4) brightness(.8); title in gold, text cream) and the game-over screen's badge (badge.tscn: bronze / silver / gold holder with the
   icon over it). No Steam chrome; the site's plates, fonts and colours. */
.achpage .chap.ch-ach{--acc:var(--gold)}
.achpage .chap.ch-badge{--acc:#d9a45b}
.achpage .ach-b{padding:2px var(--pad) 16px}
.achpage .ach-b h3.kick{font-size:1.05rem;color:var(--gold-x);margin:18px 0 4px}
.ach-group-note{margin:0 0 10px;font-size:.92rem;color:var(--muted);max-width:78ch}

/* the four numbers, above the filters (pages_achievements.js achStatBox): the enemy page's fact box, one accent each: a glow behind the 3D icon, a lit top
   edge, the value big. Hover moves nothing but the icon's own tilt. Locked while Steam has no numbers: grey icon, the game's achievement lock on it. */
.achsum{display:grid;gap:8px;margin:6px 0 10px}
.achpage .achstats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:0}   /* .achpage: enemyturns.css (.ew-facts, a flex row) is bundled after this file */
/* quiet accents (Bean, 22 Sep 2026: "These glows are overbearing", then "not to remove it completely, it should just be slightly visible"): the radial glow stays at
   12 % of the accent (it was 30 %), the top line is 1 px at .5, the tint 8 %; the accent lives in the label and the number */
.astat{--ac:var(--gold);position:relative;overflow:hidden;isolation:isolate;padding:11px 14px 13px;gap:8px;border-color:color-mix(in srgb,var(--ac) 24%,var(--line));
  background:linear-gradient(158deg,color-mix(in srgb,var(--ac) 8%,rgba(23,40,47,.96)),rgba(14,25,30,.97) 64%)}
.astat::before{content:"";position:absolute;z-index:-1;left:-1.6rem;bottom:-2.6rem;width:8.5rem;height:8.5rem;border-radius:50%;background:radial-gradient(closest-side,color-mix(in srgb,var(--ac) 12%,transparent),transparent);pointer-events:none}
.astat::after{content:"";position:absolute;left:0;right:0;top:0;height:1px;background:linear-gradient(90deg,transparent,var(--ac) 30%,var(--ac) 70%,transparent);opacity:.5;pointer-events:none}
.astat.a-avg{--ac:#5fd0c5}.astat.a-rare{--ac:#b48cff}.astat.a-top{--ac:#ff8f6b}
.astat .ew-fact-h{color:color-mix(in srgb,var(--ac) 62%,var(--dim))}
.astat .ew-fact-row{gap:12px;flex:1}
.astat .ew-fact-i{position:relative;width:3.3rem;height:3.3rem}
.astat .ew-fact-t b{display:block;font-size:1.7rem;line-height:1.05;color:#fff;font-variant-numeric:tabular-nums;text-shadow:0 2px 0 rgba(0,0,0,.45);overflow-wrap:anywhere}
.astat.a-rare:not(.nodata) .ew-fact-t b,.astat.a-top:not(.nodata) .ew-fact-t b{font-size:1.12rem;line-height:1.15}
.astat .ew-fact-t b i{font-style:normal;color:var(--ac)}
.astat .ew-fact-t small{margin-top:3px}
.astat.nodata .ew-fact-i .mi{filter:saturate(.2) brightness(.5)}   /* the game's locked icon: s .2 v .5; the box keeps its colour */
.astat.nodata .ew-fact-i::after{content:"";position:absolute;right:-8%;bottom:-8%;width:56%;height:56%;background:url(/img/packed/achievements/achievement_lock.webp) center/contain no-repeat;filter:drop-shadow(0 2px 2px rgba(0,0,0,.7));pointer-events:none}
/* a locked box's value is the three words "Not live yet" (wave 5, AC1 / AC2): dim, a size that fits one line in the narrowest box, never a dash */
.astat.nodata .ew-fact-t b{color:var(--dim);font-size:1.12rem;line-height:1.15;font-weight:600}
@media (max-width:1100px){.achpage .achstats{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:640px){.achpage .achstats{gap:8px}.astat{padding:9px 10px 11px}.astat .ew-fact-row{gap:8px}.astat .ew-fact-i{width:2.5rem;height:2.5rem}.astat .ew-fact-t b{font-size:1.35rem}.astat.a-rare:not(.nodata) .ew-fact-t b,.astat.a-top:not(.nodata) .ew-fact-t b{font-size:1rem}.astat .ew-fact-h{font-size:.62rem;letter-spacing:.1em}}
/* the filter hides rows, groups and chapters where they stand (achDraw) */
.achpage .f-off{display:none!important}
.achfilt{margin:0 0 12px}
.ach-leak{font-family:var(--font-t);font-weight:700;font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;padding:2px 7px 1px;border-radius:5px;background:rgba(127,220,255,.12);border:1px solid rgba(127,220,255,.5);color:#9fe3ff;text-shadow:none}
#fstatus .fchip[data-v="leaked"].on{border-color:rgba(127,220,255,.7);color:#c9f0ff}
.fgrp-achch .fchip{padding-left:6px}
.fgrp-achch .ach-chi{width:1.6rem;height:1.6rem;margin:-3px 0 -2px;object-fit:contain;filter:saturate(.55) brightness(.9);transition:filter .12s}
.fgrp-achch .fchip:hover .ach-chi,.fgrp-achch .fchip.on .ach-chi{filter:none}
.fgrp-achtier .fchip-i{width:.7rem;height:.7rem;margin:0 2px 1px;border-radius:50%;background:var(--rc,#7d8b91);box-shadow:0 0 0 1px rgba(0,0,0,.5),inset 0 -2px 0 rgba(0,0,0,.25)}
.fgrp-achtier .fchip[data-v="bronze"]{--rc:#c8834a}.fgrp-achtier .fchip[data-v="silver"]{--rc:#c9d3d8}.fgrp-achtier .fchip[data-v="gold"]{--rc:#efc851}
.fgrp-achtier .fchip[data-v="tiered"] .fchip-i{background:linear-gradient(90deg,#c8834a 33%,#c9d3d8 33% 66%,#efc851 66%)}
.achsum-note{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;margin:0;font-size:.9rem;color:var(--muted)}
.achsum-note[hidden]{display:none}
.achsum-note .as-src{color:var(--gold)}
.achsum-note .as-when{color:var(--dim)}
.achsum-note .as-when:empty{display:none}
.as-demo{padding:1px 8px;border-radius:5px;background:rgba(255,125,210,.14);border:1px solid rgba(255,125,210,.55);color:#ff9fdc;font-family:var(--font-t);font-size:.74rem;letter-spacing:.08em;text-transform:uppercase}
.achpage.demo .as-src{color:#ff9fdc}
.ach-status{margin:0 0 12px;font-size:.9rem;line-height:1.35;color:var(--muted);max-width:78ch}

/* the rows */
/* TWO PER LINE, NO HOUSING (Bean, 20 Sep 2026): the results are a plain grid on the page, like every other list; one per line under 1100px, where a row
   (holder, text, share) would be squeezed */
.achres{margin-top:4px}
.achlist{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
@media (max-width:1100px){.achlist{grid-template-columns:minmax(0,1fr)}}
.achres .ach{background:linear-gradient(rgba(23,40,47,.9),rgba(17,30,36,.94));border-color:var(--line);box-shadow:0 4px 0 rgba(0,0,0,.35)}
.achres .ach:hover{background:linear-gradient(rgba(30,50,58,.94),rgba(20,35,42,.96));border-color:var(--line-l)}
.achres .ach-extra{margin-top:16px}
.achres .bd{background:linear-gradient(rgba(23,40,47,.9),rgba(17,30,36,.94));border-color:var(--line);box-shadow:0 4px 0 rgba(0,0,0,.35)}
.lead .ach-leak{vertical-align:.08em}
.achlist+.achlist{margin-top:8px}
.ach{--ico:4.6rem;display:grid;grid-template-columns:var(--ico) minmax(0,1fr) auto;align-items:center;gap:10px 14px;padding:8px 14px 8px 8px;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);transition:background .15s,border-color .15s}
.ach:hover{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14)}
.ach:target{border-color:var(--gold);box-shadow:0 0 0 1px rgba(239,200,81,.35)}
/* the holder: icon, lock, border stacked in the scene's order; the hover grow is the game's button hover (1.05 in .05 s, half a second back) */
.ach-ico{position:relative;width:var(--ico);height:var(--ico);flex:none;transition:transform .5s cubic-bezier(.16,1,.3,1);filter:drop-shadow(0 2px 2px rgba(0,0,0,.5))}
.ach:hover .ach-ico{transform:scale(1.05);transition-duration:.05s}
.ach-ico>*{position:absolute;inset:0;display:block}
.ach-ico .art{width:100%;height:100%;object-fit:contain;border-radius:8%;transition:filter .3s ease-out}
.ach-ico .art.none{background:radial-gradient(60% 60% at 50% 45%,#233a44,#0f1c22);width:auto;height:auto}
.ach-ico .border{background:url(/img/packed/achievements/achievement_border.webp) center/100% 100% no-repeat;pointer-events:none;transition:filter .3s ease-out}
.ach-ico .lock{inset:18%;background:url(/img/packed/achievements/achievement_lock.webp) center/contain no-repeat;opacity:0;filter:drop-shadow(0 2px 2px rgba(0,0,0,.65));transition:opacity .25s ease-out,transform .45s cubic-bezier(.16,1,.3,1)}
/* THE LOCK IS ONLY A STAND-IN FOR MISSING ART (Bean, 20 Sep 2026: "Don't have the locked icon over the in the game achievements", then "just put them all in the same
   category"): an achievement with an icon in the game's files shows it in colour under the gold border; the 11 the files carry no icon for show the game's lock in
   an otherwise empty frame. It marks no category. */
.ach.noart .art{filter:saturate(.2) brightness(.5)}
.ach.noart .border{filter:hue-rotate(144deg) saturate(.4) brightness(.8)}
.ach.noart .lock{opacity:1}
/* a secret achievement keeps its art out of sight (and its lock on) until the reader opens "Reveal it" */
.ach.secret .art{display:none}
.ach.secret .lock,.ach.secret:hover .lock{opacity:1;transform:none}
.ach.secret:has(.ach-reveal[open]) .art{display:block}
.ach.secret:has(.ach-reveal[open]) .lock{opacity:0;transform:translateY(-16%) scale(.86)}
.ach-t{min-width:0}
.ach-n{display:flex;align-items:center;flex-wrap:wrap;gap:3px 10px;margin:0;font-size:1.12rem;line-height:1.15;color:var(--gold);text-shadow:2px 1px 0 rgba(0,0,0,.35)}
.ach-n .ach-locked{color:var(--red)}
.ach-n .ach-code{font-weight:400;letter-spacing:.02em;color:var(--muted)}
.ach-rare{font-family:var(--font-t);font-weight:700;font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;padding:2px 7px 1px;border-radius:5px;background:rgba(239,200,81,.14);border:1px solid rgba(239,200,81,.5);color:var(--gold-x);text-shadow:none}
.ach-rare[hidden]{display:none}
.ach-d{margin:2px 0 0;font-size:.96rem;line-height:1.3;color:var(--text)}
.ach-d.muted{color:var(--muted)}
.ach-reveal{margin-top:3px;font-size:.92rem}
.ach-reveal summary{cursor:pointer;list-style:none;display:inline-block;color:var(--gold);font-family:var(--font-t);padding:2px 0}
.ach-reveal summary::-webkit-details-marker{display:none}
.ach-reveal summary::before{content:"▸ ";color:var(--dim)}
.ach-reveal[open] summary::before{content:"▾ "}
.ach-reveal p{margin:2px 0 0}
/* the share: Steam's number over a thin bar, right-aligned; the bar grows once on first paint (row-staggered) and slides once when the live numbers land */
.ach-p{display:grid;justify-items:end;gap:3px;width:7.4rem}
/* a row Steam has no number for shows NO share cell at all (wave 5, AC1 / AC2: it used to print an em dash and "NO DATA YET" 33 times); the cell stays in the HTML,
   empty, so achSetRow can fill it in place; the row's third column collapses to nothing and the text takes the width */
.ach.nodata .ach-p{display:none}
.ach.nodata{grid-template-columns:var(--ico) minmax(0,1fr)}
.ach-v{font-family:var(--font-t);font-weight:700;font-size:1.32rem;line-height:1;color:#fff;font-variant-numeric:tabular-nums;text-shadow:2px 1px 0 rgba(0,0,0,.35)}
.ach.rare .ach-v{color:var(--gold-x)}
.ach-bar{width:100%;height:6px;border-radius:3px;background:rgba(0,0,0,.45);box-shadow:inset 0 1px 1px rgba(0,0,0,.6),0 1px 0 rgba(255,255,255,.06);overflow:hidden}
.ach-bar i{display:block;height:100%;width:calc(var(--p,0) * 1%);border-radius:3px;background:linear-gradient(90deg,var(--gold-d),var(--gold));box-shadow:0 0 6px rgba(239,200,81,.4);transition:width .8s cubic-bezier(.22,1,.36,1);animation:achgrow .9s cubic-bezier(.22,1,.36,1) backwards;animation-delay:calc(.15s + var(--i,0) * 35ms)}
.ach.rare .ach-bar i{background:linear-gradient(90deg,#c8962c,var(--gold-x))}
.ach-l{font-family:var(--font-t);font-size:.66rem;letter-spacing:.09em;text-transform:uppercase;color:var(--dim);white-space:nowrap}
@keyframes achgrow{from{width:0}}
.ach-extra[hidden]{display:none}

/* badges: the game-over screen's badge (holder + icon over the same rect), the game's per-tier titles and text under it.
   NO HALF-EMPTY ROWS (wave 5, 22 Sep 2026; overview audit BD1: "a badge tile is a picture and a name in a row of three; the rows are half empty"). A badge's text is one
   to three lines and a tiered badge adds its tier names, so tiles in one grid row never matched and the short ones sat over a band of nothing. The wall is now three
   COLUMNS (two beside the rail at 1000 px, one on a phone) that each stack their tiles edge to edge: every tile is exactly as tall as its own text, the gaps are even,
   and the game order reads down each column like a list. Nothing was moved into a hover (badges have no pop-up kind) and nothing reserves a line for a neighbour. */
.badgegrid{display:block;columns:3;column-gap:10px}
.bd{display:grid;grid-template-columns:4.2rem minmax(0,1fr);gap:12px;align-items:start;box-sizing:border-box;break-inside:avoid;page-break-inside:avoid;margin:0 0 10px;padding:10px 12px 10px 10px;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);transition:background .15s,border-color .15s}
@media (max-width:1100px){.badgegrid{columns:2}}
.bd:hover{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14)}
.bd:target{border-color:var(--gold)}
.bd-ico{position:relative;width:4.2rem;height:4.2rem;filter:drop-shadow(0 2px 0 rgba(0,0,0,.45));transition:transform .5s cubic-bezier(.16,1,.3,1)}
.bd:hover .bd-ico{transform:scale(1.05);transition-duration:.05s}
.bd-ico i,.bd-tiers .ic i{position:absolute;inset:0;background:center/contain no-repeat}
.bd-ico .h,.bd-tiers .bronze .ic i{background-image:url(/img/ui/game_over_screen/badge_bronze.webp)}
.bd-ico.silver .h,.bd-tiers .silver .ic i{background-image:url(/img/ui/game_over_screen/badge_silver.webp)}
.bd-ico.gold .h,.bd-tiers .gold .ic i{background-image:url(/img/ui/game_over_screen/badge_gold.webp)}
.bd.off .bd-ico{filter:grayscale(.75) brightness(.72) drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.bd-t{min-width:0}
.bd-t h3{display:flex;flex-wrap:wrap;align-items:center;gap:3px 8px;margin:0;font-size:1.08rem;line-height:1.15;color:var(--gold);text-shadow:2px 1px 0 rgba(0,0,0,.35)}
.bd-tag{font-family:var(--font-t);font-weight:700;font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);text-shadow:none}
.bd-t p{margin:3px 0 0;font-size:.94rem;line-height:1.3}
.bd-tiers{list-style:none;margin:5px 0 0;padding:0;display:grid;gap:4px}
.bd-tiers li{display:grid;grid-template-columns:1.45rem minmax(0,1fr);gap:8px;align-items:center;font-size:.88rem;line-height:1.25}
.bd-tiers .ic{position:relative;width:1.45rem;height:1.45rem;filter:drop-shadow(0 1px 0 rgba(0,0,0,.45))}
.bd-tiers b{font-family:var(--font-t);color:#fff}
.bd-tiers span{color:var(--muted)}
/* a tiered badge in two lines (pages_achievements.js badgeTiersHtml; wave 4, WP6): the sentence once, its three numbers behind the bronze / silver / gold holders, then the
   three tier names in the medals' colours. .bd-tiers above stays as the fallback for a tiered badge with no BD_TIERS entry. */
.bd-ns{display:inline}
.bd-nv{display:inline-flex;align-items:center;gap:.2em;white-space:nowrap;vertical-align:-.2em}.bd-nv+.bd-nv{margin-left:.28em}
.bd-nv .ic{display:block;flex:none;width:1.3em;height:1.3em;margin:-.15em 0;background:center/contain no-repeat;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
.bd-nv.bronze .ic{background-image:url(/img/ui/game_over_screen/badge_bronze.webp)}.bd-nv.silver .ic{background-image:url(/img/ui/game_over_screen/badge_silver.webp)}.bd-nv.gold .ic{background-image:url(/img/ui/game_over_screen/badge_gold.webp)}
.bd-nv b{font-family:var(--font-t);font-size:1.04em;font-variant-numeric:tabular-nums}
.bd-nv.bronze b,.bd-names .bronze{color:#e3a371}.bd-nv.silver b,.bd-names .silver{color:#dbe4e8}.bd-nv.gold b,.bd-names .gold{color:var(--gold)}
.bd-t p.bd-names{display:flex;flex-wrap:wrap;margin:4px 0 0;font-family:var(--font-t);font-size:.8rem;line-height:1.25;letter-spacing:.01em}
.bd-names span:not(:last-child)::after{content:"";display:inline-block;width:3px;height:3px;margin:0 .5em .22em;border-radius:50%;background:var(--dim)}
.bd-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
.bd-chips .chip{font-size:.74rem;padding:1px 7px}
.bd-chips .chip.off{border-color:rgba(255,85,85,.5);color:#ffb3ad}

@media (max-width:640px){
  .achpage .ach-b{padding:2px 10px 12px}
  .ach{--ico:3.5rem;grid-template-columns:var(--ico) minmax(0,1fr);gap:6px 10px;padding:8px}
  .ach-n{font-size:1.02rem}.ach-d{font-size:.9rem}
  .ach-p{grid-column:1/-1;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;justify-items:start;width:auto;gap:8px}
  .ach-v{font-size:1.1rem}
  .badgegrid{columns:1}
  .bd{grid-template-columns:3.4rem minmax(0,1fr);gap:10px;padding:8px 10px 8px 8px}.bd-ico{width:3.4rem;height:3.4rem}
}
@media (prefers-reduced-motion:reduce){
  .ach-bar i{animation:none;transition:none}
  .ach-ico,.bd-ico,.ach-ico .lock,.ach-ico .art{transition:none}
}
/* the one line that owns up to the estimate, only while an easiest / hardest order runs on it */
.achpage .ach-est{margin:6px 2px 0;font-size:.86rem;color:var(--muted)}
.achpage .ach-est[hidden]{display:none}

/* ===== app/acts.css ===== */
/* ===== Acts & encounters, and the enemy page's hero (build/app/pages_acts.js; docs/wave3/acts.md) =====
   The act page is the act's room with the game's act banner (NActBanner: a dark band, "Act 1" Kreon blue over the name in Spectral gold), the
   legend as tiles of the real node sprites with the relic icons' 3D hover. Fights are combat stages: a composited room (src/img/rooms/lethal/**,
   the same files Lethal uses) with the lineup standing on its ground line (rooms_lethal.json: the feet at .6543 of the image height), stills
   scaled by their in-game size; the enemy page's hero is the same stage with one creature. Colours are the game's (DESIGN_SPEC.md): no map paper
   anywhere (Bean, 17 Sep 2026), everything sits on the site's dark housing. Every sprite url below is under src/img. */

/* ---------- the stage: room + lineup on the ground line ---------- */
.encstage{position:relative;overflow:hidden;container-type:size;background:#0b1512;--g:.8;--mh:64cqh}
/* the room composite scaled so its ground line (.6543 of its height) lies on --g of the stage, never narrower than the stage (aspect 2.1333) */
.encstage .encroom{position:absolute;left:50%;top:calc(var(--g)*100cqh - .6543*max(calc(var(--g)/.6543*100cqh),46.875cqw));height:max(calc(var(--g)/.6543*100cqh),46.875cqw);width:auto;max-width:none;translate:-50% 0;pointer-events:none;filter:saturate(.95) brightness(.9)}
.encstage::before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:radial-gradient(90% 60% at 50% 100%,rgba(0,0,0,.35),transparent 70%),linear-gradient(rgba(0,0,0,.18),transparent 30%,transparent 70%,rgba(0,0,0,.28))}
.encstage .lineup{position:absolute;left:3%;right:3%;bottom:calc((1 - var(--g))*100%);z-index:2;height:0;display:flex;justify-content:center;align-items:flex-end;gap:2.5%}
.encstage .lm{position:relative;display:block;flex:0 1 auto;height:calc(var(--f,1)*var(--mh));max-width:calc(92%/var(--n,1));min-width:0;color:var(--text);text-decoration:none;outline:0}
.encstage .lm-img{display:block;height:100%;width:auto;max-width:100%;object-fit:contain;object-position:50% 100%;filter:drop-shadow(0 8px 6px rgba(0,0,0,.6));transform-origin:50% 100%}
.encstage .lm-none{display:grid;place-items:center;width:3rem;color:var(--dim);font-family:var(--font-t);font-size:1.4rem}
/* the shadow ellipse the game draws under a creature */
.encstage .lm::after{content:"";position:absolute;left:8%;right:8%;bottom:-3%;height:8%;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.55),transparent);z-index:-1;pointer-events:none}
.encstage a.lm:hover .lm-img,.encstage a.lm:focus-visible .lm-img,.enct:hover .lm-img,.arena-a:hover .lm-img{animation:breathe 2.2s ease-in-out infinite}
.encstage .lm-img.ca-hide{animation:none}
.encstage a.lm:focus-visible .lm-img{filter:drop-shadow(0 8px 6px rgba(0,0,0,.6)) drop-shadow(0 0 0 #fff) drop-shadow(0 0 3px #fff)}
.encstage .lm .ca-canvas{z-index:2}
/* the opening intent over the creature (the combat screen's intent icon and number, bobbing) */
.encstage .lm-int{position:absolute;left:50%;bottom:calc(100% + .5rem);translate:-50% 0;display:flex;align-items:flex-end;gap:6px;white-space:nowrap;font-family:var(--font-t);font-weight:700;font-size:1.25rem;line-height:1;color:#fff;text-shadow:1px 0 0 #000,-1px 0 0 #000,0 1px 0 #000,0 -1px 0 #000,1px 1px 0 #000,-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,0 2px 0 rgba(0,0,0,.6);animation:intentbob 1.4s ease-in-out infinite;pointer-events:none}
.encstage .lm-int .li{display:inline-flex;align-items:flex-end;gap:3px}
.encstage .lm-int .li+.li{margin-left:4px}
.encstage .lm-int img{width:2.4rem;height:2.4rem;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.6))}
.encstage .lm-int b{font-weight:700}
.encstage .lm-int i{font-style:normal;font-size:.8em;opacity:.95}
.encstage .lm-int .pi-what{font-size:.92rem;text-shadow:inherit}.encstage .lm-int .pi-what img{width:1.5rem;height:1.5rem}   /* the "what" beside a buff/debuff icon (pages.js piWhat) at the lineup's size */
/* the HP bar and the nameplate under the feet (combat_nameplate_background as a mask) */
.encstage .lm-hp{position:absolute;left:50%;top:calc(100% + .55rem);translate:-50% 0;width:max(100%,5rem);max-width:12rem;height:11px;border-radius:6px;background:#3a0b09;border:2px solid #120404;box-shadow:0 2px 0 rgba(0,0,0,.5);z-index:3}
.encstage .lm-hp .fill{position:absolute;inset:0;border-radius:4px;background:linear-gradient(#ff7b71,#d6362c)}
.encstage .lm-hp b{position:absolute;left:50%;top:50%;translate:-50% -50%;font-family:var(--font-t);font-weight:700;font-size:.86rem;line-height:1;color:#fff;text-shadow:0 1px 0 #000,0 0 4px #000;white-space:nowrap}
/* the game's nameplate (creature_state_display.tscn NameplateContainer): the soft plate sprite modulated black at .66 BEHIND the label, the
   label itself unmasked in Kreon cream FFF6E2 with a black shadow (2,1) at .25; a thin dark outline is added so the name reads on any room.
   The plate is a ::before wider and taller than the text box, so the text sits in the sprite's solid middle (alpha .87 there, fading out). */
.encstage .lm-name{position:absolute;left:50%;top:calc(100% + 1.6rem);translate:-50% 0;padding:4px 14px 3px;white-space:nowrap;font-family:var(--font-t);font-weight:700;font-size:1rem;line-height:1.1;color:#FFF6E2;z-index:3}
.encstage .lm-name,.arena-name{text-shadow:2px 1px 0 rgba(0,0,0,.25),0 0 2px #000,0 0 3px #000,0 1px 0 #000,1px 0 0 #000,-1px 0 0 #000,0 -1px 0 #000}
.encstage .lm-name::before,.arena-name::before{content:"";position:absolute;left:-30%;right:-30%;top:-55%;bottom:-55%;z-index:-1;background:rgba(0,0,0,.72);-webkit-mask:url(/img/ui/combat/combat_nameplate_background.webp) center/100% 100% no-repeat;mask:url(/img/ui/combat/combat_nameplate_background.webp) center/100% 100% no-repeat;pointer-events:none}
.encstage.noroom{background:none;overflow:visible;container-type:size}
.encstage.noroom::before{display:none}
.encstage.noroom .lineup{left:0;right:0}

/* ---------- the gold item's Poverty number on a fight page (the enemy pages' .av markup; the show / hide rules live in enemy.css) ---------- */
.encpage .av>.chg{color:#ff9b4a;text-shadow:0 0 10px rgba(255,140,50,.35),0 2px 0 #000}
.encpage .av>.chg::after{content:"▲";display:inline-block;font-size:.5em;line-height:1;vertical-align:.95em;margin-left:.12em;font-style:normal}
.encpage .av>.chg.dn::after{content:"▼"}
.encstage .lm-hp .av>.chg{color:#ffd9b0}
/* the enemy page's stage: the lone creature's .lm is the .stage pages.js enemyTrack / enemyClip and enemy.css address (#intent, img.creature); the frame
   style.css draws for .stage is undone here, the intent sits over the head like the lineups' and the still breathes as it did */
.encstage .lm.stage{display:block;min-height:0;padding:0;border:0;border-radius:0;background:none;overflow:visible}
.encstage .lm.stage .intent{position:absolute;top:auto;left:50%;bottom:calc(100% + .5rem);translate:-50% 0;display:flex;align-items:flex-end;gap:6px;white-space:nowrap;font-family:var(--font-t);font-weight:700;font-size:1.25rem;line-height:1;color:#fff;text-shadow:1px 0 0 #000,-1px 0 0 #000,0 1px 0 #000,0 -1px 0 #000,1px 1px 0 #000,-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,0 2px 0 rgba(0,0,0,.6)}
.encstage .lm.stage .intent img{width:2.4rem;height:2.4rem}
.encstage .lm.stage .creature{max-height:none;max-width:100%;animation:breathe 3.4s ease-in-out infinite}
.encstage .lm.stage .creature.ca-hide{animation:none}
.ehero .enc-hero{--mh:60cqh}

/* ---------- shared bits ---------- */
.mi{width:1.5rem;height:1.5rem;object-fit:contain;vertical-align:middle;filter:drop-shadow(0 2px 1px rgba(0,0,0,.6))}
.chap-ico .chap-img{width:24px;height:24px;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.5))}
.bnode{display:block;width:3.4rem;height:3.4rem;object-fit:contain}
/* boss placeholder icon: ink drawing over its paper-coloured outline (the map tints the white sprite) */
.bnode.ink{position:relative;background:var(--paper,#A78A67);-webkit-mask:var(--out,var(--ico)) center/contain no-repeat;mask:var(--out,var(--ico)) center/contain no-repeat}
.bnode.ink::after{content:"";position:absolute;inset:0;background:var(--ink,#241F1A);-webkit-mask:var(--ico) center/contain no-repeat;mask:var(--ico) center/contain no-repeat}
.ptags{display:inline-flex;flex-wrap:wrap;gap:4px;margin-top:3px}
.ptag{display:inline-block;padding:2px 7px 1px;border-radius:5px;border:1px solid rgba(255,255,255,.14);background:rgba(0,0,0,.3);font-family:var(--font-t);font-size:.74rem;letter-spacing:.06em;text-transform:uppercase;font-style:normal;color:var(--muted)}
.prule{margin:12px 0 0;max-width:78ch;font-size:.95rem;color:var(--muted)}
.prule a{color:var(--gold)}
/* a pool's rule: one short line with the "Full rules" plate at its right (pages_acts.js poolRule) */
.prule.prule-f{max-width:none}
.prule-f .rf-body p{max-width:78ch}
.sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---------- the game's act banner (NActBanner): a dark band, "Act 1" in Kreon blue, the name in Spectral gold ---------- */
.actban{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.15em;padding:.9rem 1rem 1rem;background:rgba(0,0,0,.3);text-align:center;text-wrap:balance}
.actban .actn{font-family:var(--font-t);font-size:clamp(.95rem,.8rem + .5vw,1.2rem);line-height:1;color:#87CEEB;text-shadow:2px 2px 0 rgba(0,0,0,.35)}
.actban h1,.actban .actname{display:block;margin:0;font-family:var(--font-d);font-weight:700;line-height:1;color:#EFC851;text-shadow:3px 3px 0 rgba(0,0,0,.35),0 0 24px rgba(0,0,0,.35)}
.actban h1{font-size:clamp(2.3rem,1.6rem + 3.4vw,4.4rem)}
.actban .actname{font-size:clamp(1.7rem,1.2rem + 1.6vw,2.7rem)}
.actban .actsub{display:inline-flex;align-items:center;gap:6px;margin-top:.5rem;font-family:var(--font-t);font-size:.9rem;color:#fff6e2;text-shadow:0 1px 0 #000}
.actban .actsub a{color:var(--gold-x)}
.actban .actsub .mi{width:1.2rem;height:1.2rem}

/* ---------- the map's counts: one fact box per room kind (wave 4, 21 Sep 2026: the design law, info boxes look like the enemy page's Health / Gold boxes; pages_acts.js
   legendHtml builds them with factBox / factRow, enemyturns.css draws the box). Here only the grid: four to a row, two on a phone, every row full (eight boxes).
   The old borderless rows (.maplegend, .lg) are gone. ---------- */
.ew-facts.mapfacts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:2px 0 0}
.mapmath{display:flex;flex-wrap:wrap;gap:8px 26px;margin:14px 0 4px;font-size:.95rem;color:var(--muted)}
/* a line is ordinary text beside its icon. It was an inline-flex row, which made every fragment of the sentence (the bold number, the words, the link) a column of its
   own: on a phone "17 / 17 / 16 / 15" stood as a stack and "Tough Enemies raises HP," broke into four words one under the other (the standing rule: no cut-off text) */
.mapmath span{display:block;min-width:0;line-height:1.45}
.mapmath .mi{margin:-2px 7px 0 0}
.mapmath b{color:#fff6e2;font-family:var(--font-t);font-size:1.1rem}
.mapmath a{color:var(--gold)}
/* /acts: the three lines share their row with the "Full rules" plate (daily.js rulesFoldHtml: the text wraps round the button's float, the rules open under it) */
.mapmath-f{margin:14px 0 4px}
.mapmath-f .mapmath{display:block;margin:0}
.mapmath-f .mapmath>span{margin:0 0 6px}
.mapmath-f .rf-body{font-size:.95rem;color:var(--muted)}
.mapmath-f .rf-body a{color:var(--gold)}

/* ---------- /acts: the climb, linked by the game's map path (wave 5, 22 Sep 2026; pages_acts.js climbHtml) ----------
   Bean: "We don't need to physically write "then" the lines drawn between should carry that inherently ... just the linking of them drawing out the structure,
   that's important." The old .climb-step ("THEN" in a pill on a dotted line) is gone. Each link is an inline SVG band of map_dot ticks laid the way
   NMapScreen.CreatePath lays them, tinted the untraveled ink (#cl-ink); the "then" is the travel pulse (the game's traveled pop, 1.7 -> 1.2, run down the whole
   trail in tick order every 6 s) and the marker arrow at the start. Desktop bands (.tr-d) scale with the column (viewBox 1000 wide); the phone (.tr-p, .cl-lane,
   .lk-alt) draws the same structure as two vertical lanes beside the stacked first acts. Nothing here needs a script. */
.climb{display:flex;flex-direction:column;align-items:stretch;gap:0;margin:var(--stack) 0 var(--stack)}
.climb-row{display:grid;grid-template-columns:1fr;gap:var(--gap)}
.climb-row.two{grid-template-columns:1fr 1fr}
.climb-slot{position:relative;min-width:0}
.climb-slot>.actcard{height:100%}
/* a row with a single act is a wide banner card */
.climb-row:not(.two) .ac-room{aspect-ratio:4/1}
.climb-link{display:block;line-height:0}
.climb-link svg{display:block}
.climb-link .tr-d{width:100%;height:auto;overflow:visible}
.climb-link .tr-p,.lk-alt,.cl-lane{display:none}
/* the ticks: untraveled at rest, and the travel pulse (opacity up, the 1.7 -> 1.2 pop) running down the trail; --i is the tick's place along it */
.cl-tk{opacity:.62;transform-box:fill-box;transform-origin:center;animation:cl-pulse 6s cubic-bezier(.4,0,.6,1) infinite both;animation-delay:calc(var(--i,0)*.13s)}
@keyframes cl-pulse{0%,18%,100%{opacity:.62;transform:scale(1)}4%{opacity:1;transform:scale(1.6)}9%{opacity:.95;transform:scale(1.15)}}
.cl-circ{opacity:.85;filter:sepia(1) saturate(.55) brightness(1.02)}
/* the marker floats above the node the way NMapMarker does over yours */
.cl-mark{transform-box:fill-box;transform-origin:center;animation:cl-bob 1.6s ease-in-out infinite}
@keyframes cl-bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
/* the end of the climb: the Architect's room after the last boss, a circled node with his still and a link to the event */
.climb-end{display:flex;flex-direction:column;align-items:center;gap:8px;width:max-content;max-width:100%;margin:0 auto;padding:2px 10px 6px;color:var(--text);text-decoration:none;line-height:1.15;text-align:center}
.climb-end:hover{text-decoration:none}
/* the end of the climb as a medallion (Bean, 22 Sep 2026: "she should be displayed larger (a circle is fine to break up all the squares but make her cooler. She is the end of the game"): a 10.5rem disc with the
   victory room's sky, her whole render (640 x 707) standing in it and clipped by the disc, a gold ring on a dark rim with a soft gold glow, the map's brush circle as an outer ring outside the rim so nothing crosses her */
.ce-node{position:relative;display:block;width:10.5rem;height:10.5rem;border-radius:50%;transition:transform .17s cubic-bezier(.6,0,.4,1)}
.ce-disc{position:absolute;inset:0;display:block;border-radius:50%;overflow:hidden;background:#3a2a1c var(--sky) 50% 30%/cover no-repeat;isolation:isolate}
.ce-disc::before{content:"";position:absolute;inset:0;border-radius:50%;background:radial-gradient(circle at 50% 30%,rgba(255,236,180,.35),rgba(255,236,180,0) 58%);pointer-events:none;z-index:2}
.ce-disc::after{content:"";position:absolute;inset:0;border-radius:50%;box-shadow:inset 0 0 0 3px #0a0f10,inset 0 0 0 6px var(--gold),inset 0 0 0 7px rgba(0,0,0,.6),inset 0 -20px 26px rgba(0,0,0,.35);pointer-events:none;z-index:3}   /* the rim over the art */
.ce-art{position:absolute;left:-11%;top:-3%;width:150%;height:auto;filter:drop-shadow(0 8px 10px rgba(0,0,0,.6));pointer-events:none;z-index:1;transform-origin:50% 40%;transition:transform .8s cubic-bezier(.16,1,.3,1)}   /* a portrait: her head (at about 41% / 24% of the 640 x 707 render) a little above the disc's middle, the spear and the beam running out to the rim */
.ce-node::after{content:"";position:absolute;inset:-6px;border-radius:50%;box-shadow:0 0 34px 8px color-mix(in srgb,var(--gold) 17%,transparent),0 14px 24px rgba(0,0,0,.55);pointer-events:none;z-index:-1}   /* the gold glow at half (Bean, 22 Sep 2026: "lower the outer glow opacity by 50% here") */
.climb-end:hover .ce-node,.climb-end:focus-visible .ce-node{transform:translateY(-3px)}
.climb-end:hover .ce-art,.climb-end:focus-visible .ce-art{transform:scale(1.03)}   /* her still zooms in the disc as the act cards' rooms do (.actcard:hover .ac-room>img; Bean, 22 Sep 2026: "needs the hover animation to zoom slightly in on the architects picture like it does for the acts") */
.climb-end:focus-visible{outline:0}.climb-end:focus-visible .ce-disc{box-shadow:inset 0 0 0 3px #0a0f10,inset 0 0 0 6px var(--teal),inset 0 0 0 7px rgba(0,0,0,.6)}
.ce-t{display:flex;flex-direction:column;gap:3px;margin-top:6px}
.ce-t b{font-family:var(--font-t);font-size:1.35rem;color:var(--gold);text-shadow:0 2px 0 #0a0806,0 0 14px rgba(255,214,120,.35)}
.climb-end:hover .ce-t b{color:var(--gold-x)}
.ce-t small{font-size:.78rem;letter-spacing:.06em;text-transform:uppercase;color:var(--dim)}
.actcard{position:relative;display:flex;flex-direction:column;border-radius:12px;border:3px solid #2a2520;box-shadow:0 8px 0 #0a0806;background:#0b1512;overflow:hidden;color:var(--text);text-decoration:none;transition:transform .17s cubic-bezier(.6,0,.4,1),box-shadow .17s cubic-bezier(.6,0,.4,1)}   /* the arena card's hover curve (below): .17 s both ways, symmetric ease-in-out */
.actcard:hover,.actcard:focus-visible{text-decoration:none;transform:translateY(-3px);box-shadow:0 11px 0 #0a0806,0 14px 24px rgba(0,0,0,.35);outline:0}
.actcard:focus-visible{box-shadow:0 11px 0 #0a0806,0 0 0 3px var(--teal)}
.actcard:active{transform:translateY(0);transition-duration:.12s}
.ac-room{position:relative;display:block;aspect-ratio:2.75/1;min-height:9rem;overflow:hidden;background:#0b1512}
.ac-room>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 62%;filter:brightness(.95);transition:transform .8s cubic-bezier(.16,1,.3,1)}
.actcard:hover .ac-room>img{transform:scale(1.03)}
.ac-room .actban{position:absolute;left:0;right:0;top:46%;translate:0 -50%;padding:.55rem 1rem .7rem}
/* one quiet line of counts along the bottom edge, fading up into the art */
.ac-foot{position:absolute;left:0;right:0;bottom:0;display:flex;flex-wrap:wrap;justify-content:center;gap:2px 0;padding:1.5rem .8rem .55rem;background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.55) 45%,rgba(0,0,0,.78));font-family:var(--font-t);font-size:.88rem;line-height:1.2;color:var(--muted);text-shadow:0 1px 0 #000}
.ac-foot span{display:inline-flex;align-items:center;gap:5px}
.ac-foot span+span::before{content:"·";margin:0 .7em;color:var(--dim)}
.ac-foot b{color:#fff6e2;font-size:1.02rem}
.ac-foot .mi{width:1.2rem;height:1.2rem;filter:drop-shadow(0 1px 0 rgba(0,0,0,.6))}
.ac-chip{position:absolute;top:10px;right:10px;display:inline-flex;align-items:center;gap:5px;padding:3px 9px 2px 7px;border-radius:999px;background:rgba(0,0,0,.62);border:1px solid rgba(255,255,255,.14);font-family:var(--font-t);font-size:.78rem;line-height:1.2;color:#fff6e2;white-space:nowrap}
.ac-chip .mi{width:1rem;height:1rem}
.mapchap .chap-b{padding-top:10px}

/* ---------- Additional info (wave 5, 22 Sep 2026; pages_acts.js addInfoChap): the map's shape drawn from the act's numbers at the left, rows of icon + short fact at
   the right, the "Full rules" fold under both (the index). Bean: "layout the other info we need to show in a creative non text dump way that feels cool and creative". ---------- */
.addinfo .chap-b{padding-top:12px}
.addinfo .ai-body{padding:16px 2px 0}
/* the two columns share their height: the strip's box centres its drawing, the rows spread evenly beside it (a short list beside a tall strip leaves no empty band) */
.ai-grid{display:grid;grid-template-columns:minmax(17rem,24rem) minmax(0,1fr);gap:16px 32px;align-items:stretch}
.ai-strip{display:flex;flex-direction:column;justify-content:center;gap:8px;padding:12px 12px 10px;border-radius:12px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);box-shadow:inset 0 1px 0 rgba(255,255,255,.04)}
.mapstrip{display:block;width:100%;height:auto}
.ms-node{fill:none;stroke:#cdbf9a;stroke-width:1.5;opacity:.5}
.ms-fixed{fill:#e9dcb4}
.ms-band{fill:rgba(255,255,255,.07);stroke:rgba(255,255,255,.13);stroke-width:1}
.ms-lab{font:600 13px var(--font-t);fill:var(--muted);letter-spacing:.01em}
.ms-lab.hi{fill:#fff6e2}
.ms-cols{fill:var(--dim);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase}
.cl-defs{position:absolute;width:0;height:0;overflow:hidden}
.ai-note{font-size:.84rem;line-height:1.35;color:var(--dim)}
.mapmath.ai-rows{display:flex;flex-direction:column;justify-content:space-evenly;gap:11px;margin:0;padding:2px 0}
.mapmath .ai-row{display:flex;align-items:flex-start;gap:10px;line-height:1.4}
.mapmath .ai-row>.mi{flex:none;width:1.6rem;height:1.6rem;margin:-1px 0 0}
.mapmath .ai-row>span{display:block;min-width:0}
.ai-fold{margin-top:16px;padding-top:14px;border-top:1px solid rgba(255,255,255,.08)}

/* ---------- /acts/<id>: the hero is the act's room with the act banner; the map legend follows in a .chap ---------- */
.acthero{position:relative;margin:6px 0 0;aspect-ratio:3/1;min-height:11rem;max-height:24rem;border-radius:12px;border:3px solid #2a2520;box-shadow:0 10px 0 #0a0806;background:#0b1512;overflow:hidden}
.acthero .room{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 62%;filter:brightness(.95)}
.acthero .actban{position:absolute;left:0;right:0;top:50%;translate:0 -50%;padding:1.1rem 1rem 1.2rem}

/* the arenas: each boss in its own room, the elites in the act's; a framed board like the map */
.arenas{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap)}
/* an act page's grids fill every row: the column count follows the number of cards (pages_acts.js arenaCols: .cN asks for N columns), granted while the
   chapter's body is wide enough for cards of that size, else --pm columns; the card is a container so its foot and name scale with it and never cut off */
.actpage .chap-b:has(>.arenas){container-type:inline-size}
.actpage .arenas,.actpage .arenas.mtgrid{grid-template-columns:repeat(var(--pm,2),minmax(0,1fr))}
@container (min-width:36rem){.actpage .arenas.c3{grid-template-columns:repeat(3,minmax(0,1fr))}}
@container (min-width:44rem){.actpage .arenas.c4{grid-template-columns:repeat(4,minmax(0,1fr))}}
@container (min-width:55rem){.actpage .arenas.c5{grid-template-columns:repeat(5,minmax(0,1fr))}}
.actpage .arenas.mtgrid>.arena{container-type:inline-size}
.actpage .mtc .arena-f{font-size:clamp(.68rem,5.6cqw,.92rem);padding-left:clamp(8px,4.5cqw,12px);padding-right:clamp(8px,4.5cqw,12px);min-height:0;height:clamp(2.2rem,17cqw,2.95rem)}
.actpage .mtc .arena-hp{gap:.4em}
.actpage .mtc .arena-hp b{font-size:1.25em}
.actpage .mtc .arena-hp .mi{width:1.55em;height:1.55em}
.actpage .mtc .arena-name{font-size:clamp(.92rem,7.2cqw,1.15rem)}
.arena{display:flex;flex-direction:column;border-radius:12px;border:3px solid #2a2520;box-shadow:0 8px 0 #0a0806;background:#0b1512;overflow:hidden;transition:transform .17s cubic-bezier(.6,0,.4,1),box-shadow .17s cubic-bezier(.6,0,.4,1)}
/* THE CARD'S HOVER IS UNHURRIED AND ITS SPEED IS A BELL CURVE (Bean, 20 Sep 2026, on the Enemies and Events directories: "I don't like the abrupt hover animation
   ... It should be a little slower and we need a bell curve for the speed of hover animations"): the lift used to snap up in 50 ms and ease out for half a
   second. Then the same .34 s both ways on a symmetric ease-in-out (slow, fast in the middle, slow), for every .arena card (act pages, Enemies, Events).
   TWICE AS FAST SINCE 21 Sep 2026 (Bean: "The hover effect on enemy directory and anywhere else you applied my "slower" feedback on is now far too slow, it should be
   like 2x faster"): .17 s, THE SAME CURVE (the bell stays: cubic-bezier(.6,0,.4,1)), on .arena, .actcard, .enct here and the three hover rules of guides.css that
   copied it (.gd-act-bg, .gd-opt-i img, .gd-cell-art img). Never back to the 50 ms snap, never a plain ease-out. */
.arena:hover{transform:translateY(-3px);box-shadow:0 11px 0 #0a0806,0 14px 24px rgba(0,0,0,.35)}
.arena-a{position:relative;display:block;color:var(--text);text-decoration:none;outline:0}
.arena-a:hover{text-decoration:none}
/* THE WHOLE CARD IS THE LINK (Bean, 20 Sep 2026, on the Events directory: "the bottom portion of the event where the choices and event type are mentioned can
   also direct you to said page"): the link's own box ends above the foot, so it throws a sheet over the foot too (the card clips it to itself). Nothing in a
   foot is a control; the odds keep their hover title by standing over the sheet. */
.arena-a::after{content:"";position:absolute;left:0;right:0;top:100%;height:10rem}
.arena-odds[title]{position:relative;z-index:1}
.arena-a:focus-visible .arena-stage{box-shadow:inset 0 0 0 3px var(--teal)}
.arena-stage{aspect-ratio:1.5/1;--g:.66;--mh:58cqh}
.arena.elite .arena-stage{--mh:54cqh}
.arena-name{position:absolute;left:50%;bottom:4%;translate:-50% 0;z-index:4;padding:4px 16px 3px;white-space:nowrap;max-width:80%;overflow:visible;text-overflow:ellipsis;font-family:var(--font-t);font-weight:700;font-size:1.15rem;line-height:1.1;color:#FFF6E2}
.arena-odds{display:inline-flex;align-items:center;gap:5px;font-family:var(--font-t);color:var(--muted);white-space:nowrap}
.arena-odds .mi{width:1.2rem;height:1.2rem}
.arena-node{position:absolute;right:8px;top:8px;z-index:4;width:3.4rem;height:3.4rem;padding:5px;border-radius:50%;background:rgba(0,0,0,.6);box-shadow:inset 0 0 0 1px rgba(255,255,255,.14),0 2px 0 rgba(0,0,0,.45);display:grid;place-items:center}
.arena-node:empty{display:none}
.arena-node .bnode{width:100%;height:100%}
.arena-node .bnode.ink{background:transparent}
.arena-node .bnode.ink::after{background:#fff6e2}
.arena-f{display:flex;flex-wrap:nowrap;min-height:2.95rem;align-items:center;justify-content:space-between;gap:4px 12px;padding:9px 12px 10px;background:rgba(0,0,0,.35);border-top:1px solid rgba(255,255,255,.08);font-size:.92rem;color:var(--muted)}
.arena-hp{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-t);color:#fff6e2}
.arena-hp b{font-size:1.15rem;color:#ff6058}
.arena-ms a{color:var(--gold)}
.arena.boss .arena-stage .lm{cursor:pointer}
/* the boss and elite cards stand their creatures by the visible body, as the directory's card does (pages_acts.js cardStand -> pages.js mtStand writes .lm.vb and its
   numbers; enemy.css has these two rules for .mtc, which the pool cards are) */
.arena.boss .encstage .lm.vb,.arena.elite .encstage .lm.vb,.enct .encstage .lm.vb{height:auto;aspect-ratio:var(--ar);width:min(calc(var(--f,1)*var(--mh)*var(--ar)),calc(86cqw/var(--n,1)));max-width:none}
.arena.boss .encstage .lm.vb .lm-img,.arena.elite .encstage .lm.vb .lm-img,.enct .encstage .lm.vb .lm-img{position:absolute;left:var(--ix);top:var(--iy);width:var(--iw);height:var(--ih);max-width:none;object-fit:fill}
/* the /encounters tiles (.enct) stand by the body too (wave 5): wave 4 left them standing by the canvas, the one place that did */

/* the two fight pools over the act's room */
/* the weak and normal pools are grids of the directory's card (pages_acts.js poolCard): nothing of their own to style */

/* the act's ancient is the first fact box of "The map" (pages_acts.js legendItems); its chapter and the .anct tile are gone (wave 4, AC3) */

/* the events with their art */
.evgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(10.5rem,1fr));gap:var(--gap)}
.evt{display:flex;flex-direction:column;gap:7px;color:var(--text);text-decoration:none;min-width:0}
.evt:hover{text-decoration:none}
.evt .evart{display:block;width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:10px;border:2px solid rgba(255,255,255,.1);background:#0b1512;box-shadow:0 4px 0 rgba(0,0,0,.4)}
.evt .evnone{display:grid;place-items:center}
.evt .evnone .mi{width:3rem;height:3rem;opacity:.6}
.evt:hover .evart{border-color:var(--gold)}
.evt-t{display:flex;flex-direction:column;gap:1px;line-height:1.2;padding:0 2px}
.evt-t>b{font-family:var(--font-t);font-size:1rem;color:#fff6e2}
.evt:hover .evt-t>b{color:var(--gold-x)}
.evt-s{font-size:.8rem;color:var(--dim)}

/* ---------- /encounters: the board ---------- */
.encboard{display:grid;grid-template-columns:repeat(auto-fill,minmax(17.5rem,1fr));gap:var(--gap)}
.enct{position:relative;display:flex;flex-direction:column;border-radius:12px;border:2px solid rgba(255,255,255,.1);background:rgba(0,0,0,.3);overflow:hidden;color:var(--text);text-decoration:none;transition:transform .17s cubic-bezier(.6,0,.4,1),border-color .17s cubic-bezier(.6,0,.4,1),box-shadow .17s cubic-bezier(.6,0,.4,1)}
.enct:hover,.enct:focus-visible{text-decoration:none;border-color:var(--gold);transform:translateY(-3px);box-shadow:0 12px 20px rgba(0,0,0,.4);outline:0}
.enct.pool-boss{border-color:rgba(196,56,46,.55)}.enct.pool-elite{border-color:rgba(176,74,192,.5)}
.enct.pool-boss:hover{border-color:#e2574c}.enct.pool-elite:hover{border-color:#c583e8}
.enct-stage{aspect-ratio:2.15/1;--g:.82;--mh:62cqh}
.enct-b{flex:1 1 auto;display:flex;flex-direction:column;gap:7px;padding:10px 12px 11px}
.enct-t{display:flex;flex-direction:column;gap:1px;line-height:1.2;min-width:0}
.enct-t>b{font-family:var(--font-t);font-size:1.12rem;color:#fff6e2}
/* who is in the fight: the line WRAPS, never an ellipsis (the standing rule: no cut-off text; six tiles were cut at 1345 px). The meta row is pinned to the tile's
   foot, so the tiles of a row keep their HP and gold on one line whether the names take one line, two or none. */
.enct-m{font-size:.84rem;line-height:1.3;color:var(--muted);text-wrap:pretty}
.enct-meta{margin-top:auto;display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;font-family:var(--font-t);font-size:.86rem;color:var(--muted)}
.enct-meta>span{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.enct-meta .mi{width:1.35rem;height:1.35rem}
.enct-kind{color:#fff6e2}
.enct-hp b{color:#ff6058}
.enct-gold b{color:var(--gold)}
.enct-act{color:var(--dim)}
/* the filter chips: the act's map paper colour as the gem, the map node sprite for the room */
.fgrp-encact .fchip-i{width:.62rem;height:.62rem;margin:0 2px 1px;rotate:45deg;border-radius:1px;background:var(--rc,#7d8b91);box-shadow:0 0 0 1px rgba(0,0,0,.5)}
.fgrp-encact .fchip[data-v="Overgrowth"]{--rc:#A78A67}.fgrp-encact .fchip[data-v="Underdocks"]{--rc:#9F95A5}.fgrp-encact .fchip[data-v="Hive"]{--rc:#9B9562}.fgrp-encact .fchip[data-v="Glory"]{--rc:#819A97}.fgrp-encact .fchip[data-v="event"]{--rc:#8a9aa1}
/* THE ROOM CHIPS' ICONS ARE THE RUN-HISTORY SET (wave 4 overview, EC4: "chip icons ... are ~8 px and nearly invisible"). They were the map's node icons, dark ink drawn
   for the parchment and small inside their canvas, so on a dark chip they were a smudge. The run-history icons (the ones the tiles and the fact boxes already use,
   pages_acts.js ROOM_ICO) are full colour and fill their canvas; the boss keeps the map's horned chest (there is no generic run-history boss), drawn larger. */
.fgrp-encpool .fchip-i{width:1.4rem;height:1.4rem;margin:-3px 0 -2px -2px;opacity:.85;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.fgrp-encpool .fchip[data-v="weak"] .fchip-i,.fgrp-encpool .fchip[data-v="normal"] .fchip-i{background-image:url(/img/ui/run_history/monster.webp)}
.fgrp-encpool .fchip[data-v="elite"] .fchip-i{background-image:url(/img/ui/run_history/elite.webp)}
.fgrp-encpool .fchip[data-v="boss"] .fchip-i{background-image:url(/img/ui/map/icons/map_chest_boss.webp);background-size:135%}
.fgrp-encpool .fchip[data-v="event"] .fchip-i{background-image:url(/img/ui/run_history/event.webp)}

/* ---------- /encounters/<id>: the combat screen ---------- */
.enchero{position:relative;margin:4px 0 0;padding:14px var(--pad) 16px;border-radius:14px;background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));border:2px solid var(--line);box-shadow:0 6px 0 rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.06)}
.ench-top{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin:0 0 12px}
.ench-top h1{font-size:clamp(1.8rem,1.2rem+1.6vw,2.3rem)}
/* the title and its badges: one row that never wraps (pages_acts.js titleLine); the title's size is fitted to the head's width (100cqw of .ew-head) from its
   letter count, the badges' room taken off first; .56em is a wide average letter of the title face, so the fit errs small */
.ench-tl{flex:1 1 100%;display:flex;flex-wrap:nowrap;align-items:center;gap:6px 12px;min-width:0}
.ench-tl>h1{flex:0 1 auto;min-width:0;margin:0;font-size:min(clamp(1.9rem,1.3rem + 1.6vw,2.4rem),max(1.3rem,calc((100cqw - var(--chw,6rem) - 14px)/(var(--tn,12)*.56))))}   /* the cap is the site's h1 size (style.css h1); a + inside clamp() needs its spaces or the whole value is void */
.ench-tl>.chip,.ench-tl>.ench-kind{flex:none;white-space:nowrap}
.ench-kind{display:inline-flex;align-items:center;padding:4px 10px 3px;border-radius:6px;border:1px solid rgba(255,255,255,.14);background:rgba(0,0,0,.35);font-family:var(--font-t);font-weight:700;font-size:.86rem;letter-spacing:.05em;text-transform:uppercase;color:#fff6e2}
/* the kind chip's icon (pages_acts.js kindIco): the elite face, a boss's own run-history icon; it hangs a little out of the chip so it reads at chip size */
.kind-i{flex:none;width:1.55em;height:1.55em;margin:-.35em .4em -.3em -.25em;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.chip.ekind{display:inline-flex;align-items:center}
.ench-kind.kind-boss{border-color:#c4382e;background:rgba(160,30,24,.4)}
.ench-kind.kind-elite{border-color:#b04ac0;background:rgba(110,40,140,.38)}
.ench-kind.kind-weak{border-color:var(--teal-d)}
.enc-hero{width:100%;aspect-ratio:2.4/1;max-height:27rem;min-height:15rem;border-radius:12px;border:3px solid #2a2520;box-shadow:0 8px 0 #0a0806;--g:.76;--mh:56cqh}
.enc-hero .lineup{gap:4%}
.enc-hero .lm{max-width:calc(90%/var(--n,1))}
.encfacts{display:flex;flex-wrap:wrap;gap:10px 26px;margin:22px 0 0}
.encfacts .ef{align-items:center;gap:9px;font-size:1.05rem}
.encfacts .ef-i{flex:none;width:2.4rem;height:2.4rem;display:grid;place-items:center}
.encfacts .ef-i .mi{width:2.2rem;height:2.2rem}
.encfacts .rk-t b{font-size:1.25rem}
.encfacts .rk-t a{color:var(--gold)}
.encfacts .ef[data-tip]{cursor:help}
.encfacts .rk-relic .power{width:3.4rem;height:3.4rem}
/* opening moves: one track per enemy */
.opn{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;padding:8px 0}
.opn+.opn{border-top:1px solid rgba(255,255,255,.08)}
.opn-who{display:inline-flex;align-items:center;gap:8px;flex:0 0 12rem;color:#fff6e2;text-decoration:none;font-family:var(--font-t)}
.opn-who img{width:2.8rem;height:2.8rem;object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.opn-who:hover b{color:var(--gold-x)}
.opn-track{display:flex;flex-wrap:wrap;align-items:center;gap:6px 4px;flex:1 1 20rem;min-width:0}
.opn-mv{display:inline-flex;flex-direction:column;align-items:center;gap:2px;min-width:5.2rem;padding:6px 10px 5px;border-radius:9px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);font-family:var(--font-t);line-height:1.1;text-align:center}
.opn-turn{font-size:.68rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.opn-int{display:inline-flex;gap:2px;min-height:2rem;align-items:center}
.opn-int img{width:2rem;height:2rem;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.6))}
.opn-mv b{font-size:.92rem;color:#fff6e2}
.opn-mv i{font-style:normal;font-size:.86rem;color:#ff9b8a}
.opn-arrow{display:inline-block;width:.6rem;height:.6rem;margin:0 3px;border-right:2px solid var(--dim);border-bottom:2px solid var(--dim);rotate:-45deg;flex:none}
.opn-more{align-self:center;margin-left:6px;font-family:var(--font-t);font-size:.86rem;color:var(--gold)}

/* ---------- widths ---------- */
@media (max-width:980px){
  .arenas{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:760px){
  /* THE CLIMB AS A VERTICAL PATH: the two first acts stack, the trail runs as two lanes (pages_acts.js climbHtml). Overgrowth gives 24 px of its right edge to the lane
     that carries the start node's other fork down to Underdocks; Underdocks gives its left edge to the lane that carries Overgrowth's exit down to Hive. The bands
     between the rows hold the turns; a lane runs from the band above to the band below (the runs sit at the bands' mid heights, hence the negative offsets). */
  .climb-row.two{grid-template-columns:1fr;gap:0}
  .climb-link .tr-d{display:none}
  .climb-link .tr-p,.lk-alt{display:block}
  .climb-link .tr-p{width:calc(100% - 12px)}
  .climb-slot.s-og{padding-right:24px}
  .climb-slot.s-ud{padding-left:24px}
  /* a lane is a replaced element, so its height is said outright (top and bottom together would be ignored): the slot's height plus the reach into the two bands */
  .cl-lane{display:block;position:absolute;width:24px;pointer-events:none}
  .s-og .cl-lane{right:0;top:-42px;height:calc(100% + 62px)}   /* from the start band's run (58 of 100) to the alt band's upper run (20) */
  .s-ud .cl-lane{left:0;top:-20px;height:calc(100% + 48px)}    /* from the alt band's lower run (44 of 64) to the merge band's run (28) */
  .cl-tk{animation:none}
  .ac-room,.climb-row:not(.two) .ac-room{aspect-ratio:2.1/1}
  .ac-foot{font-size:.82rem;padding:1.3rem .5rem .5rem}
  .ac-foot span+span::before{margin:0 .45em}
  .acthero{aspect-ratio:1.9/1}
  .encstage .lm-name{font-size:.82rem;padding:4px 12px 3px;top:calc(100% + 1.4rem)}
  .encstage .lm-hp{height:9px;top:calc(100% + .45rem)}
  .encstage .lm-hp b{font-size:.74rem}
  .encstage .lm-int,.encstage .lm.stage .intent{font-size:1.05rem}
  .encstage .lm-int img,.encstage .lm.stage .intent img{width:1.9rem;height:1.9rem}
  .enc-hero{aspect-ratio:1.9/1;min-height:14rem;--g:.74;--mh:50cqh}
  .encfacts{gap:8px 18px}
  .encfacts .ef{font-size:.98rem}
  .opn-who{flex-basis:100%}
}
/* one line per rule (Bean, 22 Sep 2026): under 1100 px the rows column beside the strip is too narrow for a rule on one line, so the strip goes above and the rows take the full width */
@media (max-width:1100px){
  .ai-grid{grid-template-columns:1fr;gap:14px}
  .ai-strip{max-width:24rem;margin:0 auto}
}
@media (max-width:640px){
  .ew-facts.mapfacts{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .ai-strip{margin:0}
  .arenas,.actpage .arenas,.actpage .arenas.mtgrid{grid-template-columns:1fr}
  .arena-stage{aspect-ratio:1.7/1}
  .encboard{grid-template-columns:1fr}
  .enct-stage{aspect-ratio:2.3/1}
}
@media (max-width:430px){
  /* the act card's foot ("16 Fights · 3 Elites · 13 Events · 17 Floors") needs 343 px; under 430 px the lanes' cards (and under 390 every card) had it wrap with a stray
     "·" leading the second line. Two tidy rows of two instead, no dots; the foot overlays the room, so the card keeps its height (wave 5, 22 Sep 2026) */
  .climb .ac-foot{display:grid;grid-template-columns:repeat(2,max-content);justify-content:center;justify-items:start;column-gap:1.5rem;row-gap:3px;padding-top:1.5rem}
  .climb .ac-foot span+span::before{content:none}
}
@media (prefers-reduced-motion:reduce){
  .encstage .lm-int{animation:none}
  .encstage a.lm:hover .lm-img,.enct:hover .lm-img,.arena-a:hover .lm-img{animation:none}
  .encstage .lm.stage .creature{animation:none}
  .actcard,.arena,.enct,.ac-room>img,.ce-art{transition:none}
  .actcard:hover,.arena:hover,.enct:hover{transform:none}
  .cl-tk,.cl-mark{animation:none}
  .cl-tk{opacity:.7}
}

/* ===== app/ancients.css ===== */
/* ===== Ancients (app/pages_ancients.js; docs/wave3/ancients.md) =====
   The game's ancient screen down a page. Colours and sprites are the game's: the name banner of ancient_name_banner.tscn (Spectral Bold gold
   EFC851 with the 332C21 outline, epithet Bitter Medium Italic 87CEEB), the speech bubble of ancient_dialogue_line.tscn (bubble in the DialogueColor
   with its shadow copy black 25% at (2,5), the tail sprite ui/dialogue_tail.png, text Kreon cream with the (3,2) shadow, the speaker icon 56 px with
   a black 50% outline copy behind), and the map
   node of ancient_map_point.tscn (icon in map ink 241F1A over its outline in the act's paper colour). --dc and --bc are set per page by the module. */
.ancpage{--dc:#28454F;--bc:rgba(0,0,0,.35);--ol:#332C21}
/* ----- the scene ----- */
.anc-scene{margin:0 0 var(--stack)}
.anc-stage{position:relative;isolation:isolate;overflow:hidden;border-radius:14px;aspect-ratio:2560/1200;max-height:min(62vh,600px);background:#06090c;border:2px solid rgba(255,255,255,.1);box-shadow:0 14px 40px rgba(0,0,0,.55)}
.anc-art{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover}
.anc-stage::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(to top,rgba(3,6,8,.78),rgba(3,6,8,.25) 28%,transparent 48%),radial-gradient(120% 95% at 50% 40%,transparent 60%,rgba(0,0,0,.35))}
.anc-scene.arch .anc-fig{position:absolute;left:50%;bottom:0;z-index:0;height:90%;width:auto;translate:-42% 3%;object-fit:contain;filter:drop-shadow(0 14px 12px rgba(0,0,0,.65))}
.anc-banner{position:absolute;left:clamp(14px,3%,36px);bottom:clamp(12px,3%,28px);right:clamp(14px,3%,36px);z-index:2;display:flex;align-items:center;gap:clamp(10px,1.5vw,18px);pointer-events:none}
/* the sigil is the game's 88 px run-history icon: drawn at 58 px at most, so a 1.5x display never stretches it (it was up to 76 px and read soft) */
.anc-sigil{flex:none;width:clamp(40px,4.4vw,58px);height:auto;filter:drop-shadow(0 3px 3px rgba(0,0,0,.65))}
.anc-banner-t{min-width:0}
.anc-banner h1{font-family:var(--font-d);font-weight:700;font-size:clamp(1.9rem,1.2rem + 3vw,3.7rem);line-height:1;letter-spacing:.02em;text-transform:uppercase;color:#EFC851;margin:0;text-wrap:balance;
  text-shadow:-2px -2px 0 var(--ol),2px -2px 0 var(--ol),-2px 2px 0 var(--ol),2px 2px 0 var(--ol),0 -2px 0 var(--ol),0 2px 0 var(--ol),-2px 0 0 var(--ol),2px 0 0 var(--ol),0 0 .08em var(--ol),5px 6px 0 rgba(0,0,0,.3)}
.anc-epithet{margin:.2em 0 0;font-family:var(--font-i);font-style:italic;font-weight:500;font-size:clamp(.95rem,.8rem + .6vw,1.35rem);line-height:1.2;color:#87CEEB;
  text-shadow:-1px -1px 0 #212A33,1px -1px 0 #212A33,-1px 1px 0 #212A33,1px 1px 0 #212A33,0 0 .25em #212A33,2px 3px 0 rgba(0,0,0,.3)}
/* ----- the facts: the enemy page's fact boxes (pages_acts.js factBox / factRow; the look is enemyturns.css .ew-fact, untouched). Bean, 21 Sep 2026: the info boxes "need to be made
   like we do these boxes on the rest of the site now, large 3d icon etc. ... the info boxes "Health" on the enemy dedicated page ... We should be consistent across the site with
   this design law". Only their layout is set here. enemyturns.css is bundled AFTER this file (name order), so every rule that adjusts an .ew-fact carries .anc-facts in front. ----- */
.anc-facts.ew-facts{margin:0 0 var(--stack)}
.anc-facts .ew-fact{flex:1 1 13rem}
.anc-facts .ew-fact-row{flex:1;gap:12px}   /* the boxes of a row share one height: icon and value stand in the middle of what is left under the label */
.anc-facts .ew-fact-i{width:3rem;height:3rem}
.anc-facts .ew-fact-t b a{color:var(--gold-x)}.anc-facts .ew-fact-t b a:hover{color:#fff}
/* Appears, when it has several rows (Neow's two acts, Darv's two and his rule): the rows stand side by side in a double-width box, a row without an icon (the rule) takes a line of its own */
.anc-facts>.ew-fact.wide{flex:2 1 22rem;flex-direction:row;flex-wrap:wrap;align-content:flex-start;gap:8px 18px}
.anc-facts>.ew-fact.wide>.ew-fact-h{flex:1 1 100%}
.anc-facts>.ew-fact.wide>.ew-fact-row{flex:1 1 11.5rem}
.anc-facts>.ew-fact.wide>.ew-fact-row:not(:has(.ew-fact-i)){flex-basis:100%}
/* when the three cannot share one row, Appears takes the first row whole and Unlock and The offer share the second (never one short box stretched across the page alone) */
.anc-facts.ew-facts{container-type:inline-size}
@container (max-width:50rem){.anc-facts>.ew-fact.wide{flex-basis:100%}}
/* the act plate, as a row's icon: dark like the rest of the site; the act's parchment colour only tints it (a wash) and rims it, and the map point alone keeps the game's
   parchment-on-ink look. Bean, 18 Sep 2026: the solid parchment plates were "bright in a bad way. They don't fit the design language of the site". */
.anc-node{--paper:#A78A67;display:grid;place-items:center;width:100%;height:100%;border-radius:9px;background:linear-gradient(135deg,color-mix(in srgb,var(--paper) 26%,#10161a),color-mix(in srgb,var(--paper) 9%,#10161a));text-decoration:none;box-shadow:inset 0 0 0 2px color-mix(in srgb,var(--paper) 38%,transparent),0 3px 6px rgba(0,0,0,.45);transition:transform .2s,box-shadow .2s}
a.anc-node:hover{transform:translateY(-2px);box-shadow:inset 0 0 0 2px var(--gold),0 6px 12px rgba(0,0,0,.5)}
.anc-node-i{position:relative;display:block;width:84%;height:84%}
.anc-node-i::before,.anc-node-i::after{content:"";position:absolute;inset:0;background:#241F1A;-webkit-mask:var(--ico) center/contain no-repeat;mask:var(--ico) center/contain no-repeat}
.anc-node-i::before{inset:-3%;background:var(--paper);filter:brightness(1.18);-webkit-mask-image:var(--oco,var(--ico));mask-image:var(--oco,var(--ico))}
/* an epoch as a fact's icon: its Timeline portrait as a round medallion */
.anc-epi{display:block;width:100%;height:100%;overflow:hidden;border-radius:50%;border:2px solid var(--gold);background:#000;box-shadow:0 3px 6px rgba(0,0,0,.45);transition:transform .2s}
.anc-epi img{display:block;width:100%;height:100%;object-fit:cover}
a.anc-epi:hover{transform:translateY(-2px)}
/* ----- the dialogue ----- */
.ancpage .ch-lore .chap-b,.ancpage .ch-upg .chap-b{max-width:none}
.ancpage .anc-talkban .secban-b{font-size:inherit;line-height:inherit}   /* the dialogue in the banner's body keeps its own type (the body's size is for the two lines of a When to take it) */
.anc-rule{margin:0 0 12px;max-width:72ch;font-size:.95rem;line-height:1.4;color:var(--muted)}
.anc-who{display:flex;flex-wrap:wrap;gap:6px 10px;margin:0 0 14px;padding:0 0 12px;border-bottom:1px solid rgba(255,255,255,.08)}
.anc-who .fpk{width:5.4rem;font-size:.84rem}
.anc-who .fpk-p{height:6.2rem;aspect-ratio:auto}
.anc-who .fpk:not(.on):hover .fpk-p,.anc-who .fpk:not(.on):focus-visible .fpk-p{scale:1.02}
.anc-tab[data-c="any"]{--c:var(--gold)}
.anc-tab[data-c="any"] .fpk-art{background-color:#121b21;background-size:66% auto}
.anc-panel:not(.on){display:none}
.anc-set{margin:0 0 20px}
.anc-set:last-of-type{margin-bottom:8px}
.anc-set-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;margin:0 0 8px;font-family:var(--font-t)}
.anc-set-h b{color:var(--gold-x);font-size:1rem}
.anc-set-h span{font-size:.76rem;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
.anc-lines{display:flex;flex-direction:column;gap:12px;max-width:58rem}
.anc-line{display:flex;align-items:flex-end;gap:12px;max-width:min(100%,46rem)}
.anc-line.c{align-self:flex-end}
.anc-spk{position:relative;flex:none;width:3.5rem;height:3.5rem;margin-bottom:2px}
.anc-spk::before{content:"";position:absolute;inset:-7%;background:rgba(0,0,0,.5);-webkit-mask:var(--oco) center/contain no-repeat;mask:var(--oco) center/contain no-repeat}
.anc-spk:not([style])::before{display:none}
.anc-spk img{position:relative;display:block;width:100%;height:100%;object-fit:contain}
/* the Architect has no run-history icon: his still (creatures/monsters/architect) cropped to the head in a round frame stands in */
.ancpage[data-a="the-architect"] .anc-line.a .anc-spk{overflow:hidden;border-radius:50%;background:rgba(0,0,0,.4);box-shadow:inset 0 0 0 2px rgba(255,246,226,.18),0 2px 4px rgba(0,0,0,.5)}
.ancpage[data-a="the-architect"] .anc-line.a .anc-spk img{scale:2.9;transform-origin:44% 24%}
.anc-bub{position:relative;min-width:5rem;padding:.6rem 1rem .7rem 1.05rem;border-radius:14px;background:var(--dc);color:var(--text);font-family:var(--font-b);font-size:1.08rem;line-height:1.35;text-shadow:2px 1px 0 rgba(0,0,0,.25);filter:drop-shadow(2px 5px 0 rgba(0,0,0,.25))}
.anc-bub p{margin:0}
/* the tail sprite points down-left from its thick top-right end: it hangs under the bubble's near corner toward the speaker's icon; mirrored for the climber */
.anc-bub::after{content:"";position:absolute;left:.15rem;bottom:-.8rem;width:1.1rem;height:1.25rem;background:var(--dc);-webkit-mask:url(/img/ui/dialogue_tail.webp) center/100% 100% no-repeat;mask:url(/img/ui/dialogue_tail.webp) center/100% 100% no-repeat}
.anc-line.c .anc-bub::after{left:auto;right:.15rem;scale:-1 1}
.anc-note{margin:6px 0 0;max-width:72ch;font-size:.92rem;line-height:1.4;color:var(--muted)}
.anc-jump{background:none;border:0;padding:0;margin:0;font:inherit;color:var(--gold);cursor:pointer;text-decoration:underline dotted;text-underline-offset:3px}
.anc-jump:hover{color:var(--gold-x)}
/* ----- the offer: THE RELICS DIRECTORY'S TILES (wave 5; Bean, 22 Sep 2026: "we need to just show them like they are shown on the relics directory") -----
   .anc-offer is the directory's own .grid.icons (style.css) of housed tiles (directories.js houseCell, tilehousing.css): nothing here restyles a tile. Only the
   titled rows are this page's: "Two of these" / "Always one of these" (Neow), Darv's draw rules, each with its relic count. */
.anc-offer-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;margin:0 0 10px;font-family:var(--font-t);font-size:1rem;font-weight:700;color:var(--gold-x);text-shadow:none}
.anc-offer-h span{font-size:.76rem;font-weight:400;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
/* the titled rows: a full-width row per title; a small row (three tiles or fewer, .small, --n its count) is as wide as its tiles and shares a line with the next small row */
.anc-offer-gs{display:flex;flex-wrap:wrap;align-items:flex-start;gap:22px 36px}
.anc-offer-g{flex:1 1 100%;min-width:0}
.anc-offer-g.small{flex:0 1 auto;max-width:100%}
.anc-offer-g.small .anc-offer{grid-template-columns:repeat(var(--n,1),7.1rem);justify-content:start}
.anc-offer-gs+.anc-note,.anc-offer+.anc-note{margin-top:14px}
@media (max-width:420px){.anc-offer-g.small .anc-offer{grid-template-columns:repeat(var(--n,1),minmax(5.8rem,6.6rem))}}
/* ----- the index: a gallery of the scenes, grouped the way the map deals them ----- */
/* the lead and its fold: the daily hub's expander (daily.js rulesFoldHtml, dailyhub.css), the plate button on the lead's own line at its far right */
.rf-wrap.anc-lead{margin:0 0 4px}
.anc-lead>p{max-width:66ch;padding-top:.48rem;color:var(--muted);font-size:1.06rem;line-height:1.45}   /* the first line sits on the button's middle; on a phone the lead wraps beside the button at its normal leading */
.anc-lead .rf-body{max-width:82ch;color:var(--text)}
.anc-lead .rf-body>:last-child{margin-bottom:10px}
.anc-group{margin:var(--stack) 0 0}
.anc-gh{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 12px;margin:0 0 12px;font-size:1.25rem;color:var(--text)}
.anc-gh a{color:var(--gold)}
@media (hover:none) and (pointer:coarse){.anc-gh a{margin:-10px 0;padding:10px 0}}   /* wave 6: a finger reaches the act links (19 px words) without moving the heading */
/* wave 6 QoL (events stream): the fact boxes' map node and epoch tiles are 39 px (the icon cell is 2.6rem); on a touch screen they reach 41 px, the cell keeps its size */
@media (hover:none) and (pointer:coarse){.ancpage a.anc-node,.ancpage a.anc-epi{width:calc(100% + 2px);height:calc(100% + 2px);margin:-1px}}
.anc-gh-n{font-family:var(--font-t);font-size:.76rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--gold);padding:3px 9px;border:1px solid rgba(239,200,81,.4);border-radius:6px}
.anc-gh-or{font-size:.9rem;color:var(--dim)}
.anc-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,19rem),1fr));gap:14px}
.anc-tile{position:relative;isolation:isolate;display:block;aspect-ratio:16/9;overflow:hidden;border-radius:14px;background:#06090c;border:2px solid rgba(255,255,255,.1);box-shadow:0 8px 24px rgba(0,0,0,.5);color:var(--text);text-decoration:none;transition:transform .35s cubic-bezier(.16,1,.3,1),border-color .2s,box-shadow .2s}
.anc-tile:hover,.anc-tile:focus-visible{text-decoration:none;transform:translateY(-3px);border-color:rgba(239,200,81,.7);box-shadow:0 14px 34px rgba(0,0,0,.6),0 0 0 1px rgba(239,200,81,.3)}
.anc-tile-art{position:absolute;inset:0}
.anc-tile-art img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .6s cubic-bezier(.16,1,.3,1)}
.anc-tile:hover .anc-tile-art img{transform:scale(1.05)}
.anc-tile-art img.anc-tile-fig{position:absolute;left:50%;top:5%;width:auto;height:72%;translate:-40% 0;object-fit:contain;filter:drop-shadow(0 8px 8px rgba(0,0,0,.6))}
.anc-tile::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(to top,rgba(4,8,10,.94) 0,rgba(4,8,10,.55) 30%,transparent 58%)}
.anc-tile-txt{position:absolute;left:14px;right:14px;bottom:12px;z-index:1;display:flex;align-items:center;gap:10px}
.anc-tile-sigil{flex:none;width:2.7rem;height:2.7rem;object-fit:contain;filter:drop-shadow(0 2px 3px rgba(0,0,0,.7))}
.anc-tile-w{display:flex;flex-direction:column;min-width:0;line-height:1.1}
.anc-tile-w b{font-family:var(--font-d);font-weight:700;font-size:1.35rem;letter-spacing:.03em;text-transform:uppercase;color:#EFC851;text-shadow:-1px -1px 0 #332C21,1px -1px 0 #332C21,-1px 1px 0 #332C21,1px 1px 0 #332C21,0 0 .1em #332C21,3px 3px 0 rgba(0,0,0,.3)}
.anc-tile-w i{font-family:var(--font-i);font-style:italic;font-weight:500;font-size:.9rem;color:#87CEEB;text-shadow:0 1px 0 #212A33,0 0 .2em #212A33}
.anc-tile-w small{margin-top:3px;font-size:.8rem;color:var(--muted)}
/* ----- phones, touch, reduced motion ----- */
@media (max-width:640px){
  .anc-stage{aspect-ratio:4/3;max-height:none}
  .anc-banner{gap:10px}.anc-sigil{width:40px}
  .anc-facts .ew-fact{flex:1 1 100%}.anc-facts .ew-fact-i{width:2.6rem;height:2.6rem}
  .anc-who{gap:4px 6px}.anc-who .fpk{width:4.3rem;font-size:.74rem}.anc-who .fpk-p{height:4.9rem}
  .anc-lines{gap:10px}.anc-line{gap:8px;max-width:100%}.anc-spk{width:2.7rem;height:2.7rem}
  .anc-bub{font-size:1rem;padding:.5rem .8rem .6rem .85rem}
  .anc-tile{aspect-ratio:16/10}.anc-tile-w b{font-size:1.2rem}
}
@media (hover:none){.anc-tile:hover{transform:none}.anc-tile:hover .anc-tile-art img{transform:none}}
@media (prefers-reduced-motion:reduce){.anc-tile,.anc-tile-art img,.anc-node,.anc-epi,.anc-who .fpk-p{transition:none}a.anc-node:hover,a.anc-epi:hover{transform:none}.anc-tile:hover{transform:none}.anc-tile:hover .anc-tile-art img{transform:none}}
.ancpage .anc-talkban .anc-rule{margin:0 0 12px}

/* ===== app/art3d.css ===== */
/* ===== art3d: hover tilt for the still art (creatures, character and event art, epoch pictures, portraits, icons); app/art3d.js =====
   Nothing here matches at rest: .a3d exists from pointerover to the end of the settle. The wrapper takes the img's box (width and
   height set inline by the script) and gives the perspective; .a3d-t is the plate that turns and grows; the img inside keeps its
   own animation (breathe on transform, floaty on translate/rotate); .a3d-sh is the floor shadow; .a3d-sheen the light masked to
   the img's alpha (--m). --tx/--ty are the pointer offset (-1..1), --ra the angle toward the pointer; --dg, --sc, --pv, --lift,
   --rim, --sheen and --org are the size-scaled numbers the script writes (docs/wave2/art3d.md). */
.a3d{display:inline-block;position:relative;z-index:3;vertical-align:baseline;perspective:var(--pv,700px);perspective-origin:50% 50%;--tx:0;--ty:0;--ra:0deg;--dg:6deg;--sc:1.06;--lift:6px;--rim:4px;--sheen:.3}
.a3d>.a3d-t{display:block;position:relative;height:100%;transform-origin:var(--org,50% 50%);transform:none;scale:1;transition:transform .5s cubic-bezier(.16,1,.3,1),scale .5s cubic-bezier(.16,1,.3,1)}
.a3d.hov>.a3d-t{transform:rotateX(calc(var(--ty) * var(--dg) * -1)) rotateY(calc(var(--tx) * var(--dg)));scale:var(--sc);transition:transform .08s linear,scale .22s cubic-bezier(.2,.8,.2,1)}
.a3d>.a3d-t>img{display:block}
/* THE WRAPPER IS LAYOUT-NEUTRAL (Bean, 19 Sep 2026, on the enemy page: "Hovering over the enemy makes it move up on the screen then move back down"): the plate is
   as tall as the wrapper (height:100% above), so a still sized in percent (.encstage .lm-img{height:100%}) keeps the box it had at rest. Without it the still fell
   back to its natural height inside the wrapper (404 -> 382 px), the creature player re-anchored its canvas to the new box 11 px higher and dropped it back on unwrap.
   The player's live canvas travels into the plate with its still (art3d.js wrap / unwrap), so the moving creature tilts too; the rim light is cut to the STILL's
   shape, so over a live skeleton it would be a ghost */
.a3d>.a3d-t:has(>canvas.ca-live)>.a3d-sheen{display:none}
/* floor shadow: an ellipse under the feet (creatures, portraits, icons) or a plate shadow under flat art; lifts in with the hover and slides against the tilt */
.a3d>.a3d-sh{position:absolute;pointer-events:none;opacity:0;transition:opacity .5s cubic-bezier(.16,1,.3,1),translate .5s cubic-bezier(.16,1,.3,1)}
.a3d.hov>.a3d-sh{opacity:1;translate:calc(var(--tx) * var(--lift) * -1) calc(var(--ty) * var(--lift) * -.5);transition:opacity .22s ease,translate .08s linear}
.a3d.k-creature>.a3d-sh{left:6%;right:6%;bottom:-4%;height:12%;border-radius:50%;background:radial-gradient(ellipse at 50% 50%,rgba(0,0,0,.55),rgba(0,0,0,0) 70%)}
.a3d.k-flat>.a3d-sh{inset:12% 6% -2% 6%;border-radius:12px;box-shadow:0 14px 26px rgba(0,0,0,.6)}
/* sheen: masked to the image's own alpha, so only the art catches the light, never its box */
.a3d>.a3d-t>.a3d-sheen{position:absolute;inset:0;pointer-events:none;opacity:0;transition:opacity .35s ease;-webkit-mask-image:var(--m);mask-image:var(--m);-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}
.a3d.hov>.a3d-t>.a3d-sheen{opacity:1;transition:opacity .12s ease}
/* flat art (event and epoch pictures): the card's gold-white band, its angle and position following the pointer */
.a3d.k-flat>.a3d-t>.a3d-sheen{background:linear-gradient(calc(118deg + var(--tx) * 24deg - var(--ty) * 18deg),rgba(255,246,214,0) 22%,rgba(255,246,214,var(--sheen)) 46%,rgba(255,246,214,0) 70%);background-size:200% 200%;background-position:calc(50% + (var(--tx) + var(--ty)) * 18%) 50%}
/* creatures and portraits: a faint rim on the side facing the pointer: the silhouette minus a copy shifted away from the pointer (a crescent --rim wide at full offset), lit from that side */
.a3d.k-creature>.a3d-t>.a3d-sheen{-webkit-mask-image:var(--m),var(--m);mask-image:var(--m),var(--m);-webkit-mask-size:contain,contain;mask-size:contain,contain;-webkit-mask-repeat:no-repeat,no-repeat;mask-repeat:no-repeat,no-repeat;-webkit-mask-position:center,calc(50% - var(--tx) * var(--rim)) calc(50% - var(--ty) * var(--rim));mask-position:center,calc(50% - var(--tx) * var(--rim)) calc(50% - var(--ty) * var(--rim));-webkit-mask-composite:source-out;mask-composite:subtract;background:linear-gradient(var(--ra),rgba(255,240,205,0) 30%,rgba(255,240,205,var(--sheen)) 100%)}
@media (prefers-reduced-motion:reduce){.a3d>.a3d-t,.a3d>.a3d-sh,.a3d>.a3d-t>.a3d-sheen{transition:none}}

/* ===== app/ascension.css ===== */
/* /ascension (app/pages_ascension.js, docs/wave3/ascension.md): the climb. Every rule is scoped under .ascpage.
   Parts: the strip of flames (.asc-strip), the ladder (.asc-climb: spine, .asc-node flame, one .asc-panel per level = the game's character-select
   Ascension panel holding the text block .asc-ph and the figure .asc-ill: an inset .asc-stage of one size on every level with the picture centred,
   the effect text as figcaption under it, one quiet .asc-extra line under that) and the per-level scenes (.asc-scene ...).
   The plate itself is the site's .room housing (dark teal, --line border): the game's grey tiny_nine_patch was tried and read as a bright grey box.
   Sprites are the game's: top_bar_ascension (the flame),
   top_bar_char_backdrop (the potion tray, top_bar.tscn PotionBg), map icons over their own outline sprites on a dark board, the reward screen's rarity cards, the
   Merchant's removal coin, intent icons, creature stills. One number treatment everywhere: base white, the ascended value in the Ascension orange.
   Nothing animates at rest; the only transitions are the flame filters and the still's lift. */
.ascpage{--asc:#ff9b4a;--asc-ink:#593400;--nw:3.8rem;--stage-h:15.5rem;--lvgap:2.6rem}
/* the strip room and the ladder are as wide as the page column, so their left edge is the h1's and the tables' (wave 4: they were capped at 66rem and centred, which
   on the 70rem column set them about 13 px in from the title). The cap came from Bean's note of 18 Sep 2026 (not hugging the left edge on a wide screen); since then
   the site's own column stops at --content-max 70rem and is centred (style.css .main), which does that for every page. */
.ascpage .asc-room,.ascpage .asc-climb{max-width:none;margin-left:0;margin-right:0}

/* ---------- the flame badge: top_bar_ascension (88x128) with the level number inside; --lv grows it a little per level ---------- */
.ascpage .asc-fl{position:relative;display:inline-block;width:min(var(--fs,2.6rem),58px);aspect-ratio:88/128;flex:none;line-height:1}   /* an 88 px file: 58 px at most (the blur rule, see A2); only the tallest flames reach the cap */
.ascpage .asc-fl img{display:block;width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6));transition:filter .25s}
.ascpage .asc-fl b{position:absolute;left:0;right:0;top:57%;translate:0 -50%;text-align:center;font-family:var(--font-t);font-weight:700;font-size:calc(var(--fs,2.6rem) * .46);color:#FFF6E2;
  text-shadow:1px 0 0 var(--asc-ink),-1px 0 0 var(--asc-ink),0 1px 0 var(--asc-ink),0 -1px 0 var(--asc-ink),1px 1px 0 var(--asc-ink),-1px -1px 0 var(--asc-ink),1px -1px 0 var(--asc-ink),-1px 1px 0 var(--asc-ink),2px 2px 0 rgba(0,0,0,.25)}

/* ---------- the strip ---------- */
.ascpage .asc-room{padding:calc(var(--pad) + 6px) calc(var(--pad) + 10px) calc(var(--pad) + 2px)}
.ascpage .asc-room h2{margin-bottom:.6rem}
.ascpage .asc-strip-f{display:flex;align-items:flex-end;justify-content:space-between;gap:8px;padding:10px 0 2px}
.ascpage .asc-f{--fs:calc(2.2rem + var(--lv,1) * .18rem);flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;gap:8px;padding:8px 4px 8px;border-radius:8px;text-decoration:none;color:var(--dim);
  font-family:var(--font-t);font-size:.72rem;line-height:1.15;letter-spacing:.04em;text-transform:uppercase;text-align:center;transition:color .25s,background-color .25s}
.ascpage .asc-f .asc-fl{--fs:calc(2.2rem + var(--lv,1) * .18rem)}
.ascpage .asc-f .asc-fl img{filter:grayscale(.85) brightness(.75) drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ascpage .asc-f .asc-fl b{color:#c9c2b4}
.ascpage .asc-f.lit{color:var(--muted)}
.ascpage .asc-f.lit .asc-fl img{filter:drop-shadow(0 0 5px rgba(255,120,30,.55)) drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ascpage .asc-f.lit .asc-fl b{color:#FFF6E2}
.ascpage .asc-f.pick{color:var(--asc);background:rgba(255,155,74,.08)}
.ascpage .asc-f.pick .asc-fl{scale:1.12;transition:scale .18s cubic-bezier(.16,1,.3,1)}
.ascpage .asc-f.pick .asc-fl img{filter:drop-shadow(0 0 9px rgba(255,140,50,.95)) drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ascpage .asc-f:hover{text-decoration:none}
.ascpage .asc-f:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.ascpage .asc-strip-t{margin:14px 0 0;min-height:1.4em;font-family:var(--font-t);font-size:.98rem;color:var(--muted)}
.ascpage .asc-strip-t b{color:var(--asc)}

/* ---------- the ladder: one panel per level, a level's own room ---------- */
.ascpage .asc-climb{list-style:none;margin:calc(var(--stack) * 1.8) auto 0;padding:0;position:relative;display:grid;gap:var(--lvgap)}
.ascpage .asc-climb::before{content:"";position:absolute;left:calc(var(--nw) / 2 - 2px);top:2.4rem;bottom:3rem;width:4px;border-radius:2px;background:linear-gradient(#4f707c,#9a6a3c 30%,var(--asc) 70%,#ffd27a);opacity:.85}
.ascpage .asc-lv{position:relative;display:grid;grid-template-columns:var(--nw) minmax(0,1fr);gap:0 18px;align-items:start;scroll-margin-top:calc(var(--tb-h) + 18px)}
.ascpage .asc-node{position:relative;z-index:1;display:grid;place-items:center;padding-top:1.5rem}
.ascpage .asc-node .asc-fl{--fs:calc(2.4rem + var(--lv,0) * .14rem)}
.ascpage .asc-node .asc-fl::before{content:"";position:absolute;left:50%;top:50%;width:150%;aspect-ratio:1;translate:-50% -46%;border-radius:50%;background:radial-gradient(closest-side,rgba(255,140,50,calc(.12 + var(--lv,0) * .02)),transparent);z-index:-1}
.ascpage .asc-ground .asc-node .asc-fl img{filter:grayscale(.85) brightness(.75) drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ascpage .asc-ground .asc-node .asc-fl::before{display:none}
.ascpage .asc-ground .asc-node .asc-fl b{color:#c9c2b4}

/* the panel: one room per level, the text block (.asc-ph) and the figure (.asc-ill) side by side */
/* the plate is the site's own housing (style.css .room: dark teal gradient, --line border, drop edge), not the game's grey nine-patch,
   which read as a bright grey box here (Bean, 17 Sep 2026); the game's panel structure (label, title, one-liner, pips) stays */
.ascpage .asc-panel{position:relative;display:grid;grid-template-columns:minmax(15rem,19rem) minmax(0,1fr);gap:20px 32px;align-items:stretch;padding:26px 30px 24px;color:var(--text);min-width:0;border-radius:12px;background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));border:2px solid var(--line);box-shadow:0 6px 0 rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.06)}
/* one game picture per level at 20 % inside the illustration box only (Bean's correction, 17 Sep 2026: "In the embedded dropped-in area only"), cover-fit, drawn by
   .asc-stage::before over the stage's dark fill and under the art; the panel itself carries no picture. --pbg is set on the level's li. */
.ascpage #ascension-1{--pbg:url(/img/rooms/lethal/overgrowth/1.webp)}                            /* an Overgrowth room (it was the map's parchment sheet: beige, gone with the rest of it in wave 4) */
.ascpage #ascension-2{--pbg:url(/img/ancients/neow_scene.webp)}                                   /* Neow's scene */
/* levels 3 to 7 (Bean, 22 Sep 2026: "the backgrounds for 3 through 7 are bad, low quality, and overbearing"): the 380 x 288 menu paintings, the curse art and the shop rug are gone; these five take rooms from the curated 2048 px set the site's backdrops use (src/img/rooms/bg) */
.ascpage #ascension-3{--pbg:url(/img/rooms/bg/underdocks_1.webp)}                                  /* an Underdocks pier */
.ascpage #ascension-4{--pbg:url(/img/rooms/bg/hive_1.webp)}                                        /* a Hive clearing */
.ascpage #ascension-5{--pbg:url(/img/rooms/bg/glory_1.webp)}                                       /* a Glory hall */
.ascpage #ascension-6{--pbg:url(/img/rooms/bg/underdocks_3.webp)}                                  /* an Underdocks street */
.ascpage #ascension-7{--pbg:url(/img/rooms/bg/hive_3.webp)}                                        /* a Hive path */
.ascpage #ascension-8{--pbg:url(/img/rooms/lethal/overgrowth/0.webp)}                             /* an Overgrowth combat room (Byrdonis's act) */
.ascpage #ascension-9{--pbg:url(/img/rooms/lethal/overgrowth/3.webp)}                             /* another Overgrowth combat room */
.ascpage #ascension-10{--pbg:url(/img/rooms/lethal/queen_boss/0.webp)}                            /* the Glory boss arena */
.ascpage .asc-lv.here .asc-panel,.ascpage .asc-lv:target .asc-panel{border-color:var(--line-l);box-shadow:0 6px 0 rgba(0,0,0,.45),0 0 0 1px rgba(255,155,74,.22),inset 0 1px 0 rgba(255,255,255,.06)}
.ascpage .asc-ph{display:flex;flex-direction:column;gap:2px;min-width:0;padding-top:4px}
.ascpage .asc-sub{font-family:var(--font-t);font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;color:var(--dim)}
.ascpage .asc-ttl{font-family:var(--font-t);font-weight:700;font-size:1.55rem;line-height:1.1;margin:2px 0 0;color:var(--gold);text-shadow:0 2px 0 rgba(0,0,0,.45)}
.ascpage .asc-desc{margin:.65rem 0 .8rem;font-size:1.1rem;line-height:1.4;color:var(--text);text-shadow:0 1px 0 rgba(0,0,0,.4)}
.ascpage .asc-ph .asc-meter{margin-top:auto;padding-top:10px}
.ascpage .asc-ground .asc-panel{padding-top:18px;padding-bottom:16px}
.ascpage .asc-ground .asc-ttl{font-size:1.25rem;color:var(--muted)}
.ascpage .asc-ground .asc-desc{color:var(--muted);margin-bottom:.5rem}
/* the stack meter: one pip per level, the ones this level carries lit in the flame's orange */
.ascpage .asc-meter{display:inline-flex;gap:4px;vertical-align:middle}
.ascpage .asc-meter i{width:11px;height:11px;border-radius:2px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.14)}
.ascpage .asc-meter i.on{background:var(--asc);border-color:#ffc27a;box-shadow:0 0 4px rgba(255,140,50,.55)}
/* the level the URL or the strip points at */
.ascpage .asc-lv.here .asc-node .asc-fl img,.ascpage .asc-lv:target .asc-node .asc-fl img{filter:drop-shadow(0 0 10px rgba(255,140,50,.95)) drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ascpage .asc-lv.here .asc-ttl,.ascpage .asc-lv:target .asc-ttl{color:var(--gold-x)}

/* the figure: the stage (one size on every level, the picture centred; a hovered card rides over it, so no clipping), the caption, the quiet line */
.ascpage .asc-ill{margin:0;min-width:0;display:flex;flex-direction:column;gap:12px}
.ascpage .asc-stage{position:relative;isolation:isolate;min-height:var(--stage-h);display:flex;align-items:center;justify-content:center;padding:20px 24px;border-radius:10px;background:rgba(6,14,18,.55);border:1px solid rgba(53,82,93,.6);box-shadow:inset 0 2px 12px rgba(0,0,0,.5)}
.ascpage .asc-stage::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;background:var(--pbg,none) center/cover no-repeat;opacity:.16;pointer-events:none}   /* .2 -> .16 (Bean: "overbearing") */
.ascpage .asc-ill figcaption{font-size:.92rem;line-height:1.45;color:var(--muted)}
.ascpage .asc-ill figcaption .asc-vs{font-size:1em;font-weight:600}
.ascpage .asc-ill figcaption a{color:var(--gold-x)}
.ascpage .asc-eff{display:block}
.ascpage .asc-eff+.asc-eff{margin-top:3px}
.ascpage .asc-extra{margin:-4px 0 0;font-size:.86rem;line-height:1.45;color:var(--dim)}
.ascpage .asc-extra b{color:var(--muted);font-weight:600}
.ascpage .asc-extra .asc-vs{font-size:1em;font-weight:600}
.ascpage .asc-extra .asc-vs .v0{color:var(--muted)}
.ascpage .asc-extra a{color:var(--gold-x)}
.ascpage .asc-ill-txt{display:flex;justify-content:center;min-height:0;font-size:.98rem;line-height:1.45;color:var(--muted)}
.ascpage .asc-scene{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:16px 30px;width:100%}
.ascpage .asc-rl{font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);white-space:nowrap}
.ascpage .asc-rl.on{color:var(--asc)}
.ascpage .asc-vs{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-t);font-weight:700;font-size:1.25rem;color:#fff;font-variant-numeric:tabular-nums}
.ascpage .asc-vs i{font-style:normal;color:var(--dim);font-weight:400}
.ascpage .asc-vs .v1{color:var(--asc)}
.ascpage .asc-ocap{flex-basis:100%;text-align:center;font-family:var(--font-t);font-size:.8rem;letter-spacing:.06em;text-transform:uppercase;color:var(--dim)}

/* map nodes (A1, A10) on a dark ground: the map's icon over its own outline sprite (.ol, a mask, so the colour is ours: a cool white on a plain node, the Ascension orange
   and a glow on a lit one). No map_node_background: the beige blob left with the parchment (wave 4). The icon files are 128 px and a node is at most 2.75rem. */
.ascpage .asc-mn{position:relative;display:inline-grid;place-items:center;width:2.75rem;height:2.75rem;flex:none}
.ascpage .asc-mn .ol{position:absolute;inset:0;background:#d6e6ea;opacity:.8;-webkit-mask:var(--ol) center/contain no-repeat;mask:var(--ol) center/contain no-repeat}
.ascpage .asc-mn img{position:relative;width:100%;height:100%;object-fit:contain;filter:brightness(1.5) saturate(1.15) drop-shadow(0 2px 1px rgba(0,0,0,.6))}
.ascpage .asc-mn.new .ol{background:var(--asc);opacity:1;filter:drop-shadow(0 0 5px rgba(255,140,50,.9))}
.ascpage .asc-mn.new::before{content:"";position:absolute;inset:-22%;border-radius:50%;background:radial-gradient(closest-side,rgba(255,140,50,.34),transparent);pointer-events:none}
/* A1: a dark map board in the site's look (the room plate's teal-black, a fine grid like a chart, the --line border): one dotted path with every elite node on it,
   the base ones outlined in a cool white, the extra ones lit orange; "+3" in the corner. Node size is --mn. Not a trace of the parchment: no sheet image, no ink colours. */
.ascpage .asc-map{--mn:3.3rem;position:relative;isolation:isolate;overflow:hidden;flex-wrap:nowrap;flex-direction:column;align-items:stretch;gap:16px;width:100%;max-width:34rem;padding:14px 18px 22px;border-radius:10px;color:var(--muted);
  background:linear-gradient(rgba(120,170,185,.05) 1px,transparent 1px) 0 0/100% 1.45rem,linear-gradient(90deg,rgba(120,170,185,.05) 1px,transparent 1px) 0 0/1.45rem 100%,radial-gradient(90% 120% at 70% 60%,rgba(255,140,50,.07),transparent 70%),linear-gradient(#14262e,#0b171c);
  border:1px solid var(--line);box-shadow:inset 0 1px 0 rgba(255,255,255,.05),inset 0 0 26px rgba(0,0,0,.45),0 8px 16px rgba(0,0,0,.45)}
.ascpage .asc-map-h{display:flex;align-items:center;justify-content:space-between;gap:12px}
.ascpage .asc-map-t{font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.ascpage .asc-plus{font-family:var(--font-t);font-weight:700;font-size:1.6rem;line-height:1;color:var(--asc);text-shadow:0 1px 0 rgba(0,0,0,.45),0 0 10px rgba(255,140,50,.5)}
.ascpage .asc-path{position:relative;align-self:stretch;display:flex;flex-wrap:nowrap;align-items:center;justify-content:center;gap:8px;padding:4px 0;min-width:0}
.ascpage .asc-path::before{content:"";position:absolute;left:4%;right:4%;top:50%;translate:0 -50%;border-top:3px dotted rgba(190,215,222,.34)}
.ascpage .asc-path .asc-mn{position:relative;flex:0 1 var(--mn);min-width:0;width:auto;height:auto;aspect-ratio:1}   /* the eight nodes share the board's width: they shrink together before anything is cut (the 1000 px window, where the stage is at its narrowest) */

/* A2: the Ancient, the heart, the HP bar (the Lethal bar's look, lethal.css .lz-hp) with the heal drawn into the missing part */
.ascpage .asc-heal{flex-wrap:nowrap}
.ascpage .asc-anc{flex:none}
/* THE BLUR RULE (wave 4, AS5): an image is never drawn larger than its file's px / 1.5 CSS px (Bean's screen is 1.5x). The rem is fluid (15 to 20 px), so a cap is
   written in px beside the rem size. Neow's run-history face is an 88 px file (no larger coloured one exists in the game's files): 58 px at most, in a round seat
   so the smaller face still holds its side of the stage. */
.ascpage .asc-anc{display:grid;place-items:center;width:5.6rem;height:5.6rem;border-radius:50%;background:radial-gradient(closest-side,rgba(63,216,207,.16),rgba(63,216,207,.05) 70%,transparent);box-shadow:inset 0 0 0 1px rgba(120,190,200,.16)}
.ascpage .asc-anc a{display:block;border-radius:50%}
.ascpage .asc-anc img{display:block;width:min(3.8rem,58px);height:min(3.8rem,58px);object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.ascpage .asc-hpcol{flex:1 1 14rem;min-width:0;display:grid;gap:12px}
.ascpage .asc-hpline{display:flex;align-items:center;gap:10px}
.ascpage .asc-hpline .hrt{width:2.4rem;height:2rem;object-fit:contain;flex:none;filter:drop-shadow(0 2px 1px rgba(0,0,0,.6))}
.ascpage .asc-hpbar{--cur:34%;--miss:calc(100% - var(--cur));position:relative;flex:1;height:24px;border-radius:4px;background:#1a0606;border:2px solid #0a0303;box-shadow:0 2px 0 rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.08);overflow:hidden}
.ascpage .asc-hpbar i{position:absolute;top:0;bottom:0}
.ascpage .asc-hpbar .cur{left:0;width:var(--cur);border-radius:2px 0 0 2px;background:linear-gradient(#ff6d63,#F1373E 55%,#b8232a)}
.ascpage .asc-hpbar .heal{left:var(--cur);width:calc(var(--miss) * var(--heal,.8));background:linear-gradient(#a8ff86,#5ed44a 55%,#2f8a33)}
.ascpage .asc-hpbar .gap{right:0;width:calc(var(--miss) * (1 - var(--heal,.8)));background:repeating-linear-gradient(135deg,rgba(255,255,255,.14) 0 4px,transparent 4px 8px)}
.ascpage .asc-leg{display:flex;flex-wrap:wrap;gap:6px 18px;font-family:var(--font-t);font-size:.88rem;color:var(--muted)}
.ascpage .asc-leg span{display:inline-flex;align-items:center;gap:6px}
.ascpage .asc-leg .on{color:#a8ff86}
.ascpage .asc-leg .sw{width:12px;height:12px;border-radius:2px;border:1px solid rgba(0,0,0,.5)}
.ascpage .sw-cur{background:#F1373E}.ascpage .sw-heal{background:#5ed44a}.ascpage .sw-gap{background:#1a0606 repeating-linear-gradient(135deg,rgba(255,255,255,.2) 0 3px,transparent 3px 6px)}

/* A3: four coins, one struck out, and the drop */
.ascpage .asc-coins{display:flex;align-items:center;gap:6px}
.ascpage .asc-coin{position:relative;display:inline-block}
.ascpage .asc-coin img{display:block;width:min(4rem,60px);height:min(3.6rem,54px);object-fit:contain;   /* a 90 x 77 px file: 60 px at most (the blur rule, see A2) */filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.ascpage .asc-coin.lost img{filter:grayscale(1) brightness(.5) drop-shadow(0 3px 2px rgba(0,0,0,.6));opacity:.75}
.ascpage .asc-coin.lost::after{content:"";position:absolute;left:8%;right:8%;top:50%;height:4px;border-radius:2px;background:var(--red);rotate:-28deg;box-shadow:0 0 0 1px rgba(0,0,0,.45)}
.ascpage .asc-pct{font-family:var(--font-t);font-weight:700;font-size:2.3rem;color:var(--asc);text-shadow:0 2px 0 rgba(0,0,0,.6)}

/* A4: the top bar's potion tray with the empty-slot vial, one slot struck out */
.ascpage .asc-tray{position:relative;isolation:isolate;display:inline-flex;gap:14px;padding:14px 22px}
.ascpage .asc-tray::before{content:"";position:absolute;inset:0;z-index:-1;border:14px solid transparent;border-image:url(/img/ui/top_bar/top_bar_char_backdrop.webp) 14 fill / 14px stretch;opacity:.95}
.ascpage .asc-slot{position:relative;display:inline-grid;place-items:center;width:3.6rem;height:3.6rem;border-radius:10px;background:rgba(0,0,0,.28);box-shadow:inset 0 0 0 1px rgba(255,255,255,.07),inset 0 2px 6px rgba(0,0,0,.5)}
.ascpage .asc-slot img{width:min(2.7rem,42px);height:min(2.7rem,42px);object-fit:contain;opacity:.85}   /* the empty-slot vial is a 64 px file: 42 px at most (the blur rule, see A2); the slot's own seat keeps the tray's size */
.ascpage .asc-slot.cut img{opacity:.3;filter:grayscale(1)}
.ascpage .asc-slot.cut::before,.ascpage .asc-slot.cut::after{content:"";position:absolute;left:12%;right:12%;top:50%;height:4px;border-radius:2px;background:var(--red);box-shadow:0 0 0 1px rgba(0,0,0,.45)}
.ascpage .asc-slot.cut::before{rotate:45deg}.ascpage .asc-slot.cut::after{rotate:-45deg}

/* A5: the curse card (its housing keeps the pop room, cards-in-a-housing rule) going into the deck */
.ascpage .asc-curse{gap:14px 22px}
.ascpage .asc-cardbox{padding:12px 10px 16px}
.ascpage .asc-cardbox .card{--cw:9rem}
.ascpage .asc-arrow{font-size:2.4rem;line-height:1;color:var(--dim)}
.ascpage .asc-deck{display:inline-flex;flex-direction:column;align-items:center;gap:4px;font-family:var(--font-t);max-width:10rem;text-align:center}
.ascpage .asc-deck img{width:4.4rem;height:3.8rem;object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.ascpage .asc-deck b{color:#fff;font-size:1.25rem}
.ascpage .asc-deck small{color:var(--muted);font-size:.84rem;line-height:1.3}

/* A6: the Merchant's removal coin and the price grid */
.ascpage .asc-shop{flex-wrap:nowrap;gap:16px 36px}
/* the removal coin drifts at rest (style.css .floaty, translate/rotate) and tilts under the pointer through art3d (img.creature is its hook; the wrapper keeps the
   img's box, the floaty animation runs under the tilt; nothing on touch or reduced motion, Bean: "move around slightly and 3d on hover") */
.ascpage .asc-remove{flex:none;padding:6px 4px;line-height:0} /* line-height 0: art3d's inline-block wrapper sits at the img's own offset, no baseline gap under it */
.ascpage .asc-remove img{display:block;width:6rem;height:7.5rem;object-fit:contain;filter:drop-shadow(0 4px 3px rgba(0,0,0,.55))}
.ascpage .asc-pricegrid{display:grid;grid-template-columns:auto repeat(3,auto);gap:10px 18px;align-items:center}
.ascpage .asc-ph2{font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);text-align:center}
.ascpage .asc-price{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:var(--font-t);font-weight:700;font-size:1.25rem;color:#fff;font-variant-numeric:tabular-nums}
.ascpage .asc-price img{width:1.7rem;height:1.45rem;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.ascpage .asc-price.on b{color:var(--asc)}

/* A7: one pair of rarity share bars (rare gold, uncommon teal, common grey, the reward screen's card icons as the legend) */
.ascpage .asc-odds{display:grid;gap:16px;width:100%;max-width:36rem;justify-items:center}
.ascpage .asc-oleg{display:flex;flex-wrap:wrap;justify-content:center;gap:6px 22px;font-family:var(--font-t);font-size:.9rem;color:var(--muted)}
.ascpage .asc-oleg span{display:inline-flex;align-items:center;gap:6px}
.ascpage .asc-oleg img{width:2rem;height:2rem;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.5))}
.ascpage .asc-obars{display:grid;gap:12px;width:100%}
.ascpage .asc-oline{display:grid;grid-template-columns:3.6rem minmax(0,1fr) 7rem;gap:12px;align-items:center;font-family:var(--font-t)}
.ascpage .asc-oline b{font-size:1.2rem;color:#fff;font-variant-numeric:tabular-nums;white-space:nowrap}
.ascpage .asc-oline.on b{color:var(--asc)}
.ascpage .asc-obar{display:flex;height:18px;border-radius:4px;overflow:hidden;background:#222;border:1px solid rgba(0,0,0,.55);box-shadow:0 1px 0 rgba(255,255,255,.06)}
.ascpage .asc-obar i{display:block;height:100%;flex:none}
.ascpage .asc-obar .r{background:var(--r-rare);min-width:3px}
.ascpage .asc-obar .u{background:#3aa9b8}
.ascpage .asc-obar .c{background:#5a5f63;flex:1 1 auto}

/* A8 / A9 / A10: creature stills (links to the enemy page) with HP bars or intents */
/* the stills (A8, A9, A10) are art3d's hover art (img.creature). Real layout size on purpose, spelled out on the img itself (never 100 %, never a transform or margin):
   art3d wraps the img in an inline-block of the img's offset size, and inside that wrapper a 100 % height collapses to the natural aspect, so the still drew larger
   and higher while hovered and snapped back when the wrapper went (Bean, 17 Sep 2026: "they teleport to a different spot"). With --sw / --sh on the img the wrapped
   and unwrapped boxes are the same to the pixel; line-height 0 on the link keeps the inline-block wrapper at offset 0,0; the lift is art3d's, not ours. */
.ascpage .asc-still{--sw:12rem;--sh:9.6rem;display:block;width:var(--sw);height:var(--sh);flex:none;line-height:0}
.ascpage .asc-still img{display:block;width:var(--sw);height:var(--sh);object-fit:contain;object-position:center bottom;filter:drop-shadow(0 6px 4px rgba(0,0,0,.5))}
.ascpage .asc-tough,.ascpage .asc-deadly{flex-wrap:nowrap;gap:16px 34px}
.ascpage .asc-bars{flex:1 1 13rem;min-width:0;display:grid;gap:12px;max-width:26rem}
.ascpage .asc-hpl{display:grid;grid-template-columns:3.6rem minmax(0,1fr);gap:12px;align-items:center}
.ascpage .asc-hpbar2{position:relative;height:24px;border-radius:4px;background:#1a0606;border:2px solid #0a0303;box-shadow:0 2px 0 rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.08)}
.ascpage .asc-hpbar2 i{position:absolute;left:0;top:0;bottom:0;border-radius:2px;background:linear-gradient(#ff6d63,#F1373E 55%,#b8232a)}
.ascpage .asc-hpbar2 span{position:absolute;left:50%;top:50%;translate:-50% -50%;font-family:var(--font-t);font-weight:700;font-size:1.05rem;color:#FFF6E2;white-space:nowrap;text-shadow:0 0 3px #900000,0 0 3px #900000,0 1px 0 #900000,1px 0 0 #900000,-1px 0 0 #900000,0 -1px 0 #900000}
.ascpage .asc-hpbar2 span.up{color:#ffc79a}
.ascpage .asc-bars .asc-ocap{text-align:left}
.ascpage .asc-ints{display:flex;flex-wrap:wrap;justify-content:center;gap:16px 34px;flex:1 1 12rem}
.ascpage .asc-int{display:grid;grid-template-columns:auto auto auto;grid-template-areas:"a b c" "n n n";align-items:center;justify-items:center;gap:4px 8px;font-family:var(--font-t)}
.ascpage .asc-int>i{font-style:normal;color:var(--dim);font-size:1.4rem}
.ascpage .asc-int .ico{display:grid;justify-items:center;gap:0;width:3.8rem}
.ascpage .asc-int .ico img{width:3.3rem;height:3.3rem;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.6))}
.ascpage .asc-int .ico b{font-size:1.3rem;color:#fff;font-variant-numeric:tabular-nums;line-height:1;text-shadow:0 1px 0 rgba(0,0,0,.6)}
.ascpage .asc-int .ico b em{font-style:normal;font-size:.75em;color:var(--muted);margin-left:1px}
.ascpage .asc-int .ico.on b{color:var(--asc)}
.ascpage .asc-int small{grid-area:n;font-size:.86rem;color:var(--muted)}
.ascpage .asc-double{flex-direction:column;gap:10px}
.ascpage .asc-pair{display:flex;align-items:flex-end;justify-content:center;gap:22px;align-self:stretch;min-width:0}
.ascpage .asc-pair .asc-still{--sw:12.5rem;--sh:10.4rem;flex:0 1 var(--sw);min-width:0;width:auto}
.ascpage .asc-pair .asc-still img{width:100%}   /* the two stills share the stage's width (they ran 45 px out of the page at a 1000 px window) */
.ascpage .asc-bossx{display:inline-flex;align-items:center;gap:4px}
.ascpage .asc-bossx .asc-mn{width:2.4rem;height:2.4rem}
.ascpage .asc-bossx b{font-family:var(--font-t);font-size:1.35rem;color:var(--asc);margin-left:8px}

/* ---------- widths ---------- */
@media (max-width:1180px){.ascpage .asc-panel{grid-template-columns:minmax(13rem,16rem) minmax(0,1fr);gap:18px 24px;padding:22px 24px 20px}.ascpage .asc-map{--mn:2.3rem;padding:12px 10px 18px}.ascpage .asc-path{gap:4px}.ascpage .asc-ill-swarmingelites .asc-stage{padding-left:10px;padding-right:10px}}
@media (max-width:980px){.ascpage{--stage-h:12.5rem}.ascpage .asc-panel{grid-template-columns:1fr;gap:16px}.ascpage .asc-ph .asc-meter{margin-top:2px}.ascpage .asc-strip-f{gap:4px}.ascpage .asc-map{--mn:2.6rem}}
@media (max-width:760px){.ascpage{--nw:3rem;--stage-h:11rem;--lvgap:2rem}
  .ascpage .asc-strip-f{flex-wrap:wrap;justify-content:center;gap:8px 4px}.ascpage .asc-f{flex:0 0 18%;padding:6px 0}.ascpage .asc-f-t{display:none}.ascpage .asc-f .asc-fl{--fs:calc(2rem + var(--lv,1) * .12rem)}
  .ascpage .asc-lv{gap:0 10px}.ascpage .asc-node{padding-top:1.2rem}.ascpage .asc-node .asc-fl{--fs:calc(2rem + var(--lv,0) * .1rem)}
  .ascpage .asc-panel{padding:16px 14px 14px}.ascpage .asc-stage{padding:14px 12px}.ascpage .asc-ttl{font-size:1.35rem}.ascpage .asc-desc{font-size:1.02rem}
  .ascpage .asc-scene{gap:12px 20px}
  /* the elite rows: label and count on one line, the nodes small enough for eight in one row under it */
  .ascpage .asc-map{--mn:1.7rem;max-width:none;padding:10px 10px 14px;gap:8px}.ascpage .asc-path{gap:4px}.ascpage .asc-plus{font-size:1.3rem}.ascpage .asc-mn{width:1.75rem;height:1.75rem}
  .ascpage .asc-heal{flex-wrap:wrap}.ascpage .asc-anc{width:4.6rem;height:4.6rem}.ascpage .asc-anc img{width:min(3.2rem,58px);height:min(3.2rem,58px)}
  .ascpage .asc-coin img{width:3rem;height:2.7rem}.ascpage .asc-pct{font-size:1.7rem}
  .ascpage .asc-cardbox .card{--cw:8.2rem}.ascpage .asc-deck{max-width:8rem}.ascpage .asc-deck img{width:3.6rem;height:3.1rem}
  .ascpage .asc-shop{flex-wrap:wrap;gap:12px 20px}.ascpage .asc-remove img{width:4.4rem;height:5.5rem}.ascpage .asc-pricegrid{gap:8px 12px}.ascpage .asc-price{font-size:1.1rem}
  .ascpage .asc-oline{grid-template-columns:3rem minmax(0,1fr) 6rem}.ascpage .asc-oline b{font-size:1.05rem}
  .ascpage .asc-still{--sw:8rem;--sh:6.8rem}.ascpage .asc-tough,.ascpage .asc-deadly{flex-wrap:wrap;gap:12px 20px}.ascpage .asc-bars{flex-basis:100%}
  .ascpage .asc-pair{gap:12px}.ascpage .asc-pair .asc-still{--sw:8rem;--sh:7rem}}
@media (max-width:400px){.ascpage .asc-arrow{display:none}}
@media (hover:none) and (pointer:coarse){.ascpage .asc-f{padding-top:8px;padding-bottom:8px}}
@media (prefers-reduced-motion:reduce){.ascpage .asc-fl img,.ascpage .asc-f,.ascpage .asc-f.pick .asc-fl{transition:none}.ascpage .asc-f.pick .asc-fl{scale:none}}

/* ===== app/auditfix.css ===== */
/* audit-fix: listed cards are anchors now; an inline <a> would ignore .card's width and height, and the global a:hover underline must not reach the card text */
a.card{display:inline-block;vertical-align:top;color:#FFF6E2}
a.card:hover,a.card:focus{text-decoration:none;color:#FFF6E2}
/* gamecard titles are <b class="gct"> (an <h3> straight after the page <h1> skipped a level); same rules as the global h3 */
.gct{display:block;font-family:var(--font-t);font-weight:700;font-size:1.25rem;line-height:1.1;text-wrap:balance;letter-spacing:.005em;color:var(--gold-x);margin:1.3rem 0 .45rem}
.gamecard .gct{margin:0}
/* event "From the code" notes that quote decompiled C# */
.srcnote{white-space:pre-wrap;overflow-wrap:anywhere;font-family:ui-monospace,Consolas,'Courier New',monospace;font-size:.85rem;line-height:1.45;margin:.3rem 0}

/* ===== app/banner.css ===== */
/* ===== the section banner (wave 5, 22 Sep 2026; CORE stream; markup app/banner.js secBanner; docs/wave5/core.md 1d) =====
   Bean: "a solid banner ... This will help breakup the above section and act as a header for the below sections ... a cool banner, not too important but authoritative
   for the following section" / "it needs to feel like a header, it needs to feel strong, it needs to feel more like the game and less like a data dump ... box the title in
   it's own housing that spans the width of the page (not ignoring safe space though)".
   THE PLATE is the game's settings tab (ui/settings_tab_selected.webp: a slate face, #2c4350, inside a dark chipped rim), drawn as a nine-slice at half its pixel size
   (40 px slices at 20 px) with the edges repeated whole (round), so the chips along the rim are the sprite's own and never stretch. Over the face: a lit top edge, a
   darker foot, the accent's faint glow behind the icon socket. Under the plate: a hard 5 px ledge, like every plate on the site.
   THE SOCKET at the left is the tile housing's shape (the eight sided cut, a metal rim lit from above, a dark well, tilehousing.css' recipe at 3.1rem) with the game
   icon standing in it. The title is Kreon at 1.5rem in the site's cream, an ink shadow, the tagline beside it in small caps; a body (the two "When to take it" lines)
   sits under a hairline inside the plate. Full width of the column (the column already keeps the safe space). At 390 px the socket shrinks, the tagline drops under
   the title, the body keeps its padding. Nothing here moves on hover. */
/* the sprite's torn edge has 7 transparent px on each side (3.5 px at the 20 px slice), so the plate is pulled 4 px past the content edges to meet them (Bean, 22 Sep 2026: "they arent reaching the safe space edges by a few pixels on each side") */
.secban{--sb:var(--gold);--sbw:20px;position:relative;margin:calc(var(--stack)*1.25) -4px 0;isolation:isolate;
  border:var(--sbw) solid transparent;border-image:url(/img/ui/settings_tab_selected.webp) 40 fill / var(--sbw) / 0 round;
  filter:drop-shadow(0 5px 0 rgba(0,0,0,.5))}
/* the face: the sprite's slate under a lit top edge and a darker foot, then the accent glow behind the socket (inset by the rim, clipped to the plate's shape) */
.secban::before{content:"";position:absolute;inset:calc(var(--sbw)*-.55);z-index:-1;pointer-events:none;border-radius:6px;
  background:linear-gradient(rgba(255,255,255,.05),rgba(255,255,255,0) 38%,rgba(0,0,0,0) 62%,rgba(0,0,0,.22)),linear-gradient(rgba(0,0,0,.54),rgba(0,0,0,.54)),radial-gradient(14rem 100% at 0% 50%,color-mix(in srgb,var(--sb) 16%,transparent),transparent 70%)}   /* a 42% dark wash over the slate and a softer top light: first 14% (Bean: "all a little bright"), then three times that (Bean, 22 Sep 2026, on a relic page's When to take it: "can we darken the background color of it please, it doesnt match the website": the sprite's slate stood a step lighter than every other plate on the page); then 54% (Bean, 23 Sep 2026, of this plate and the character page's housings: "Maybe just a bit darker to fit the site theme. Make this change everywhere (the darkness one for these style boxes)") */
.secban-in{position:relative;margin:calc(var(--sbw)*-.3) calc(var(--sbw)*-.25);padding:2px 4px 3px 2px}
.secban-h{display:flex;align-items:center;gap:14px;min-height:2.6rem}
/* the socket: the housing's eight sided frame at 3.1rem (the cut, the rim lit from above, the well and the pedestal glow are tilehousing.css' recipe) */
.secban-ico{--cut:8px;position:relative;isolation:isolate;flex:none;display:grid;place-items:center;width:3.1rem;height:3.1rem;filter:drop-shadow(0 3px 3px rgba(0,0,0,.45))}
.secban-ico::before,.secban-ico::after{content:"";position:absolute;inset:0;z-index:-2;clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut))}
.secban-ico::before{background:linear-gradient(180deg,#86a7b3,#34515c 22%,#101d23 62%,color-mix(in srgb,var(--sb) 70%,#0c161b))}
.secban-ico::after{inset:2px;--cut:7px;z-index:-1;background:radial-gradient(70% 34% at 50% 96%,color-mix(in srgb,var(--sb) 40%,transparent),transparent 72%),radial-gradient(90% 80% at 50% 38%,#1a2f38,#0b151a)}
.secban-ico img{display:block;width:2.15rem;height:2.15rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.65))}
.secban[data-ico="terms"] .secban-ico img,.secban[data-ico="book"] .secban-ico img,.secban[data-ico="fight"] .secban-ico img,.secban[data-ico="swords"] .secban-ico img{width:2.5rem;height:2.5rem}
.secban.noico .secban-h{padding-left:4px}
/* the title and the tagline */
.secban-t{display:flex;flex-wrap:wrap;align-items:center;gap:2px 14px;min-width:0;flex:1 1 auto}   /* the tag stands centred on the title's height, not on its baseline (Bean, 22 Sep 2026: "see how 25 cards isnt centered, it should be") */
.secban-t h2{margin:0;font-family:var(--font-t);font-weight:700;font-size:1.5rem;line-height:1.1;color:#fff6e2;letter-spacing:.01em;text-shadow:0 2px 0 rgba(0,0,0,.55),0 0 14px rgba(0,0,0,.35);text-wrap:balance}
.secban-tag{font-family:var(--font-t);font-size:.76rem;letter-spacing:.12em;text-transform:uppercase;line-height:1.2;color:color-mix(in srgb,var(--sb) 55%,#c9d3d6);text-shadow:0 1px 0 rgba(0,0,0,.5)}
.secban-tag a{color:inherit}
/* the body: under a hairline that runs from the socket's edge; the two lines of a "When to take it", the accent's stripe at its left */
.secban-b{position:relative;margin:9px 0 0;padding:9px 4px 3px 12px;border-top:1px solid rgba(255,255,255,.1);font-size:1.02rem;line-height:1.45;color:var(--text)}
.secban-b::before{content:"";position:absolute;left:0;top:11px;bottom:5px;width:3px;border-radius:2px;background:linear-gradient(color-mix(in srgb,var(--sb) 85%,#fff),var(--sb),color-mix(in srgb,var(--sb) 70%,#000))}
.secban-b p{margin:0}.secban-b p+p{margin-top:.35em}
.secban-b a{color:var(--gold)}
/* narrow: the socket and the title step down, the tagline goes under the title */
@media (max-width:640px){
  .secban{--sbw:16px;margin-top:var(--stack)}
  .secban-h{gap:10px;min-height:2.3rem}
  .secban-ico{width:2.6rem;height:2.6rem;--cut:7px}.secban-ico img{width:1.8rem;height:1.8rem}
  .secban[data-ico="terms"] .secban-ico img,.secban[data-ico="book"] .secban-ico img,.secban[data-ico="fight"] .secban-ico img,.secban[data-ico="swords"] .secban-ico img{width:2.1rem;height:2.1rem}
  .secban-t{flex-direction:column;align-items:flex-start;gap:3px}
  .secban-t h2{font-size:1.25rem}
  .secban-b{font-size:.98rem;padding-left:10px}}

/* ===== app/buttons.css ===== */
/* ===== buttons: the game's own plate sprites (docs/wave2/buttons.md; owned by the buttons pass, 16 Sep 2026) =====
   No drawn plates any more: every text button is one of the game's button sprites, so there is no bevel line to get wrong.
   .btn (and the top bar's .tb-btn) is the event-choice plate, images/packed/common_ui/event_button.png, the one text plate the
   game itself stretches (NEventOptionButton draws it as a NinePatchRect): here three background layers on ::before, cut from the
   sprite by extract/button_slices.py (event_button_l / _m / _r: 56 px caps, the chamfer ends at x=35 so a cap ends on flat face).
   The caps are sized `auto 100%`, so they keep the sprite's own proportions at any plate height and the chamfer stays square;
   the middle strip is stretched between them and starts 1 px before each cap ends, UNDER the caps, so the pieces overlap and
   can never gap. CSS cannot size a background from the box's height, so the plate height is declared: --ph = the button's box
   height + 6 (the --po overhang), calc(1em + vertical padding + 6px) for .btn (line-height is 1), the min-height + 6 for .tb-btn;
   a cap is then --ph * 56/110 wide. Keep the overlap small: where cap and strip overlap, their soft pixels (the ring's glow)
   composite twice and read as a brighter stub. If a button gets taller than --ph says (an icon, wrapped text) the overlap only
   grows; if it were shorter a hole would open, so a new button size must set --ph. --po pulls the sprite's transparent 7 px
   margin outside the box.
   Two earlier builds were rejected. A full 9-slice: its corner, edge and middle tiles scale differently and the tile grid showed
   through the face as faint boxes. A 3-slice border-image (slice 0 26): Chrome leaves a hairline at the slice joins once the
   button is scaled by the hover (1.05), a full-height vertical line near each end (Bean, 17 Sep 2026: "the inner lines on the
   buttons are still there"); the 26 px slice also cut through the chamfer. Do not go back to border-image. Colour roles are tints of
   that one sprite the way the game tints it through the hsv shader (EventModel.ButtonColor, NPopupYesNoButton h/s/v): --tint is
   the role's filter chain, --v the brightness the states drive (rest 1, hover 1.25, press .75: the game's v 0.9 -> 1.2 -> gray).
   States are the game's (NProceedButton / NConfirmButton / NPopupYesNoButton): hover scales 1.05 in 0.05 s and eases back over
   0.5 s Expo-out while the outline sprite (event_button_outline, tinted F0B400 like _goldOutline) fades in beneath the plate;
   a press is scale 0.95 with the plate greyed and the outline off; keyboard focus shows the same outline. Labels are the game's:
   cream FFF6E2 with a thin outline in the plate's dark hue (--ink) and the (3,2) shadow; the gold plate keeps dark ink instead
   so its contrast passes. The click sound is wired in core.js (.btn, .tb-btn). The card page's Base / Upgraded toggle is the
   popup Yes / No plate (ui_atlas popup_confirm_button, the whole sprite at its own aspect), the active side hue-shifted to gold
   the way the game shifts Yes to green. Pills and tabs are filters, not plates, and keep their look. */

/* WAVE 4 (Bean, 21 Sep 2026: "the top bar kind of shifts around and the daily puzzle button / mute button glitch out"): the plate pictures are read from custom
   properties that app/shellsprites.css fills with data: URIs (tools/gen_shellsprites.py), so a plate is painted in the first frame of a page instead of a few frames
   after it (the file URLs stay as the fallback). An icon-only plate (.tb-btn.ico, and every top bar button on a phone) is ONE picture, the two caps joined
   (--spr-btn-o / --spr-btno-o): as three layers the 46 px plate squeezed the middle strip into a 1 px column whose glow showed as a hairline through the Sound button. */
/* ---------- .btn / .tb-btn: the event plate ---------- */
.btn,.tb-btn{position:relative;isolation:isolate;--ph:calc(1em + 31px);--po:-3px;--v:1;--tint:saturate(.5) brightness(.84);--ink:#0a1c22;color:#fff6e2;background:none;border:0;border-radius:0;box-shadow:none;cursor:pointer;user-select:none;-webkit-user-select:none;text-shadow:1px 0 0 var(--ink),-1px 0 0 var(--ink),0 1px 0 var(--ink),0 -1px 0 var(--ink),1px 1px 0 var(--ink),-1px -1px 0 var(--ink),1px -1px 0 var(--ink),-1px 1px 0 var(--ink),2px 2px 0 rgba(0,0,0,.2);transition:transform .5s cubic-bezier(.16,1,.3,1)}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-family:var(--font-t);font-weight:700;font-size:1rem;line-height:1;letter-spacing:.02em;padding:13px 22px 12px;white-space:nowrap}
.tb-btn{font-weight:700;--ph:46px}
@media (max-width:640px){.tb-btn{--ph:48px}}
.btn::before,.btn::after,.tb-btn::before,.tb-btn::after{content:"";position:absolute;inset:var(--po);pointer-events:none;background-repeat:no-repeat;background-position:left center,right center,center}
.btn::before,.tb-btn::before{z-index:-1;background-size:auto 100%,auto 100%,calc(100% - 2*(var(--ph)*.509 - 1px)) 100%;background-image:var(--spr-btn-l,url(/img/packed/common_ui/event_button_l.webp)),var(--spr-btn-r,url(/img/packed/common_ui/event_button_r.webp)),var(--spr-btn-m,url(/img/packed/common_ui/event_button_m.webp));filter:var(--tint) brightness(var(--v)) drop-shadow(0 3px 2px rgba(0,0,0,.5));transition:filter .5s cubic-bezier(.16,1,.3,1)}
/* the hover ring: the outline sprite (a hollow ring: solid band 8-12 px in, soft glow outside it) cut the same way as the plate. Its box is 2 px larger than
   the plate's on every side so the solid band sits just outside the plate's edge instead of under it; a faint drop-shadow carries the glow (Bean, 17 Sep 2026:
   the first fix was "a little too bright", so the ring is F0B400 at .9 and the glow is kept low). */
.btn::after,.tb-btn::after{z-index:-2;inset:calc(var(--po) - 2px);background-size:auto 100%,auto 100%,calc(100% - 2*((var(--ph) + 4px)*.5 - 1px)) 100%;background-image:var(--spr-btno-l,url(/img/packed/common_ui/event_button_outline_l.webp)),var(--spr-btno-r,url(/img/packed/common_ui/event_button_outline_r.webp)),var(--spr-btno-m,url(/img/packed/common_ui/event_button_outline_m.webp));filter:brightness(.6) sepia(1) saturate(3.2) drop-shadow(0 0 3px rgba(240,180,0,.3));opacity:0;transition:opacity .5s cubic-bezier(.16,1,.3,1)}
.btn:hover,.tb-btn:hover{transform:scale(1.05);--v:1.25;text-decoration:none;transition-duration:.05s}
.btn:hover::before,.tb-btn:hover::before{transition-duration:.05s}
.btn:hover::after,.btn:focus-visible::after,.tb-btn:hover::after,.tb-btn:focus-visible::after{opacity:.9;transition-duration:.05s}
.btn:active,.btn.down,.tb-btn:active,.tb-btn.down{transform:scale(.95);--v:.75;transition-duration:.12s}
.btn:active::before,.btn.down::before,.tb-btn:active::before,.tb-btn.down::before{transition-duration:.12s}
.btn:active::after,.btn.down::after,.tb-btn:active::after,.tb-btn.down::after{opacity:0;transition-duration:.12s}
.btn:focus-visible,.tb-btn:focus-visible{outline:0}
.btn[disabled]{opacity:.45;cursor:default}
.btn[disabled]:hover,.btn[disabled]:active{transform:none;--v:1}
.btn[disabled]:hover::after{opacity:0}
/* roles: gold primary, teal play, slate default, then red / green / purple; the sprite is teal, so teal is the plate as drawn */
.btn.gold{--tint:grayscale(1) sepia(1) saturate(2.8) brightness(1.32);color:#241600;text-shadow:none}
.btn.teal{--tint:saturate(1.25) brightness(1.04);--ink:#03302e}
.btn.red{--tint:hue-rotate(172deg) saturate(1.6) brightness(.92);--ink:#3a0906}
.btn.green{--tint:hue-rotate(-72deg) saturate(1.4) brightness(.96);--ink:#0d2a03}
.btn.purple{--tint:hue-rotate(92deg) saturate(1.5) brightness(.96);--ink:#24103a}
.btn.sm{font-size:.9rem;padding:10px 16px 9px;--ph:calc(1em + 25px);--po:-3px}
.btn.wide{width:100%}
/* touch: the small plate grows to the 40px target (13.5px label + 27px padding); --ph follows the taller plate */
@media (hover:none) and (pointer:coarse){.btn.sm{padding:14px 18px 13px;--ph:calc(1em + 33px)}}
@media (prefers-reduced-motion:reduce){.btn,.btn:hover,.btn:active,.btn.down,.tb-btn,.tb-btn:hover,.tb-btn:active{transform:none;transition:none}}

/* ---------- card page Base / Upgraded toggle: the popup Yes / No plate ---------- */
.upg-toggle.game{border:0;border-radius:0;overflow:visible;gap:12px;padding:2px 0 6px}
.upg-toggle.game button{position:relative;isolation:isolate;--v:1;--tint:saturate(1.05) brightness(1);--ink:#10283a;display:inline-flex;align-items:center;justify-content:center;width:6.75rem;aspect-ratio:198/96;padding:0 .6rem .1rem 1.05rem;margin:0;border:0;border-radius:0;background:none;box-shadow:none;font-family:var(--font-t);font-weight:700;font-size:.95rem;line-height:1;letter-spacing:.02em;color:#fff6e2;text-shadow:1px 0 0 var(--ink),-1px 0 0 var(--ink),0 1px 0 var(--ink),0 -1px 0 var(--ink),1px 1px 0 var(--ink),-1px -1px 0 var(--ink),1px -1px 0 var(--ink),-1px 1px 0 var(--ink),2px 2px 0 rgba(0,0,0,.2);cursor:pointer;user-select:none;-webkit-user-select:none;transition:transform .5s cubic-bezier(.16,1,.3,1)}
.upg-toggle.game button::before,.upg-toggle.game button::after{content:"";position:absolute;pointer-events:none;background-size:100% 100%;background-repeat:no-repeat;background-position:center}
.upg-toggle.game button::before{inset:0;z-index:-1;background-image:url(/img/ui/popup_confirm_button.webp);filter:var(--tint) brightness(var(--v)) drop-shadow(0 3px 2px rgba(0,0,0,.5));transition:filter .5s cubic-bezier(.16,1,.3,1)}
/* the outline sprite sits beneath: black at half alpha at rest (NPopupYesNoButton.OnUnfocus), gold and additive on hover (OnFocus) */
.upg-toggle.game button::after{inset:-2px -2px -3px;z-index:-2;background-image:url(/img/compressed/popup_confirm_button_outline.webp);filter:brightness(0);opacity:.45}
.upg-toggle.game button:hover{transform:scale(1.025);--v:1.25;transition-duration:.05s}
.upg-toggle.game button:hover::before{transition-duration:.05s}
.upg-toggle.game button:hover::after,.upg-toggle.game button:focus-visible::after{filter:brightness(.6) sepia(1) saturate(3);opacity:1}
.upg-toggle.game button:active,.upg-toggle.game button.down{transform:scale(.975);--v:.85;transition-duration:.12s}
.upg-toggle.game button:active::after,.upg-toggle.game button.down::after{filter:brightness(0);opacity:.45}
.upg-toggle.game button.on{--tint:grayscale(1) sepia(1) saturate(2.8) brightness(1.32);color:#241600;text-shadow:none;cursor:default}
.upg-toggle.game button.on:hover,.upg-toggle.game button.on:active{transform:none;--v:1}
.upg-toggle.game button.on:hover::after{filter:brightness(0);opacity:.45}
/* a pressed plate keeps the gold focus outline, so keyboard focus never vanishes after Space / Enter (QoL 23 Sep 2026; was the dark hover outline, invisible on the gold plate) */
.upg-toggle.game button.on:focus-visible::after{filter:brightness(.6) sepia(1) saturate(3);opacity:1}
.upg-toggle.game button:focus-visible{outline:0}
@media (prefers-reduced-motion:reduce){.upg-toggle.game button,.upg-toggle.game button:hover,.upg-toggle.game button:active{transform:none;transition:none}}

/* ---------- top bar: the icon-only plate is one picture (see the WAVE 4 note at the top) ---------- */
.tb-btn.ico::before,.tb-btn.ico::after{background-size:100% 100%;background-position:center}
.tb-btn.ico::before{background-image:var(--spr-btn-o)}
.tb-btn.ico::after{background-image:var(--spr-btno-o)}
@media (max-width:640px){.tb-btn::before,.tb-btn::after{background-size:100% 100%;background-position:center}.tb-btn::before{background-image:var(--spr-btn-o)}.tb-btn::after{background-image:var(--spr-btno-o)}}

/* ---------- top bar: the Daily button ----------
   Bean, 21 Sep 2026: "the "daily puzzles #7" in the top right doesnt feel premium or game like enough ... we want to draw attention there so the button should be sick".
   It was the flat gold plate with a drawn deck icon and "#7" as plain text. Now, still the game's event plate (the one text plate the game stretches), but built up:
   - depth: the plate stands on a dark gold lip (a hard 3 px drop-shadow of the sprite's own shape, so the chamfers match) over a soft shadow and a warm glow;
   - a lit rim: .tb-fx is masked with the plate's own three sprites, so the gloss along the top, the shade along the bottom and the travelling shine keep the chamfered outline;
   - the day: the site's day mark (the daily stream's dark badge with the gold rim) sits ON the plate like a sticker, tilted, a little taller than the plate, with DAY over
     the number, exactly as it looks beside the page titles;
   - life: one slow shine crosses the plate every 6 s and the game's red notification gem (packed/common_ui/notification_dot2) breathes on the corner while today's puzzles
     are not finished. Both clocks are tied to the wall clock (--tb-phase, set by the inline script in shell.html) so a page load never restarts them mid-way: the bar stays static
     across pages. When both of today's puzzles are done (data-state="done", read from localStorage before the first paint) the gem becomes a green check, the shine and glow rest;
   - hover: the plate brightens, grows 5% (the game's hover) and the shine runs once; press: it sinks onto its lip.
   FIXED SIZE, always: width is set here, nothing inside can change it. 640 px and under it is the icon plate with the day mark alone. Reduced motion: no shine, no breathing. */
.tb-btn.daily{--tint:grayscale(1) sepia(1) saturate(3.2) hue-rotate(-7deg) brightness(1.22);--ink:#2a1700;color:#2a1700;text-shadow:0 1px 0 rgba(255,238,178,.6);width:11.9rem;justify-content:center;gap:.5rem;padding:7px 14px 7px 8px;white-space:nowrap;letter-spacing:.01em}
.tb-btn.daily::before{filter:var(--tint) brightness(var(--v)) drop-shadow(0 3px 0 #5a3906) drop-shadow(0 6px 5px rgba(0,0,0,.5)) drop-shadow(0 0 10px rgba(255,190,60,.3))}
.tb-btn.daily[data-state="done"]::before{filter:var(--tint) brightness(var(--v)) drop-shadow(0 3px 0 #5a3906) drop-shadow(0 6px 5px rgba(0,0,0,.5)) drop-shadow(0 0 0 rgba(255,190,60,0))}
.tb-btn.daily:hover{--v:1.1}
.tb-btn.daily:active,.tb-btn.daily.down{transform:scale(.97) translateY(2px);--v:.94}
.tb-btn.daily:active::before,.tb-btn.daily.down::before{filter:var(--tint) brightness(var(--v)) drop-shadow(0 1px 0 #5a3906) drop-shadow(0 2px 3px rgba(0,0,0,.5)) drop-shadow(0 0 0 rgba(255,190,60,0))}
.tb-btn.daily .tb-txt{position:relative;font-size:1.02rem;line-height:1}
/* the masked light layer */
.tb-fx{position:absolute;inset:var(--po);z-index:-1;pointer-events:none;overflow:hidden;
  -webkit-mask-image:var(--spr-btn-l),var(--spr-btn-r),var(--spr-btn-m);mask-image:var(--spr-btn-l),var(--spr-btn-r),var(--spr-btn-m);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:left center,right center,center;mask-position:left center,right center,center;-webkit-mask-size:auto 100%,auto 100%,calc(100% - 2*(var(--ph)*.509 - 1px)) 100%;mask-size:auto 100%,auto 100%,calc(100% - 2*(var(--ph)*.509 - 1px)) 100%}
.tb-fx::before{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(255,248,214,.62) 0,rgba(255,244,200,.2) 30%,rgba(255,244,200,0) 47%,rgba(70,36,0,0) 58%,rgba(70,36,0,.3) 100%)}
.tb-fx::after{content:"";position:absolute;top:-20%;bottom:-20%;left:0;width:30%;translate:-160% 0;background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,250,225,.72) 50%,rgba(255,255,255,0));transform:skewX(-22deg);opacity:0}
/* the day mark on the plate: the site's own .daymark (app/daymark.css, the daily stream's dark badge; markup of core.js dayMarkHtml), HOSTED here, not restyled: only its
   size, its seat on the plate and its picture's source change (--spr-daymark: the same sprite, inside the stylesheet, so it is there in the first frame). The number's box
   never changes size: 3 and 4 digit days only get a smaller face (data-d, set with the number by shell.html's inline script) */
.tb-btn .daymark.tb-day{width:42px;height:42px;margin:-9px 0 -9px -2px;background-image:var(--spr-daymark);rotate:-7deg;filter:drop-shadow(0 2px 0 rgba(58,32,0,.65));transition:rotate .5s cubic-bezier(.16,1,.3,1),scale .5s cubic-bezier(.16,1,.3,1)}
.tb-btn .tb-day .dm-l{font-size:.42rem;letter-spacing:.14em;margin:4px 0 0 .14em}
.tb-btn .tb-day .bignum{display:block;min-width:2ch;min-height:1em;font-size:1.04rem;line-height:1;margin-top:0;font-variant-numeric:tabular-nums}
.tb-btn .tb-day .bignum[data-d="3"]{font-size:.8rem;padding:.12rem 0}
.tb-btn .tb-day .bignum[data-d="4"]{font-size:.64rem;padding:.2rem 0}
.tb-btn.daily:hover .tb-day{rotate:-2deg;scale:1.08;transition-duration:.05s}
/* the corner gem: the game's notification dot while something is left to play, a green check when today is done */
.tb-gem{position:absolute;top:-10px;right:-5px;width:24px;height:24px;pointer-events:none;background:var(--spr-gem) center/contain no-repeat;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.tb-btn.daily[data-state="done"] .tb-gem{top:-6px;right:-4px;width:17px;height:17px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10.5' fill='%233fa34d' stroke='%230b2a10' stroke-width='2'/%3E%3Cpath d='M6.8 12.4l3.5 3.5 7-7.3' fill='none' stroke='%23fff6e2' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}
@media (prefers-reduced-motion:no-preference){
  .tb-btn.daily[data-state="new"] .tb-fx::after{animation:tbshine 6s linear infinite;animation-delay:var(--tb-phase,0s)}
  .tb-btn.daily[data-state="new"] .tb-gem{animation:tbgem 3s ease-in-out infinite;animation-delay:var(--tb-phase,0s)}
  .tb-btn.daily:hover .tb-fx::after,.tb-btn.daily:focus-visible .tb-fx::after{animation:tbshine-once .7s ease-out 1}
}
@keyframes tbshine{0%{translate:-160% 0;opacity:0}3%{opacity:1}15%{opacity:1}18%,100%{translate:480% 0;opacity:0}}
@keyframes tbshine-once{0%{translate:-160% 0;opacity:0}15%{opacity:1}85%{opacity:1}100%{translate:480% 0;opacity:0}}
@keyframes tbgem{0%,100%{scale:1;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6)) brightness(1)}50%{scale:1.2;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6)) brightness(1.25)}}
@media (max-width:640px){
  .tb-btn.daily{width:42px;padding:0;gap:0}
  .tb-btn.daily .tb-fx{-webkit-mask-image:var(--spr-btn-o);mask-image:var(--spr-btn-o);-webkit-mask-size:100% 100%;mask-size:100% 100%;-webkit-mask-position:center;mask-position:center}
  .tb-btn .daymark.tb-day{width:38px;height:38px;margin:-6px 0}
  .tb-btn .tb-day .bignum{font-size:.96rem}
  .tb-gem{top:-7px;right:-6px;width:19px;height:19px}
}

/* the retry icon (core.js retryBtn; Bean, 23 Sep 2026: "move this try again button to the right and just make it a retry icon"): sits at the right end of its row, a 40 px tap area
   that does not grow the row */
.retry-i{flex:none;display:inline-grid;place-items:center;width:40px;height:40px;margin:-8px -6px -8px auto;padding:0;border:0;border-radius:50%;background:none;color:#e9e1cf;cursor:pointer;transition:color .12s,background-color .12s}
.retry-i svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;transition:transform .3s ease}
.retry-i:hover{color:var(--gold-x);background:rgba(255,255,255,.08)}
.retry-i:hover svg{transform:rotate(90deg)}
.retry-i:focus-visible{outline:2px solid var(--gold);outline-offset:1px}
@media (prefers-reduced-motion:reduce){.retry-i,.retry-i svg{transition:none}.retry-i:hover svg{transform:none}}

/* ===== app/cardancient.css ===== */
/* ===== Ancient-rarity cards (docs/wave3/ancient-cards.md) =====
   The game draws CardRarity.Ancient cards with a different set of nodes (scenes/cards/card.tscn, NCard.Reload()):
   Frame, Portrait, PortraitBorder and TitleBanner are hidden; AncientPortrait (the tall painting, masked to a rounded
   rectangle by ancient_portrait_mask_large), AncientBorderGlassOverlay, AncientBorder, AncientTextBg and AncientBanner
   with its Fire sprite are shown. Title, type plaque, energy gem, star cost and the description keep their places.
   cardHtml (core.js) adds .ancient to the card root and emits .aframe / .atext / .banner>.fire instead of
   .frame / .pborder / .banner. Every number below is the scene's own (card px: CSS left = offset_left + 150,
   top = offset_top + 211; 1em = one card px inside .card). Sprites: extract/ancient_card.py bakes the scene's
   modulate and blend into src/img/ui/card/ancient/*.webp; the mask and the banner are the plain atlas cuts. */

/* AncientPortrait: anchors 0..1 of the (empty) CanvasGroup, offsets (-153,-215)..(445,627), scale .5 -> 299x421 at (-153,-215).
   Its CanvasGroup carries card_canvas_group_mask_material (canvas_group_mask_blur.gdshader): the group rect
   (children + fit_margin 1 = (-154,-216) 301x423) is mapped onto the mask region (600x847 of the 606x852 sprite)
   shifted by mask_offset (10,8) mask px, i.e. the 606x852 mask covers (-150.55,-213.03) 299.03x421.51 card px. */
.card.ancient .portrait{left:calc(-3*var(--u));top:calc(-4*var(--u));width:calc(299*var(--u));height:calc(421*var(--u));
  -webkit-mask-image:url(/img/compressed/card_template/ancient_portrait_mask_large.webp);-webkit-mask-size:calc(299.03*var(--u)) calc(421.51*var(--u));-webkit-mask-position:calc(2.45*var(--u)) calc(1.97*var(--u));-webkit-mask-repeat:no-repeat;
  mask-image:url(/img/compressed/card_template/ancient_portrait_mask_large.webp);mask-size:calc(299.03*var(--u)) calc(421.51*var(--u));mask-position:calc(2.45*var(--u)) calc(1.97*var(--u));mask-repeat:no-repeat}
/* expand_mode 1 + stretch_mode 0 (scale): the 606x852 painting is stretched onto the 598x842 rect */
.card.ancient .portrait img{object-fit:fill}
/* AncientBorder (-154,-223) 306x440, keep-aspect-centred -> 306x427.88 at (-154,-216.94), modulate (1,.978,.906,.502), blend ADD;
   AncientBorderGlassOverlay (-148.46,-210.71) 295.27x416: screen +0.15 inside its mask band, 20% white at the corner flourishes.
   Both are additive, so they are one baked sprite drawn with plus-lighter (a browser without it draws the same sprite source-over). */
.card.ancient{--frame:url(/img/ui/card/ancient/frame.webp)}
.card.ancient .aframe{position:absolute;left:calc(-4*var(--u));top:calc(-5.94*var(--u));width:calc(306*var(--u));height:calc(427.88*var(--u));background:var(--frame) center/100% 100% no-repeat;mix-blend-mode:plus-lighter;z-index:2}
/* AncientTextBg (-133,-22) 264x203, keep-aspect-centred, modulate (0,0,0,.66); the plate shape depends on the card type (CardModel.AncientTextBgPath) */
.card.ancient .atext{position:absolute;left:calc(17*var(--u));top:calc(189*var(--u));width:calc(264*var(--u));height:calc(203*var(--u));background:center/contain no-repeat;z-index:3}
.card.ancient .atext-attack{background-image:url(/img/ui/card/ancient/text_bg_attack.webp)}
.card.ancient .atext-power{background-image:url(/img/ui/card/ancient/text_bg_power.webp)}
.card.ancient .atext-skill{background-image:url(/img/ui/card/ancient/text_bg_skill.webp)}
/* AncientBanner: the TitleBanner rect (-163,-207) 327x83, keep-aspect-covered, no material (the rainbow stays; the rarity tint of style.css is for the hsv banner material the game does not apply here) */
.card.ancient .banner{background-size:cover;background-position:center;filter:none}
/* Fire: AnimatedSprite2D at (164,-10) from the banner's top-left, scale .6, centred; 10 frames at 10 fps looping (SpriteFrames "default", speed 10).
   The strip holds the ten 49x69 frame cells; background-position steps through them, so the animation never touches layout or JS. At rest the animation is
   paused on its current frame (frame 0 until the card is first hovered): a background-position animation is ticked on the main thread every frame, and the
   18 ancients of the 577-card list cost 54 ms/s of style recalc + 23 ms/s of paint at idle while they burned. cardancient3d.css runs it while the card is
   hovered or settling and always in the card page showcase (.big). */
.card.ancient .banner .fire{position:absolute;left:calc(149.3*var(--u));top:calc(-30.7*var(--u));width:calc(29.4*var(--u));height:calc(41.4*var(--u));background:url(/img/ui/card/ancient/flame_strip.webp) 0 0/1000% 100% no-repeat;animation:anc-fire 1s steps(10) infinite;animation-play-state:paused}
@keyframes anc-fire{to{background-position-x:calc(-294*var(--u))}}
@media (prefers-reduced-motion:reduce){.card.ancient .banner .fire{animation:none}}
/* hover: the 3D treatment (lifts, the deep-window parallax of the painting, the glass sheen, the burning flame, the gem glint) lives in cardancient3d.css */

/* ===== app/cardancient3d.css ===== */
/* ===== Ancient cards: the hover 3D treatment (docs/wave3/ancient-cards.md "3D hover") =====
   Same state machine as every card (core.js setHover / tiltTo / settle; style.css "3D tilt"; docs/wave2/card-3d.md): --tx/--ty are the pointer's offset from
   the card centre (-1..1), written on the hovered card only; .hov grows the card, .hov.tilt turns it and lifts the layers, .settle keeps the 3D state for the
   half-second return. Everything in this file is gated by .hov / .settle / .tilt (or .big, the card page showcase), so an ancient card at rest is the flat box
   cardancient.css draws, pixel for pixel: no preserve-3d, no layer transition, no mask beyond the portrait's own, no pseudo-element, no filter, no running
   animation (docs/wave2/card-3d.md "Performance"). The normal card's rules in style.css are untouched; this file adds the ancient's own layers and overrides
   the shared rules only where the ancient stack differs. Bundled after cardancient.css (name order), so it wins ties.
   The stack while hovered (translateZ from the card plane), deepest first:
     .portrait   0   the painting slides against the tilt inside the fixed glass mask: a deep window (5 card px of travel, zoomed 6 % so no edge shows)
     .shadow     0   slides against the tilt (style.css)
     .aframe     6   the glass and border (plus-lighter), the first thing to stand off the painting
     .sheen      7   masked to the glass sprite itself (band, border line, corner flourishes): a soft cream halo plus a narrow specular core, additive
     .atext      8   the black text plate
     .desc       9   (style.css)
     .banner    12   transform-style:preserve-3d while hovered so the flame can stand in front of it; .plaque 12, .title 13 (style.css)
     .fire      12+3 drifts with the tilt and burns (the strip runs), lit by a cyan drop-shadow of its own frames
     .energy    15   the cost gem and the star badge drift with the tilt and carry a specular glint that walks over the gem toward the pointer
     .sticker   16   (style.css) */

/* the glass is additive in the game, so its sheen is brighter than the painted frame's */
.card.ancient{--sheen:.55}

/* return transitions: declared only while hovered or settling, like style.css does for the shared layers */
.card.ancient:is(.hov,.settle) :is(.aframe,.atext,.fire,.energy){transition:transform .5s cubic-bezier(.16,1,.3,1),translate .5s cubic-bezier(.16,1,.3,1),filter .35s}
.card.ancient:is(.hov,.settle) .portrait img{transition:scale .5s cubic-bezier(.16,1,.3,1),translate .5s cubic-bezier(.16,1,.3,1)}
.card.ancient:is(.hov,.settle) .banner{transform-style:preserve-3d}

/* the lifts appear with the grow (transform 0s); the drifts and the glow track the pointer at 80 ms / 120 ms */
.card.ancient.hov.tilt :is(.aframe,.atext,.fire,.energy){transition:transform 0s,translate .08s linear,filter .12s}
.card.ancient.hov.tilt .aframe{transform:translateZ(6px)}
.card.ancient.hov.tilt .atext{transform:translateZ(8px)}
.card.ancient.hov.tilt .fire{transform:translateZ(3px);translate:calc(var(--tx,0) * 2 * var(--u)) calc(var(--ty,0) * 1.5 * var(--u));filter:drop-shadow(0 0 calc(3*var(--u)) rgba(150,245,245,.95)) drop-shadow(0 0 calc(9*var(--u)) rgba(70,215,230,.6))}
.card.ancient.hov.tilt .energy{transform:translateZ(15px);translate:calc(var(--tx,0) * 3 * var(--u)) calc(var(--ty,0) * 3 * var(--u))}
/* the deep window: the painting zooms 6 % over the hover-in and slides against the tilt (deeper layers move away from the pointer, like the shadow) */
.card.ancient.hov.tilt .portrait img{scale:1.06;translate:calc(var(--tx,0) * -5 * var(--u)) calc(var(--ty,0) * -5 * var(--u));transition:scale var(--hov-in,.22s) cubic-bezier(.2,.7,.3,1),translate .08s linear}

/* the glass sheen: the shared band (style.css .card .sheen, created by tiltTo on the first hover, display:none at rest) moved onto the .aframe rect and masked
   by the glass sprite alone (its alpha is the additive strength: the border line and the corner flourishes bright, the glass band soft), with a narrow specular
   core on top of the soft halo; plus-lighter so it adds light the way the glass overlay does in the game. Both bands turn and travel with the pointer. */
.card.ancient .sheen{left:calc(-4*var(--u));top:calc(-5.94*var(--u));width:calc(306*var(--u));height:calc(427.88*var(--u));mix-blend-mode:plus-lighter;
  background:linear-gradient(calc(118deg + var(--tx,0) * 24deg - var(--ty,0) * 18deg),rgba(255,252,240,0) calc(42% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,252,240,.75) calc(46% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,252,240,0) calc(50% + (var(--tx,0) + var(--ty,0)) * 18%)),
    linear-gradient(calc(118deg + var(--tx,0) * 24deg - var(--ty,0) * 18deg),rgba(255,246,214,0) calc(22% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,246,214,var(--sheen)) calc(46% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,246,214,0) calc(70% + (var(--tx,0) + var(--ty,0)) * 18%));
  -webkit-mask-image:var(--frame);-webkit-mask-size:100% 100%;-webkit-mask-position:0 0;-webkit-mask-repeat:no-repeat;-webkit-mask-composite:source-over;
  mask-image:var(--frame);mask-size:100% 100%;mask-position:0 0;mask-repeat:no-repeat;mask-composite:add}

/* the gem glint: a second copy of the gem's own sprite (background:inherit keeps the alpha, so the light stays on the gem and the star), pushed to near-white
   and masked to a small spot that sits toward the pointer; under the number (z-index:-1 inside the gem's stacking context). Generated only while hovered. */
.card.ancient:is(.hov,.settle):not(.still) .energy::after{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:inherit;filter:brightness(2.4) saturate(.4);opacity:0;transition:opacity .35s;
  -webkit-mask:radial-gradient(circle at calc(50% + var(--tx,0) * 24%) calc(46% + var(--ty,0) * 24%),#fff,rgba(255,255,255,.6) 12%,transparent 38%);
  mask:radial-gradient(circle at calc(50% + var(--tx,0) * 24%) calc(46% + var(--ty,0) * 24%),#fff,rgba(255,255,255,.6) 12%,transparent 38%)}
.card.ancient.hov.tilt .energy::after{opacity:.85;transition:opacity .12s}

/* the flame burns while the card is hovered or settling and, always, in the card page showcase (.big: one or two elements, nothing measurable). Everywhere else it
   is paused at rest (cardancient.css): 18 flames running across the 577-card list cost 54 ms/s of style recalc and 23 ms/s of paint at idle (headless Chrome,
   docs/wave3/ancient-cards.md "3D hover"). Paused rather than none, so a card that was hovered keeps the frame it stopped on instead of snapping to frame 0. */
.card.ancient:is(.hov,.settle) .banner .fire,.card.ancient.big .banner .fire{animation-play-state:running}
/* reduced motion: cardancient.css already removes the flame animation; the hover path never adds .tilt, so nothing here lifts, drifts or glints */
@media (prefers-reduced-motion:reduce){.card.ancient:is(.hov,.settle) .banner .fire,.card.ancient.big .banner .fire{animation:none}}

/* ===== app/cardguess.css ===== */
/* ===== Card of the day (app/daily.js "card of the day" block, docs/wave3/cardguess.md) =====
   Everything here is scoped under .cg (the wrapper drawGuess() writes into #gbody), .cg-pick (the practice pool picker) or .cgroom, and
   overrides the old flat .gu / .tile / .win rules in style.css. Built from the game's own parts:
   - the mystery card is the game's "Unknown" card: NCard with ModelVisibility.NotSeen shows the title "Unknown", the text "???" and, for a
     locked card, images/packed/common_ui/locked_card.png in the portrait (scenes/cards/card.tscn, node Lock, 250x190 = the portrait box).
     It is drawn with the same .card parts as cardHtml, so style.css tints it; an unproven part stays a dark silhouette;
   - a proven part flashes the way a hand card does when its cost or keywords change (NHandCardHolder.Flash: card_flash.png, 370x708 behind
     a 300x422 card, alpha 0 -> .6 in .15 s -> 0 in .3 s, NCardHighlight.playableColor 0,244,252; gold 255,200,0 on a win; red 212,0,84);
   - the solved card gets the reward screen's rarity glow (NCardRareGlow / NCardUncommonGlow: fades to alpha .9 over 1 s, ease-in cubic;
     common cards have none);
   - the practice picker is the character select button (scenes/screens/char_select/char_select_button.tscn + NCharacterSelectButton):
     88x130 portrait under char_select_button_mask, the black 25% shadow offset by (8,10), char_select_outline behind at 1.16 x 1.06 pulsing
     between .35 and 1 at 1.6 Hz, unselected s .2 / v .8, selected s 1 / v 1.1, hover scale 1.1 at once and .5 s Expo-out back;
   - tiles sit on the top bar's character backdrop plate (ui/top_bar/top_bar_char_backdrop) washed with the state colour; their icons are
     the card library's pool filters and type sort icons, the card banner and the card's energy orb; the marks are the confirm button's
     tick and the back button's x;
   - the result is the reward screen's panel and banner (scenes/screens/rewards_screen.tscn: reward_panel stretched whole, reward_banner
     over the top edge, the flipped panel at .31 as the inset; the window rises over .5 s ease-out Back) with the statistics screen's icons.
   Motion is transform / opacity only and all of it is off under prefers-reduced-motion (the script also skips its timed sequence). */

/* ---------- the housing: the settings-tab plate and the Daily / Practice tabs are shared with Lethal and live in dailyplate.css (wave 6, 23 Sep 2026) ---------- */

/* ---------- the practice pool picker ---------- */
.cg-pick{display:flex;flex-wrap:nowrap;gap:clamp(5px,1.1vw,12px);margin:4px 0 14px;padding:4px 6px 0}
.cg-pick[hidden]{display:none}
.cg-pk{--c:#f0b429;position:relative;flex:0 1 4.4rem;min-width:0;display:flex;flex-direction:column;align-items:center;gap:6px;padding:0;border:0;background:none;color:var(--muted);font-family:var(--font-t);font-size:.82rem;line-height:1;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .5s cubic-bezier(.16,1,.3,1)}
.cg-pk[data-pool="ironclad"]{--c:var(--ironclad)}.cg-pk[data-pool="silent"]{--c:var(--silent)}.cg-pk[data-pool="defect"]{--c:var(--defect)}.cg-pk[data-pool="necrobinder"]{--c:var(--necrobinder)}.cg-pk[data-pool="regent"]{--c:var(--regent)}.cg-pk[data-pool="colorless"]{--c:var(--colorless)}
.cg-pk:hover,.cg-pk:focus-visible{transform:scale(1.1);transition-duration:0s;outline:0;z-index:2}
.cg-pk:active{transform:scale(1.02)}
.cg-pk .pk-art{position:relative;isolation:isolate;display:block;width:100%;aspect-ratio:88/130}
.cg-pk .pk-art::before{content:"";position:absolute;inset:-3% -8%;z-index:-1;opacity:0;background:var(--c);-webkit-mask:url(/img/packed/character_select/char_select_outline.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_outline.webp) center/100% 100% no-repeat;transition:opacity .2s}
.cg-pk .pk-art::after{content:"";position:absolute;inset:0;z-index:-2;translate:7% 6%;background:#000;opacity:.3;-webkit-mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat}
.cg-pk .pk-art img,.cg-pk .pk-orb{display:block;width:100%;height:100%;object-fit:cover;-webkit-mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;filter:saturate(.2) brightness(.8);transition:filter .5s cubic-bezier(.16,1,.3,1)}
.cg-pk .pk-orb{background:var(--orb,none) center/64% auto no-repeat,linear-gradient(#9aa3a8,#4a5258)}
.cg-pk:hover .pk-art img,.cg-pk:hover .pk-orb,.cg-pk:focus-visible .pk-art img,.cg-pk:focus-visible .pk-orb,.cg-pk[aria-pressed="true"] .pk-art img,.cg-pk[aria-pressed="true"] .pk-orb{filter:saturate(1) brightness(1.1);transition-duration:.05s}
.cg-pk:focus-visible .pk-art::before{opacity:.6}
.cg-pk[aria-pressed="true"] .pk-art::before{opacity:.95;animation:cgpulse 1.25s ease-in-out infinite}
.cg-pk[aria-pressed="true"]{color:#FFF6E2}
.cg-pk[aria-pressed="true"] .pk-n{color:var(--c);text-shadow:0 1px 0 rgba(0,0,0,.7)}
.cg-pk .pk-n{white-space:nowrap;letter-spacing:.01em}
@keyframes cgpulse{0%,100%{opacity:.95}50%{opacity:.4}}

/* ---------- the stage: the hidden card and the play side ---------- */
.cg{position:relative}
.cg-stage{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:clamp(18px,3.4vw,52px);margin:0 0 12px;padding:4px clamp(4px,1.6vw,20px) 8px}   /* no box of its own: the plate is the housing */
.cg-cardbox{position:relative;--cw:12.5rem;width:var(--cw);height:calc(var(--cw) * 1.4067);margin:.9rem 1.4rem .9rem 1.2rem;perspective:900px}
.cg-flip{position:relative;width:100%;height:100%;transform-origin:50% 50%}
.cg-flip.deal{animation:cgdeal .5s cubic-bezier(.16,1,.3,1) both}
.cg-flip.shake{animation:cgshake .38s ease-out both}
.cg-flip.nod{animation:cgnod .42s cubic-bezier(.2,1.3,.4,1) both}
.cg-flip.out{animation:cgout .2s cubic-bezier(.55,0,1,.45) both}
.cg-flip.in{animation:cgin .42s cubic-bezier(.2,.9,.3,1.2) both}
@keyframes cgdeal{from{transform:translateY(36px) scale(.8) rotate(-6deg);opacity:0}to{transform:none;opacity:1}}
@keyframes cgshake{0%,100%{transform:none}18%{transform:translateX(-8px) rotate(-1.6deg)}40%{transform:translateX(7px) rotate(1.3deg)}62%{transform:translateX(-4px) rotate(-.6deg)}82%{transform:translateX(2px)}}
@keyframes cgnod{0%{transform:none}40%{transform:scale(1.06)}100%{transform:none}}
@keyframes cgout{from{transform:none}to{transform:rotateY(90deg) scale(1.05)}}
@keyframes cgin{from{transform:rotateY(-90deg) scale(1.14)}to{transform:none}}
/* NHandCardHolder.Flash */
.cg-flash{position:absolute;left:50%;top:50%;width:123.3%;height:167.8%;translate:-50% -50%;opacity:0;pointer-events:none;background:var(--fc,rgb(0,244,252));-webkit-mask:url(/img/packed/card_template/card_flash.webp) center/100% 100% no-repeat;mask:url(/img/packed/card_template/card_flash.webp) center/100% 100% no-repeat}
.cg-flash.win{--fc:rgb(255,200,0)}.cg-flash.lost{--fc:rgb(212,0,84)}
.cg-flash.go{animation:cgflash .45s linear both}
.cg-flash.go.win{animation:cgflashwin .8s linear both}
@keyframes cgflash{0%{opacity:0}33%{opacity:.6}100%{opacity:0}}
@keyframes cgflashwin{0%{opacity:0;transform:scale(.9)}20%{opacity:.85;transform:scale(1)}100%{opacity:0;transform:scale(1.25)}}
/* the reward screen's rarity glow behind the solved card */
.cg-glow{position:absolute;inset:-30% -48%;border-radius:50%;opacity:0;pointer-events:none;background:radial-gradient(closest-side,var(--gc,transparent) 35%,transparent 100%)}
.cg[data-rar="uncommon"]{--gc:rgba(64,190,255,.6)}.cg[data-rar="rare"]{--gc:rgba(255,200,0,.62)}.cg[data-rar="ancient"]{--gc:rgba(255,125,59,.6)}
.cg.won .cg-cardbox.lit .cg-glow{opacity:.9;animation:cgglow 1s cubic-bezier(.32,0,.67,0) both}
@keyframes cgglow{from{opacity:0;transform:scale(1.08)}to{opacity:.9;transform:scale(1)}}
/* THE MYSTERY CARD INVITES (wave 4, WP6, 21 Sep 2026). Bean, on the hub's tile of this game: "the background behind the lock icon being dark purple along with the icon being
   chains and a lock feel more negative than enticing. We should try to make this more inviting so people want to play it." The game page's own hidden card now wears the look
   the DAILY stream gave the hub's (home.css .dg-myst, same values): an unproven frame is bronze, not a dead grey silhouette; an unproven banner, portrait border and plaque are a
   dull old gold (the rare banner's hue at .78 of its light and .8 of its colour, so a proven Rare still lights up as news); the portrait is the game's gold question mark floating on a warm glow (daily.js
   cgMystery) instead of the chained padlock; "???" is gold; a soft halo breathes behind the card while it is still a mystery. A proven part switches to the real sprite exactly
   as before: style.css's [data-pool] / [data-rar] tints take over the moment the attribute stops being "unknown". */
.cg-myst{cursor:default}
.cg-myst[data-pool="unknown"] .frame{filter:hue-rotate(32deg) saturate(.75) brightness(.62)}
.cg-myst[data-rar="unknown"] .banner,.cg-myst[data-rar="unknown"] .pborder,.cg-myst[data-rar="unknown"] .plaque{filter:hue-rotate(203deg) saturate(.8) brightness(.78)}
.cg-myst[data-pool="unknown"] .energy{filter:sepia(1) saturate(1.5) hue-rotate(-10deg) brightness(.82)}
.cg-myst .portrait{background:radial-gradient(circle at 50% 52%,#a8681c 0,#54290a 58%,#221004 100%)}
.cg-myst .portrait img{object-fit:contain;opacity:1;padding:11% 0 9%;box-sizing:border-box;filter:drop-shadow(0 0 calc(10*var(--u)) rgba(255,214,120,.85));animation:cgqfloat 3.6s ease-in-out infinite}
/* THE ? IS DRAWN AT ITS OWN PIXELS (wave 5, audit D5: the 128 px event sprite filled the portrait's height, about 100 CSS px, 1.45x its pixels on Bean's 1.5x screen). On the
   card page the sprite is a 128u square in the middle of the portrait (128u = 85 CSS px at the 12.5rem card, 128 device px at 1.5x; smaller cards scale down). The hub's
   smaller copy of this card (home.css .dg-myst) is already under that size and keeps its own rule */
.cg-cardbox .cg-myst .portrait{display:flex;align-items:center;justify-content:center}
.cg-cardbox .cg-myst .portrait img{width:calc(128*var(--u));height:calc(128*var(--u));padding:0;flex:none}
.cg-myst .title{color:#fff6e2}
.cg-myst .cg-q3{letter-spacing:.08em;color:#ffd978;text-shadow:0 0 calc(12*var(--u)) rgba(255,190,80,.6)}
.cg-myst .cg-q3.big{font-size:calc(46*var(--u))}
.cg-cardbox:has(.cg-myst)::before{content:"";position:absolute;inset:-20% -40%;border-radius:50%;pointer-events:none;background:radial-gradient(closest-side,rgba(255,226,146,.62),rgba(255,198,88,.38) 38%,rgba(255,160,48,.15) 64%,rgba(255,140,30,0) 100%);animation:cgwarm 3.6s ease-in-out infinite}
@keyframes cgwarm{0%,100%{opacity:.72;scale:1}50%{opacity:1;scale:1.06}}
@keyframes cgqfloat{0%,100%{translate:0 0}50%{translate:0 -4%}}
.cg-myst[data-rar="unknown"] .plaque span{color:rgba(255,246,226,.8)}
.cg-myst .energy.rng span{font-size:calc(23*var(--u))}
.cg-myst .energy.q span{opacity:.85}
.cg-myst .desc .tx{font-size:calc(25*var(--u));line-height:1.15}
.cg-myst.pop-pool .frame,.cg-myst.pop-pool .energy,.cg-myst.pop-type .frame,.cg-myst.pop-type .pborder,.cg-myst.pop-type .plaque,.cg-myst.pop-rarity .banner,.cg-myst.pop-rarity .pborder,.cg-myst.pop-rarity .plaque,.cg-myst.pop-cost .energy,.cg-myst.pop-kw .desc{animation:cgpop .42s cubic-bezier(.2,1.5,.4,1) both}
@keyframes cgpop{from{transform:scale(1.16);opacity:.3}to{transform:none;opacity:1}}

/* the play side */
.cg-side{min-width:0}
.cg-play{max-width:27rem}
.cg .dl-input{max-width:none;margin:0 0 8px}
.cg .dl-input input{padding:12px 14px 11px;border-radius:9px;border:2px solid var(--line-l);background:#0b161b;color:#FFF6E2;font-family:var(--font-t);font-size:1.08rem;box-shadow:inset 0 2px 0 rgba(0,0,0,.45)}
.cg .dl-input input:focus{outline:0;border-color:var(--gold);box-shadow:inset 0 2px 0 rgba(0,0,0,.45),0 0 0 3px rgba(239,200,81,.18)}
/* the search bar's clear button (card_library.tscn SearchBar/ClearButton: the back button's x, 36 px in a 48 px bar; NClearSearchButton scales it 1.1 in .05 s on focus and back in .3 s) */
.cg .dl-input input{padding-right:2.9rem}
.cg-clear{position:absolute;right:6px;top:24px;translate:0 -50%;display:grid;place-items:center;width:2.3rem;height:2.3rem;padding:0;border:0;background:none;cursor:pointer;-webkit-tap-highlight-color:transparent}
.cg-clear[hidden]{display:none}
.cg-clear img{width:1.55rem;height:1.55rem;object-fit:contain;opacity:.85;filter:drop-shadow(0 2px 0 rgba(0,0,0,.5));transition:scale .3s cubic-bezier(.16,1,.3,1)}
.cg-clear:hover img,.cg-clear:focus-visible img{scale:1.1;opacity:1;transition-duration:.05s}
.cg-clear:focus-visible{outline:0}
/* the suggestions: the game's hover tip panel (ui/hover_tip, the nine-slice style.css .tipbox draws), each row the card's painting, its name and its character's top bar icon */
.cg .dl-sugg{top:calc(100% + 3px);padding:0;border:11px solid transparent;border-image:url(/img/ui/hover_tip.webp) 16 fill / 11px stretch;border-radius:0;background:none;overflow:visible;box-shadow:none;filter:drop-shadow(0 8px 14px rgba(0,0,0,.6))}
.cg .dl-sugg button{gap:10px;margin:0;padding:5px 6px;border:0;border-radius:4px;font-family:var(--font-t);font-size:1rem;color:#FFF6E2}
.cg .dl-sugg button+button{box-shadow:0 -1px 0 rgba(255,255,255,.07)}
.cg .dl-sugg button:hover,.cg .dl-sugg button.sel{background:rgba(255,246,226,.1)}
.cg .dl-sugg button[disabled]{justify-content:center;padding:8px 6px;color:var(--muted);cursor:default}
.cg .dl-sugg .sg-pool{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:.8rem;color:var(--muted)}
.cg .dl-sugg .sg-pool img{width:24px;height:24px;object-fit:contain;border-radius:0;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
.cg .cg-hint{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;margin:0 0 10px;font-size:.86rem;line-height:1.3}
.cg .cg-count{margin-left:auto;font-family:var(--font-t);font-size:.95rem;color:#FFF6E2;white-space:nowrap}
.cg .cg-count:empty{display:none}
.cg .cg-hint>.dim:empty{display:none}.cg .cg-hint>.dim:empty+.cg-count{margin-left:0}
.cg .cg-hint:has(>.dim:empty):has(>.cg-count:empty){display:none}
.cg .cg-give{margin:4px 0 10px;gap:10px;align-items:center}
.cg-foot{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;min-height:2.2rem}
.cg-foot .btn{margin-left:auto}
.cg-streak{display:inline-flex;align-items:center;gap:7px;font-family:var(--font-t);font-size:1rem;color:#FFF6E2}
.cg-streak img{width:1.2rem;height:1.7rem;object-fit:contain;filter:drop-shadow(0 0 4px rgba(255,120,30,.45)) drop-shadow(0 2px 0 rgba(0,0,0,.45))}   /* the top bar's flame, 88 x 128 */
.cg-streak b{font-size:1.25rem;color:var(--gold)}
.cg-streak .dim{font-size:.85rem}

/* ---------- guess rows ----------
   THE TILES KEEP THE PLATE'S OWN SHAPE (wave 6, 23 Sep 2026): the top bar's character backdrop (90 x 85) used to stretch to whatever the row gave it, 105 x 131 at
   a 1000 px window. Each tile now holds the sprite's proportions (aspect-ratio 90/85) and is its own container, so the icon, the value and the mark scale with the
   tile instead of the window; the guessed card's mini beside the row shrinks with the panel, so it never makes the row taller than the tiles. In the top bar the
   character icon nearly fills this backdrop, so the icons here are drawn large (about 40% of the tile), the energy orb's number at the card's own ratio (half the
   orb, the pool's outline colour). */
.cg-cols,.cg .gu{display:grid;grid-template-columns:6.4rem repeat(5,minmax(0,1fr));gap:8px}
.cg.solo .cg-cols,.cg.solo .gu{grid-template-columns:6.4rem repeat(4,minmax(0,1fr))}
.cg.solo .t-pool,.cg.solo .c-pool{display:none}
.cg.solo .cg-cols,.cg.solo .gu{max-width:calc(6.4rem + 32px + (100% - 6.4rem - 40px) * .8);margin-left:auto;margin-right:auto}   /* one character's practice drops the character column: the four tiles keep the width five would have, the rows centred */
.cg-cols{margin:4px 0 -2px;font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);text-align:center}
.cg .gu{align-items:stretch;margin:8px 0}
.cg .gu .who{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-width:0;font-family:var(--font-t);text-align:center}
.cg .gu .who .mini .card{--cw:clamp(2.7rem,calc(13.4cqi - 42px),5.4rem)}
.cg .gu .who .nm{font-size:.82rem;line-height:1.1;color:#FFF6E2;overflow-wrap:anywhere}
.cg #grows.shift .gu:not(.fresh){animation:cgshift .34s cubic-bezier(.16,1,.3,1) both}
@keyframes cgshift{from{transform:translateY(calc(-100% - 8px))}to{transform:none}}
.cg .tile{--tc:#363c45;position:relative;isolation:isolate;container-type:inline-size;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0;min-width:0;aspect-ratio:90/85;padding:8% 5% 6%;border-radius:0;background:none;color:#FFF6E2;text-align:center;font-family:var(--font-t);text-shadow:0 1px 0 rgba(0,0,0,.55);animation:cgtile .46s cubic-bezier(.3,.7,.3,1) both;animation-delay:var(--fd,0s)}
.cg .tile.ok{--tc:#2f7f2c}.cg .tile.close{--tc:#a87a16}.cg .tile.no{--tc:#363c45}
.cg .tile::before,.cg .legend .mk::before{content:"";position:absolute;inset:0;z-index:-1;background:url(/img/ui/top_bar/top_bar_char_backdrop.webp) center/100% 100% no-repeat var(--tc);background-blend-mode:screen;-webkit-mask:url(/img/ui/top_bar/top_bar_char_backdrop.webp) center/100% 100% no-repeat;mask:url(/img/ui/top_bar/top_bar_char_backdrop.webp) center/100% 100% no-repeat}
.cg .tile::before{filter:drop-shadow(0 3px 0 rgba(0,0,0,.4))}
.cg .tile.no{color:#cfd5d8}
.cg .tile.no .ic{opacity:.72}
@keyframes cgtile{0%{transform:perspective(420px) rotateX(-92deg);opacity:0}8%{opacity:1}62%{transform:perspective(420px) rotateX(0) scale(1.1)}100%{transform:none;opacity:1}}
.cg .tile .val{display:block;margin-top:5cqi;font-size:clamp(.6rem,10.5cqi,1.05rem);line-height:1.1;overflow-wrap:anywhere;max-width:100%}
.cg .t-kw .val{margin-top:0;font-size:clamp(.6rem,10cqi,1rem)}
.cg .tile .ic{flex:none;display:block;width:40cqi;height:40cqi;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.cg .tile .ic.rb{width:76cqi;height:auto;aspect-ratio:655/170;margin:10cqi 0 6cqi;background:center/100% 100% no-repeat}
.cg .rb[data-rar="common"],.cg .rb[data-rar="basic"]{filter:saturate(0) brightness(.85) drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.cg .rb[data-rar="rare"]{filter:hue-rotate(203deg) saturate(1.2) brightness(1.14) drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.cg .rb[data-rar="ancient"]{filter:hue-rotate(178deg) saturate(1.6) brightness(1.05) drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.cg .tile .ic.orb{display:grid;place-items:center;width:42cqi;height:42cqi;background:center/contain no-repeat}
.cg .tile .ic.orb b{font-family:var(--font-t);font-weight:700;font-size:21cqi;line-height:1;color:#FFF6E2;paint-order:stroke fill;-webkit-text-stroke:.25em var(--eout,#5C5440);text-shadow:.06em .06em 0 rgba(0,0,0,.19);translate:0 -.04em}
.cg .orb[data-pool="ironclad"]{--eout:#802020}.cg .orb[data-pool="silent"]{--eout:#1A6625}.cg .orb[data-pool="defect"]{--eout:#1D5673}.cg .orb[data-pool="necrobinder"]{--eout:#803367}.cg .orb[data-pool="regent"]{--eout:#803D0E}
/* the cost arrow: the game's gold settings arrow (ui/settings_tiny_right_arrow, 128 x 128) turned to point up (the answer costs more) or down (less) */
.cg .arrow{display:inline-block;flex:none;width:1.15rem;height:1.15rem;background:url(/img/ui/settings_tiny_right_arrow.webp) center/contain no-repeat;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
.cg .arrow.up{rotate:-90deg}.cg .arrow.down{rotate:90deg}
.cg .tile .arrow{display:block;width:17cqi;height:17cqi;margin:1cqi auto 0}
/* the state mark: the confirm button's tick, a tilde, the back button's cross, so colour is never the only signal */
.cg .mk{position:relative;display:inline-grid;place-items:center;width:.95rem;height:.95rem;background:center/contain no-repeat;font-style:normal;font-family:var(--font-t);font-weight:700;font-size:1.1rem;line-height:1;text-align:center;color:#FFF6E2;text-shadow:0 0 2px #000,0 1px 0 #000}
.cg .mk.cl{font-size:1.45em;line-height:1}
.cg .mk.cl b{display:block;font-weight:inherit;line-height:1;text-box:trim-both cap alphabetic;translate:0 .18em}   /* Kreon draws its tilde high: the glyph's box is trimmed to the capitals and dropped onto the tick's centre line, so it never pokes out of its chip */
.cg .mk.ok{background-image:url(/img/compressed/confirm_button_tick.webp)}
.cg .mk.no{background-image:url(/img/compressed/back_button_x.webp);opacity:.7}
.cg .tile .mk{position:absolute;top:6cqi;right:7cqi;width:13cqi;height:13cqi;font-size:15cqi}
.cg .tile .mk.cl{font-size:30cqi}
/* the key under the rows: each mark on a small copy of the tile's plate */
.cg .legend{align-items:center;gap:8px 18px;margin-top:10px}
.cg .legend span{display:inline-flex;align-items:center;gap:7px}
.cg .legend .mk{--tc:#363c45;isolation:isolate;width:1.5rem;height:1.42rem;background-size:0 0;font-size:1.3rem}
.cg .legend .mk.ok{--tc:#2f7f2c}.cg .legend .mk.cl{--tc:#a87a16;font-size:1.05rem}.cg .legend .mk.cl b{translate:0 .1em}.cg .legend .mk.no{opacity:1}
.cg .legend .mk.ok::after,.cg .legend .mk.no::after{content:"";position:absolute;inset:22%;background:center/contain no-repeat}
.cg .legend .mk.ok::after{background-image:url(/img/compressed/confirm_button_tick.webp)}
.cg .legend .mk.no::after{background-image:url(/img/compressed/back_button_x.webp);opacity:.75}

/* ---------- the result: the game's reward panel ---------- */
.cg-result{position:relative;isolation:isolate;width:min(100%,27rem);margin:1.6rem 0 .4rem;padding:2.9rem 1.5rem 1.35rem;color:#FFF6E2;font-family:var(--font-t);outline:0;filter:drop-shadow(0 10px 14px rgba(0,0,0,.55))}
.cg-result::before{content:"";position:absolute;inset:0;z-index:-1;background:url(/img/ui/reward_screen/reward_panel.webp) center/100% 100% no-repeat}
.cg-result.lost::before{filter:saturate(.55) brightness(.82)}
.cg-result.pending{visibility:hidden}
.cg-result.rise{animation:cgrise .5s cubic-bezier(.34,1.56,.64,1) both}
@keyframes cgrise{from{transform:translateY(70px);opacity:0}to{transform:none;opacity:1}}
.cg-banner{position:absolute;left:-1.3rem;right:-1.3rem;top:0;translate:0 -44%;aspect-ratio:1499/270;container-type:inline-size;background:url(/img/ui/reward_screen/reward_banner.webp) center/100% 100% no-repeat;filter:drop-shadow(0 4px 3px rgba(0,0,0,.45))}
.cg-result.lost .cg-banner{filter:grayscale(.6) brightness(.78) drop-shadow(0 4px 3px rgba(0,0,0,.45))}
.cg-banner h3{position:absolute;left:13%;right:13%;top:41%;translate:0 -50%;margin:0;text-align:center;white-space:nowrap;font-family:var(--font-t);font-weight:700;font-size:1.6rem;font-size:clamp(1.1rem,6.4cqw,1.9rem);line-height:1.25;letter-spacing:.02em;color:#FFF6E2;text-shadow:0 0 2px #4a3c2a,1px 0 0 #4a3c2a,-1px 0 0 #4a3c2a,0 1px 0 #4a3c2a,0 -1px 0 #4a3c2a,1px 1px 0 #4a3c2a,-1px -1px 0 #4a3c2a,1px -1px 0 #4a3c2a,-1px 1px 0 #4a3c2a,0 2px 0 #4a3c2a,3px 3px 0 rgba(0,0,0,.13)}
.cg-sub{margin:0 0 .7rem;text-align:center;font-size:1rem;line-height:1.3;color:var(--gold);text-shadow:0 1px 0 rgba(0,0,0,.6)}
.cg-result.lost .cg-sub{color:var(--muted)}.cg-sub b{color:#FFF6E2}
.cg-sub .nw{white-space:nowrap}
.cg-inset{position:relative;isolation:isolate;margin:0 0 .9rem;padding:.8rem 1.5rem .95rem 1.35rem}
.cg-inset::before{content:"";position:absolute;inset:0;z-index:-1;background:url(/img/ui/reward_screen/reward_panel.webp) center/100% 100% no-repeat;transform:scale(-1,-1);filter:brightness(.31)}
.cg-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:4px;margin-bottom:.7rem;text-align:center}
.cg-stat{display:flex;flex-direction:column;align-items:center;gap:1px;min-width:0}
.cg-stat img{width:2rem;height:2rem;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.cg-stat b{font-size:1.45rem;line-height:1.05;font-variant-numeric:tabular-nums;text-shadow:0 0 2px rgba(0,0,0,.5),1px 1px 0 rgba(0,0,0,.5)}
.cg-stat span{font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;color:#cbbf9f;line-height:1.1}
.cg-dist{display:grid;gap:3px}
.cg-dist>div{display:grid;grid-template-columns:1.5rem minmax(0,1fr);gap:6px;align-items:center;font-size:.85rem}
.cg-dist>div>span{text-align:right;color:#cbbf9f}
.cg-dist .bar{width:var(--w,6%);min-width:1.5rem;padding:1px 6px 0;border-radius:3px;background:#5d6b70;color:#FFF6E2;text-align:right;transform-origin:0 50%}
.cg-dist .bar.me{background:var(--gold);color:#241600}
.cg-result.rise .cg-dist .bar{animation:cgbar .5s cubic-bezier(.16,1,.3,1) .35s both}
@keyframes cgbar{from{transform:scaleX(.05)}to{transform:none}}
.cg-result .btnrow{justify-content:center}
.cg-sharebtn img{width:1.2rem;height:1.2rem;margin:-3px 0 -3px -4px;object-fit:contain;filter:drop-shadow(0 1px 0 rgba(0,0,0,.45))}   /* the statistics screen's own share arrow */
.cg-result .share-out{min-height:5rem}

/* ---------- narrow: measured on the panel itself (.cgroom is the container), because the rail takes its share of the window first ---------- */
.cgroom{container:cg / inline-size}
@container cg (max-width:40rem){
  .cg-stage{grid-template-columns:minmax(0,1fr);justify-items:center;gap:6px;padding:12px 8px 14px}
  .cg-cardbox{--cw:9.6rem;margin:.6rem 0 .9rem}
  .cg-side{width:100%}
  .cg-play{max-width:none}
  .cg-result{margin:1.9rem auto .4rem}
}
@container cg (max-width:35rem){
  .cg-pick{gap:4px;padding:4px 2px 0;margin-bottom:12px}
  .cg-pk{flex:1 1 0}
  .cg-pk .pk-n{display:none}
  .cg-cols,.cg .gu{grid-template-columns:repeat(5,minmax(0,1fr));gap:4px}
  .cg.solo .cg-cols,.cg.solo .gu{grid-template-columns:repeat(4,minmax(0,1fr));max-width:none}
  .cg-cols{font-size:.56rem;letter-spacing:.04em}
  .cg-cols span:first-child{display:none}
  .cg .gu{margin:12px 0 14px}
  .cg .gu .who{grid-column:1/-1;flex-direction:row;justify-content:flex-start;gap:9px}
  .cg .gu .who .mini .card{--cw:2.7rem}
  .cg .gu .who .nm{font-size:1rem;text-align:left}
  .cg #grows.shift .gu:not(.fresh){animation-name:cgshift-s}
  .cg-result{padding:2.6rem 1.1rem 1.2rem}
  .cg-inset{padding:.7rem 1.15rem .85rem 1rem}
  .cg-stat b{font-size:1.25rem}.cg-stat span{font-size:.6rem;letter-spacing:.04em}
}
@keyframes cgshift-s{from{transform:translateY(calc(-100% - 14px))}to{transform:none}}

/* ---------- reduced motion: final states only ---------- */
@media (prefers-reduced-motion:reduce){
  .cg .tile,.cg #grows.shift .gu,.cg-flip,.cg-flash,.cg-glow,.cg-cardbox::before,.cg-myst *,.cg-result,.cg-result .bar,.cg-pk .pk-art::before{animation:none!important}
  .cg-pk,.cg-pk .pk-art img,.cg-pk .pk-orb,.cg-clear img{transition:none}
  .cg-pk:hover,.cg-pk:focus-visible{transform:none}
  .cg-result.pending{visibility:visible}
  .cg.won .cg-cardbox.lit .cg-glow{opacity:.9}
}

/* ===== app/cardversions.css ===== */
/* ---------- card page: earlier versions of the card (build/app/cardversions.js; docs/wave3/card-versions.md, docs/wave5/versions.md) ----------
   The switcher sits under the Base / Upgraded toggle inside .showcase. Up to three older versions: a grid of small plates (the game's settings-tab
   sprite, the active one shifted to gold the way the toggle is). More: the game's settings paginator, its two gold arrow sprites around a label plate.
   The old cards wait in #cvstore (hidden) and are moved into #upgstage by cvSelect, so nothing here hides or shows cards; .cv-in is only the deal-in. */
.cv-switch{display:flex;flex-direction:column;align-items:center;gap:6px;width:100%;max-width:17rem;margin-top:2px;padding-top:10px;border-top:1px solid rgba(255,255,255,.08)}
#showcase{scroll-margin-top:5.5rem}/* "Show that version" scrolls here; the top bar is sticky */
.cv-switch [hidden],.cv-store[hidden],.cv-note[hidden]{display:none!important}
.cv-h{font-family:var(--font-t);font-size:max(.72rem,11px);letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}
.cv-chips{display:grid;grid-template-columns:1fr 1fr;gap:6px;width:100%}
.cv-chip,.cv-now{position:relative;isolation:isolate;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:2.9rem;padding:4px 9px 5px;margin:0;border:0;border-radius:0;background:none;box-shadow:none;color:#fff6e2;font-family:var(--font-t);line-height:1.05;text-align:center;--tint:saturate(.8) brightness(.78);--v:1}
.cv-chip{cursor:pointer;user-select:none;-webkit-user-select:none;transition:transform .5s cubic-bezier(.16,1,.3,1)}
.cv-chip::before,.cv-now::before{content:"";position:absolute;inset:0;z-index:-1;background:url(/img/ui/settings_tab_selected.webp) center/100% 100% no-repeat;filter:var(--tint) brightness(var(--v)) drop-shadow(0 2px 2px rgba(0,0,0,.45));transition:filter .5s cubic-bezier(.16,1,.3,1)}
/* THE TWO LINES (Bean, 22 Sep 2026): "Pre Feb 2026" over "February 12th", both short so neither sits near the plate's edges (the old "Before 12 Feb 2026"
   ran 111 px wide on a 121 px plate); the buttons that are not active end their date with a small chevron: press to go there */
.cv-chip-l{font-weight:700;font-size:.86rem;letter-spacing:.01em;white-space:nowrap}
.cv-chip-s{font-size:max(.68rem,11px);letter-spacing:.04em;color:var(--muted);white-space:nowrap}
.cv-chip:not(.on) .cv-chip-s::after{content:"";display:inline-block;width:.34em;height:.34em;margin:0 0 .06em .38em;border:solid currentColor;border-width:1.5px 1.5px 0 0;rotate:45deg;opacity:.85}
.cv-chip:hover{transform:scale(1.04);--v:1.3;transition-duration:.05s}
.cv-chip:hover::before{transition-duration:.05s}
.cv-chip:active{transform:scale(.97);--v:.85;transition-duration:.12s}
.cv-chip.on{--tint:grayscale(1) sepia(1) saturate(2.6) brightness(1.28);color:#241600;cursor:default}
.cv-chip.on .cv-chip-s{color:#2e1d00}
.cv-chip.on:hover,.cv-chip.on:active{transform:none;--v:1}
.cv-chip:focus-visible,.cv-arrow:focus-visible,.cv-jump:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* the paginator: the game's settings arrows (NPaginator), a label plate between them */
.cv-step{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}
.cv-now{flex:1 1 auto;min-width:0;--tint:saturate(.8) brightness(.9)}
.cv-now-i{display:flex;flex-direction:column;align-items:center;gap:2px}
.cv-arrow{flex:0 0 auto;width:2.75rem;height:2.75rem;padding:0;margin:0;border:0;border-radius:0;background:url(/img/ui/settings_tiny_left_arrow.webp) center/82% no-repeat;cursor:pointer;filter:drop-shadow(0 2px 2px rgba(0,0,0,.5));transition:transform .5s cubic-bezier(.16,1,.3,1),filter .5s cubic-bezier(.16,1,.3,1)}
.cv-arrow.cv-newer{background-image:url(/img/ui/settings_tiny_right_arrow.webp)}
.cv-arrow:hover{transform:scale(1.12);filter:brightness(1.25) drop-shadow(0 2px 2px rgba(0,0,0,.5));transition-duration:.05s}
.cv-arrow:active{transform:scale(.92);filter:brightness(.8);transition-duration:.12s}
.cv-arrow[disabled]{cursor:default;opacity:.3;filter:grayscale(1);transform:none}
/* the Base / Upgraded plates stand 4 px lower on the card page (Bean, 22 Sep 2026: "Move the "base" and "upgraded" buttons down 4px"); the Version group under them moves with them */
.hero .showcase>.upg-toggle.game{margin-top:4px}
/* the stage while an old version is on it: an amber rule round the showcase and a ribbon over the card (the note beside the title carries the words) */
.hero .showcase.cv-isold{border-color:rgba(255,165,24,.55);background:radial-gradient(100% 80% at 50% 30%,rgba(255,165,24,.1),transparent 70%),rgba(0,0,0,.25)}
.hero .showcase.cv-isold .upg-stage::after{content:"Old version";position:absolute;top:-10px;left:50%;translate:-50% 0;z-index:6;padding:2px 10px 3px;border-radius:4px;background:#FFA518;color:#241600;font-family:var(--font-t);font-weight:700;font-size:max(.72rem,11px);letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;pointer-events:none;box-shadow:0 2px 4px rgba(0,0,0,.5)}
/* numbers proven, wording not (a words-only change lies between this version and today): the ribbon says so on the stage itself */
.hero .showcase.cv-isold.cv-partial .upg-stage::before{content:"Old numbers, current wording";position:absolute;bottom:-9px;left:50%;translate:-50% 0;z-index:6;padding:2px 8px 3px;border-radius:4px;background:#241600;border:1px solid #FFA518;color:#FFA518;font-family:var(--font-t);font-weight:700;font-size:max(.68rem,11px);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;pointer-events:none;box-shadow:0 2px 4px rgba(0,0,0,.5)}
.upg-stage>.cs.cv-in{animation:cv-in .28s cubic-bezier(.16,1,.3,1) backwards}
@keyframes cv-in{from{opacity:0;translate:0 14px;scale:.95}}
.upg-toggle.game button[disabled]{opacity:.4;cursor:default}
.upg-toggle.game button[disabled]:hover{transform:none;--v:1}
/* old values on the card and in the game text: the game's red (worse than now), green (better than now) or amber (changed), always with a dotted rule so
   an old value never reads as the green upgrade mark */
.cv-old{border-bottom:2px dotted currentColor;color:var(--orange)}
.cv-old.cv-worse{color:#ff6563}.cv-old.cv-better{color:#7FFF00}.cv-old.cv-mid{color:var(--orange)}
.card .desc .cv-old.cv-worse,.card .desc .cv-old.cv-worse .num,.card .desc .cv-old.cv-worse .up,.card .desc .cv-old.cv-worse .up .num,.card .desc .cv-old.cv-worse .kw{color:#ff6563}
.card .desc .cv-old.cv-better,.card .desc .cv-old.cv-better .num,.card .desc .cv-old.cv-better .up,.card .desc .cv-old.cv-better .up .num,.card .desc .cv-old.cv-better .kw{color:#7FFF00}
.card .desc .cv-old.cv-mid,.card .desc .cv-old.cv-mid .num,.card .desc .cv-old.cv-mid .up,.card .desc .cv-old.cv-mid .up .num,.card .desc .cv-old.cv-mid .kw{color:#FFA518}
.hero .gametext .cv-old.cv-worse,.hero .gametext .cv-old.cv-worse .num,.hero .gametext .cv-old.cv-worse .up{color:#ff6563}
.hero .gametext .cv-old.cv-better,.hero .gametext .cv-old.cv-better .num,.hero .gametext .cv-old.cv-better .up{color:#7FFF00}
.hero .gametext .cv-old.cv-mid,.hero .gametext .cv-old.cv-mid .num,.hero .gametext .cv-old.cv-mid .up,.hero .gametext .cv-old.cv-mid .kw,.hero .gametext .cv-old.cv-mid .kw a{color:#FFA518}
.card .energy.cv-old{border-bottom:0}
.card .energy.cv-old span{text-decoration:underline dotted;text-underline-offset:.12em}
.card .energy.cv-old.cv-worse span{color:#ff8a88}.card .energy.cv-old.cv-better span{color:#9dff4d}.card .energy.cv-old.cv-mid span{color:#ffc466}
.cv-unknown{font-style:italic;color:var(--muted)}
/* ---------- THE OLD-VERSION NOTE (Bean, 22 Sep 2026: "just put a small note to the right of the card title and tags "You are viewing an old version of this
   card" so wee don't have to move the whole page down like it does currently") ----------
   cardversions.js cvHeadOpen / cvHeadClose wrap the h1 and its chip row in .cv-head; the note is its last child, pushed to the right end and centred on the
   block. It is display:none until cvSelect shows an old version, so a page with the current card is laid out exactly as one without a history. When the
   info column is too narrow for both (a phone), the note wraps under the chips as one short line: still nothing above the title moves. */
.cv-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 14px}
.cv-head>h1{flex:0 0 100%;margin-bottom:4px}   /* the title on its own line; the chip row is the one that shares its line with the note */
.cv-head>.row{flex:1 1 auto;width:auto;min-width:0}
.cv-note{flex:0 1 auto;margin:0;padding:4px 10px 5px 8px;border-left:3px solid var(--orange);border-radius:0 8px 8px 0;background:rgba(255,165,24,.12);color:var(--text,#e8eeee);font-family:var(--font-t);font-size:max(.8rem,12px);line-height:1.25;letter-spacing:.02em;white-space:nowrap}
.cv-note:focus{outline:0}.cv-note:focus-visible{outline:2px solid var(--orange);outline-offset:2px}
@media (max-width:640px){.cv-note{white-space:normal}}
/* the "Show that version" button in a change line */
.cv-jump{padding:2px 0;margin:0;border:0;background:none;color:var(--gold);font:inherit;font-weight:700;text-decoration:underline dotted;text-underline-offset:.18em;cursor:pointer}
.cv-jump:hover{color:var(--gold-x);text-decoration-style:solid}
@media (hover:none) and (pointer:coarse){.cv-jump{padding:10px 0}.cv-chip,.cv-now{min-height:44px}.cv-arrow{width:44px;height:44px}}
@media (max-width:760px){.cv-switch{max-width:20rem}}
@media (prefers-reduced-motion:reduce){.cv-chip,.cv-chip:hover,.cv-chip:active,.cv-arrow,.cv-arrow:hover,.cv-arrow:active{transform:none;transition:none}.upg-stage>.cs.cv-in{animation:none}}
/* ---------- "Changes by version": THE TIMELINE (cvChangesChap; Bean, 22 Sep 2026: "Use the dotted line in-between each change so it feels like a journey ...
   some illustration accents and more of a connection by connection to show the timeline would be nice, just don't make it too tall. Include illustrations.";
   the same evening: "Changes by version looks better now, but still reads as a data dump") ----------
   A dotted rail runs down the left of the whole list (.cvt-w, one rail through the first three notes AND the fold's summary, so a closed fold reads as the
   road going on); every change is a node on it: a round dark plate with one of the game's sprites (cardversions.js cvIco), or a plain dot for a generic
   change. Beside the node ONE GLANCE ROW (VERSIONS2, docs/wave5/versions2.md): the date as a small stamp in its own column, the change as pills (the stat
   word, old value, the game's gold upgrade arrow, new value: green for a buff, red for a nerf, amber for a plain change) or as its kind word plus a chip per
   item it names, the "Show that version" button, the branch tag at the right end. The sentence itself is .cvt-sent: visually hidden, opened by hovering the
   pills (CORE's tip box, .tp-cvt) and shown as a dim line under the row on a touch screen only. One line per change; nothing here changes size on hover. */
.cvt-w{--cvt-r:2.6rem;position:relative}
.cvt-w::before{content:"";position:absolute;left:calc(var(--cvt-r) / 2 - 2px);top:20px;bottom:18px;width:4px;background:radial-gradient(circle,rgba(255,255,255,.34) 1.4px,transparent 2px) 0 0/4px 9px repeat-y;pointer-events:none}
.cvt{list-style:none;margin:0;padding:0;container:cvt/inline-size}
.chap-b:has(>.cvt-w){max-width:64rem}
.cvt-n{margin:0;padding:0}
.cvt-c{display:grid;grid-template-columns:var(--cvt-r) minmax(0,1fr);gap:0 10px;align-items:start;padding:4px 0}
.cvt-c.cvt-more{padding:2px 0 3px}
.cvt-n+.cvt-n>.cvt-c.cvt-first{padding-top:7px}
.cvt-ico{position:relative;z-index:1;display:grid;place-items:center;justify-self:center;width:2.15rem;height:2.15rem;margin-top:0;border-radius:50%;background:radial-gradient(circle at 50% 35%,#2a3644,#141c25 78%);border:1px solid rgba(255,255,255,.18);box-shadow:0 2px 4px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.08)}
.cvt-ico img{width:1.45rem;height:1.45rem;object-fit:contain;filter:brightness(1.12) saturate(1.08) drop-shadow(0 1px 1px rgba(0,0,0,.7))}
.cvt-ico.i-dot{width:1rem;height:1rem;margin-top:9px;background:radial-gradient(circle at 50% 35%,#c9d3d8,#6b7a84 80%);border-color:rgba(0,0,0,.4)}
.cvt-ico.i-sound::before{content:"";width:1.25rem;height:1.25rem;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M4 9v6h4l5 4V5L8 9z' fill='%23fff'/%3E%3Cpath d='M16 8a5 5 0 0 1 0 8M19 5a9 9 0 0 1 0 14'/%3E%3C/svg%3E") center/contain no-repeat;filter:drop-shadow(0 1px 1px rgba(0,0,0,.7))}
.cvt>.cvt-n:first-child>.cvt-first>.cvt-ico{border-color:var(--acc,var(--blue));box-shadow:0 0 0 2px rgba(135,206,235,.22),0 2px 4px rgba(0,0,0,.55)}
.more-b .cvt>.cvt-n:first-child>.cvt-first>.cvt-ico{border-color:rgba(255,255,255,.18);box-shadow:0 2px 4px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.08)}
/* the second and later changes of one note: a smaller node, an empty date column so the pills line up under the first's */
.cvt-more .cvt-ico{width:1.6rem;height:1.6rem;margin-top:3px}.cvt-more .cvt-ico img{width:1.05rem;height:1.05rem}.cvt-more .cvt-ico.i-dot{width:.85rem;height:.85rem;margin-top:8px}
.cvt-b{position:relative;min-width:0}
/* THE GLANCE ROW: date stamp | pills or kind word + item chips | Show that version | branch tag (pushed to the right end); wraps when the row is too narrow */
.cvt-r{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;min-height:2.15rem}
.chap-b .cvt-d{flex:0 0 5.5rem;margin:0;font-family:var(--font-t);font-size:max(.76rem,11px);font-weight:400;letter-spacing:.04em;line-height:1.3;color:var(--dim);white-space:nowrap}
.cvt-d a{color:inherit;text-decoration:none}.cvt-d a:hover{color:var(--gold);text-decoration:underline}
.cvt-d0{display:block}
.cvt-g{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px 12px;min-width:0;border-radius:8px}
.cvt-g.hov{background:rgba(255,255,255,.04);box-shadow:0 0 0 4px rgba(255,255,255,.04)}
.cvt-s{font-family:var(--font-t);font-size:max(.74rem,11px);font-weight:700;letter-spacing:.12em;text-transform:uppercase;line-height:1.35;color:var(--blue);white-space:nowrap}
/* one fact: stat word, old pill, the game's gold upgrade-preview arrow, new pill */
.cvt-f{display:inline-flex;align-items:center;flex-wrap:wrap;max-width:100%;gap:5px}   /* a long field and its two values wrap inside the row instead of widening a phone's page (wave 6 QoL, enemies: the Axebot's "Hammer Uppercut move damage 12(14) 14(18)" pushed 390 px 30 px sideways) */
.cvt-f>.cvt-s{margin-right:2px}
.cvt-v{--fc:#9fb0b8;display:inline-flex;align-items:baseline;justify-content:center;min-width:1.9em;padding:2px 8px 3px;border-radius:7px;border:1px solid color-mix(in srgb,var(--fc) 62%,transparent);
  background:linear-gradient(color-mix(in srgb,var(--fc) 22%,#0f1c22),color-mix(in srgb,var(--fc) 10%,#0f1c22));box-shadow:0 2px 0 rgba(0,0,0,.5),inset 0 1px 0 color-mix(in srgb,var(--fc) 32%,transparent);
  color:color-mix(in srgb,var(--fc) 45%,#fff6e2);font-family:var(--font-t);font-weight:700;font-size:.95rem;line-height:1.1;white-space:nowrap;text-shadow:0 1px 0 rgba(0,0,0,.55)}
.cvt-v small{font-size:.74em;font-weight:400;opacity:.85;margin-left:2px}
.cvt-v.cvt-vw{font-weight:700;font-size:.86rem;letter-spacing:.01em}
.cvt-vo{--fc:#7d8b91}
.cvt-f[data-dir="up"] .cvt-vn{--fc:var(--green)}
.cvt-f[data-dir="down"] .cvt-vn{--fc:var(--red)}
.cvt-f[data-dir="mid"] .cvt-vn{--fc:var(--orange)}
.cvt-f[data-dir="none"] .cvt-vn{--fc:#d6e2e6}
.cvt-v[data-rar="basic"]{--fc:var(--r-basic)}.cvt-v[data-rar="common"]{--fc:var(--r-common)}.cvt-v[data-rar="uncommon"]{--fc:var(--r-uncommon)}.cvt-v[data-rar="rare"]{--fc:var(--r-rare)}.cvt-v[data-rar="ancient"]{--fc:var(--r-ancient)}
.cvt-arr{flex:none;width:.85rem;height:.85rem;background:url(/img/ui/cards/upgrade_preview/upgrade_arrow.webp) center/contain no-repeat;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
/* the item chips: the tag component with the item's own picture; the newest art note shows the item's picture as a small plate */
.cvt-g .tagc.cvt-item{min-height:1.55rem;padding:0 8px 0 6px;font-size:.82rem;gap:5px}
.cvt-g .tagc-plain.cvt-item .tagc-i{display:block;width:1.1rem;height:1.1rem;border-radius:3px}   /* tags.css hides a plain tag's icon; ours carries the item's picture */
.cvt-g .tagc.cvt-item .cvt-ii{background-size:cover}
.cvt-art{display:inline-grid;place-items:center;width:3.6rem;height:2.15rem;border-radius:6px;overflow:hidden;background:#101a21;border:1px solid rgba(255,255,255,.16);box-shadow:0 2px 3px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.06)}
.cvt-art img{width:100%;height:100%;object-fit:contain;padding:2px;box-sizing:border-box}
.cvt-art.is-cover img{object-fit:cover;padding:0}
.cvt-tag{font-family:var(--font-t);font-size:max(.7rem,11px);letter-spacing:.08em;text-transform:uppercase;line-height:1.3;color:var(--dim);padding-left:.7em;border-left:1px solid rgba(255,255,255,.18);white-space:nowrap}   /* a stamp, not a chip: the thin rule keeps it apart from the item chips */
.cvt-tag.is-pt{color:#cdb8ff}
.cvt-r .cv-jump{font-size:.86rem;white-space:nowrap}
/* the sentence: in the HTML for the tip box, screen readers and the export, off the screen on a device that can hover */
.cvt-sent{position:absolute;width:1px;height:1px;margin:0;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}
.cvt-sent a{color:var(--gold)}
@media (hover:none){.cvt-sent{position:static;display:block;width:auto;height:auto;overflow:visible;clip:auto;clip-path:none;white-space:normal;margin:1px 0 3px;font-size:.88rem;line-height:1.35;color:var(--dim);overflow-wrap:anywhere}}
/* the tip box with the sentence (cardversions.js cvTipHtml) */
.tip .tp-cvt{--rc:var(--blue)}
.tip .tp-cvt .tp-body{color:#fff6e2;max-width:24rem}
.tip .tp-cvt .tp-body a{color:var(--gold);text-decoration:none}
/* the fold: its summary stands in the text column so the rail runs past it ("N older" stops down the road) */
.cvt-w>details.more{margin:0;padding-left:calc(var(--cvt-r) + 10px)}
.cvt-w>details.more>summary{padding:6px 0 4px}
.cvt-w>details.more>.more-b{margin-left:calc(-1 * (var(--cvt-r) + 10px))}
.cvt-w>details.more[open]>summary{margin-bottom:2px}
.chap-b .cvc-foot{margin:10px 0 0;font-size:.9rem;line-height:1.4;color:var(--dim)}
/* a narrow chapter (a phone): the date stamp stays inline before the pills, the empty date column of a note's later changes goes */
@container cvt (max-width:30rem){.chap-b .cvt-d{flex:0 0 auto}.cvt-d0{display:none}.cvt-r{gap:3px 8px}}

/* ===== app/character.css ===== */
/* ===== the character page under its banner (wave 5, 22 Sep 2026; app/pages_characters.js characterPageW5; docs/wave5/characters.md 4 to 8; the How it plays plates, the
   picks and the History storybook reworked by CHARACTERS2 the same evening, docs/wave5/characters2.md) =====
   The banner is the box component (characters-index.css .chb.chb-page). Under it: the starting deck as fans, the character's own relics and potions in two housings
   (the potions' without a tagline), the "How it plays" banner (banner.css) dimmed and filled with plates, the pool preview (pages.js charPools, its rules kept below),
   Our picks (cards only), the prose chapters, the Defect's orbs, Goes well with and History as a storybook. The page's backdrop is the fixed room layer (core.js BG.pick: hero_room_<id>.webp); nothing is drawn inside the column for it. */
.charpage{--cc:var(--gold)}
.charpage[data-c="ironclad"]{--cc:var(--ironclad)}.charpage[data-c="silent"]{--cc:var(--silent)}.charpage[data-c="defect"]{--cc:var(--defect)}.charpage[data-c="necrobinder"]{--cc:var(--necrobinder)}.charpage[data-c="regent"]{--cc:var(--regent)}
/* the still's box on the page and on the directory (.charart: the live skeleton is drawn in it on hover, pages.js charAnim; a button for the keyboard and a tap) */
.charart{position:relative;display:block;line-height:0;cursor:pointer;border-radius:12px;-webkit-tap-highlight-color:transparent}
.charart>img{display:block}
.charart>img.ca-hide{animation:none}
.charart:focus-visible{outline:2px solid var(--gold);outline-offset:8px}
.charart .a3d-t:has(>canvas.ca-live)>.a3d-sheen{display:none}   /* art3d's rim light is cut to the still's shape; over the moving skeleton it would be a ghost */
/* the unlock line's colours (wp1pages.js charUnlockHtml: the game's own colour spans name the character the unlock needs) */
.rk-unlock .green{color:var(--silent)}.rk-unlock .orange{color:var(--regent)}.rk-unlock .pink{color:var(--necrobinder)}
.rk-unlock a{color:inherit;text-decoration:underline;text-decoration-color:color-mix(in srgb,currentColor 50%,transparent);text-underline-offset:.16em}

/* ---------- Starting deck: one row of fans (Bean: "Give the starting cards their own row, for strikes and defends slightly fan them out to show how many of them there are") ----------
   One fan per distinct card (charDeckRow): the copies stand in a row, each a step to the right of the last, turned a few degrees around a point under the fan and
   dropped a little towards the edges, so five Strikes read as five. A single card stands alone. The name and the count sit under the fan. A hovered copy rises
   over its neighbours (the card's own hover scales it, core.js); nothing else moves. */
.cdeck{margin-top:var(--stack)}
/* THE DECK IN THE CHARACTER'S HOUSING (Bean, 23 Sep 2026: "This looks like shit on the dedicated character pages too. Make this a cool section"): the plain chapter with
   its stripe and the fans pushed to the left gave way to the housing the relics and potions under it already wear (.cown, below: the game's dark plate in the character's
   colour, the icon in its socket). The fans stand spread across the whole plate on a pool of the character's light, each on its own shadow like cards laid on a table;
   the fan stays still under the pointer (the opening on hover was dropped: cards moving under the pointer made the hover jump; core.js picks the card by the fan's stack
   order); the name sits under it as the relic tiles' names do,
   the count in gold. The plate lets the turned cards and the card hover reach past its edge (overflow visible; the head keeps the rounded corners itself). */
.cdeck.cown{overflow:visible}
.cdeck .cown-h{border-radius:12px 12px 0 0}
@supports (container-type:inline-size){.cdeck-b{container:cdeck/inline-size}}
.cdeck-b{position:relative;display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-evenly;--dg:clamp(20px,2.4vw,40px);gap:18px var(--dg);padding:26px calc(var(--pad) + 16px) 20px;
  background:radial-gradient(60% 70% at 50% 62%,color-mix(in srgb,var(--cc) 16%,transparent),transparent 70%);border-radius:0 0 12px 12px}   /* the turned end cards of a fan reach past the fan's box: the extra side padding keeps them off the plate's edge */
.cdeck-pr{display:flex;align-items:flex-end;justify-content:space-evenly;gap:var(--dg);flex:1 1 auto;min-width:0}   /* a pair of fans (pages_characters.js charDeckRow): a row too narrow for four breaks two and two */
.cfan{--cw:7.8rem;--step:1.35rem;--tilt:4.5deg;--lift:14px;--c:calc(var(--i,0) - (var(--n) - 1)/2);display:flex;flex-direction:column;align-items:center;gap:10px;min-width:0}
.cfan-s{position:relative;isolation:isolate;height:calc(var(--cw)*1.4067 + var(--lift));width:calc(var(--cw) + (var(--n) - 1)*var(--step))}
.cfan-s::after{content:"";position:absolute;left:-6%;right:-6%;bottom:-10px;height:22px;z-index:-1;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.55),transparent)}   /* the fan's shadow on the plate */
.cfan-c{position:absolute;left:calc(var(--i)*var(--step));bottom:0;transform-origin:50% 130%;--c:calc(var(--i) - (var(--n) - 1)/2);
  rotate:calc(var(--c)*var(--tilt));translate:0 calc(var(--c)*var(--c)*1.6px)}
.cfan.one .cfan-c{rotate:0deg;translate:0 0}
.cfan.many{margin-inline:calc(var(--cw)*.16)}   /* the turned end cards swing about a sixth of a card past the fan's box: that room is kept so fans never touch when the row packs tight */
.cfan-c:hover,.cfan-c:has(.card.hov),.cfan-c:has(.card.settle){z-index:5}
.cfan-l{font-family:var(--font-t);font-weight:700;font-size:1.05rem;line-height:1.2;color:#fff6e2;text-shadow:0 2px 0 rgba(0,0,0,.55);white-space:nowrap}
.cfan-l b{color:var(--gold);font-size:1.15rem;font-variant-numeric:tabular-nums}
@media (max-width:760px){.cdeck-b{--dg:18px;gap:14px var(--dg);justify-content:center;padding:20px 12px 16px}.cfan{--cw:7rem;--step:1.15rem}}
@media (max-width:420px){.cfan{--cw:5.3rem;--step:.72rem;--tilt:3deg}.cdeck-b{padding:16px 8px 14px;--dg:14px;gap:12px var(--dg)}}

/* ---------- the character's own relics and potions: two housings on one row (Bean: "make it nice not the basic low opacity housing and left side color, make it matter
   and feel like the game. The relic itself and housing directly around it should stay the same") ----------
   A housing is the site's dark plate (the Lethal info plate's gradient) framed in the character's colour, a lit top edge and the colour washing in from the head, a head
   band with the game's icon in a socket, the title and the count. The tiles inside are the directories' housed tiles (tilehousing.css): the frame with the rarity gem
   and the name under it, nothing else; the maker's-mark head in the frame's corner is off here (it is the character's own page). */
.cown-row{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--gap);margin-top:var(--stack)}
.cown{position:relative;isolation:isolate;display:flex;flex-direction:column;min-width:0;border-radius:14px;border:2px solid color-mix(in srgb,var(--cc) 42%,var(--line));background:linear-gradient(#111d23,#0a1317);box-shadow:0 5px 0 rgba(0,0,0,.45);overflow:hidden}
.cown::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:radial-gradient(70% 55% at 0% 0%,color-mix(in srgb,var(--cc) 24%,transparent),transparent 72%),linear-gradient(rgba(255,255,255,.06),transparent 26%)}
.cown-h{display:flex;align-items:center;flex-wrap:wrap;gap:6px 12px;padding:10px var(--pad) 9px;border-bottom:1px solid color-mix(in srgb,var(--cc) 34%,rgba(255,255,255,.08));background:linear-gradient(90deg,color-mix(in srgb,var(--cc) 20%,transparent),transparent 72%)}
.cown-ico{--cut:7px;position:relative;isolation:isolate;flex:none;display:grid;place-items:center;width:2.7rem;height:2.7rem;filter:drop-shadow(0 3px 3px rgba(0,0,0,.45))}
.cown-ico::before,.cown-ico::after{content:"";position:absolute;inset:0;z-index:-2;clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut))}
.cown-ico::before{background:linear-gradient(180deg,#86a7b3,#34515c 22%,#101d23 62%,color-mix(in srgb,var(--cc) 70%,#0c161b))}
.cown-ico::after{inset:2px;--cut:6px;z-index:-1;background:radial-gradient(70% 34% at 50% 96%,color-mix(in srgb,var(--cc) 40%,transparent),transparent 72%),radial-gradient(90% 80% at 50% 38%,#1a2f38,#0b151a)}
.cown-ico img{display:block;width:1.9rem;height:1.9rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.65))}
.cown-h h2{margin:0;font-family:var(--font-t);font-weight:700;font-size:1.3rem;line-height:1.1;color:#fff6e2;text-shadow:0 2px 0 rgba(0,0,0,.55)}
.cown-tag{margin-left:auto;font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;line-height:1.2;color:color-mix(in srgb,var(--cc) 55%,#c9d3d6);text-shadow:0 1px 0 rgba(0,0,0,.5)}
.cown-b{flex:1 1 auto;display:grid;align-content:center;padding:16px var(--pad) 16px}
.cown-g.grid.icons{grid-template-columns:repeat(auto-fill,minmax(6.4rem,1fr));gap:16px 8px;justify-items:center;padding:0}
.cown-g .itemcell.housed .nm{margin-top:2px;font-size:.95rem}
.cown .ih-who{display:none}
@media (min-width:761px){.cown-row[data-n="2"]{grid-template-columns:minmax(0,1.9fr) minmax(0,1fr)}.cown-pot .cown-g.grid.icons{grid-template-columns:repeat(auto-fill,minmax(6.4rem,1fr))}}
@media (max-width:760px){.cown-h{padding:9px 12px 8px}.cown-b{padding:14px 10px}.cown-g.grid.icons{grid-template-columns:repeat(auto-fill,minmax(5.6rem,1fr));gap:14px 4px}}

/* ---------- "How it plays": the banner (banner.css .secban) in the character's colour, PLATES in its body (CHARACTERS2; Bean, 22 Sep 2026: "How it plays here has decent
   housing (however it is too bright). It still looks like a data dump I don't want to read though.") ----------
   The plate is dimmed here only (a dark wash over the slate face, the words untouched; the banner itself is CORE's). Inside: a chip row (the tag chip's plate, tags.css),
   then a grid of plates two to a row, each one glance: the picture at the left (the relic's 3D icon, a small card, or a game icon in the housing's socket), a small
   kicker, the name (a link with the site's hover) and ONE line, the game's own. The writer's paragraphs fold under the plates ("Keep reading"). Nothing moves on hover
   except what the site's own hovers move (the card's lift, the tip). */
.secban.chb-how::after{content:"";position:absolute;inset:calc(var(--sbw)*-.55);z-index:-1;pointer-events:none;border-radius:6px;background:rgba(5,10,13,.44)}
.secban.chb-how .secban-b{max-width:none;padding-right:8px}
.secban.chb-how .secban-ico img{width:2.4rem;height:2.4rem}
.chow-chips{display:flex;flex-wrap:wrap;gap:8px;margin:2px 0 12px}
.chow-c{--fc:color-mix(in srgb,var(--cc) 70%,#b9cbd0);font-size:.9rem;min-height:1.85rem;padding:0 11px 0 8px}
.chow-c b{color:#fff;font-size:1.02em}
.chow-chips a.chow-c{color:unset}   /* a chip that links reads like the others, no gold (Bean, 23 Sep 2026: "Besides all the yellow text on the strike, defend, card pool stuff. Since those are already clearly buttons I don't think they need the text yellow"); the housings a step darker the same day ("Maybe just a bit darker to fit the site theme") */
@media (hover:none) and (pointer:coarse){.chow-chips .chow-c{min-height:40px}}   /* a finger-sized chip on touch screens (QoL pass, 23 Sep 2026: 29 px before) */
.chow-c .tagc-i{width:1.15rem;height:1.15rem;object-fit:contain}
.chow-g{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.chow-p{display:flex;align-items:center;gap:14px;min-width:0;padding:10px 14px 10px 12px;border-radius:10px;border:1px solid color-mix(in srgb,var(--cc) 30%,var(--line));
  background:linear-gradient(rgba(23,40,47,.92),rgba(14,25,31,.96));box-shadow:0 3px 0 rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.06)}
.chow-i{--cut:8px;position:relative;isolation:isolate;flex:none;display:grid;place-items:center;width:3.4rem;height:3.4rem}
.chow-p:not(.is-card):not(.is-relic) .chow-i::before,.chow-p:not(.is-card):not(.is-relic) .chow-i::after{content:"";position:absolute;inset:0;z-index:-2;clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut))}
.chow-p:not(.is-card):not(.is-relic) .chow-i::before{background:linear-gradient(180deg,#86a7b3,#34515c 22%,#101d23 62%,color-mix(in srgb,var(--cc) 70%,#0c161b))}
.chow-p:not(.is-card):not(.is-relic) .chow-i::after{inset:2px;--cut:7px;z-index:-1;background:radial-gradient(70% 34% at 50% 96%,color-mix(in srgb,var(--cc) 40%,transparent),transparent 72%),radial-gradient(90% 80% at 50% 38%,#1a2f38,#0b151a)}
.chow-i>img{display:block;width:2.3rem;height:2.3rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.65))}
.chow-p.is-relic .chow-i{width:3.6rem;height:3.6rem}
.chow-p.is-relic .chow-i .relic,.chow-p.is-relic .chow-i .iconlink>.relic{width:3.6rem;height:3.6rem}
.chow-p.is-card .chow-i{--cw:4.4rem;width:4.4rem;height:calc(4.4rem*1.4067)}
.chow-p.is-card .chow-i .card{--cw:4.4rem}
.chow-t{display:flex;flex-direction:column;gap:2px;min-width:0}
.chow-k{font-family:var(--font-t);font-size:.7rem;letter-spacing:.13em;text-transform:uppercase;line-height:1.2;color:color-mix(in srgb,var(--cc) 62%,#c9d3d6)}
.chow-n{font-family:var(--font-t);font-size:1.12rem;line-height:1.2;color:var(--gold-x)}
.chow-n a{color:inherit;text-decoration:none}
.chow-n a:hover{text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--gold) 60%,transparent);text-underline-offset:.15em}
.chow-l{font-size:.95rem;line-height:1.38;color:var(--muted);text-wrap:pretty}
.chow-l .kw{color:var(--gold)}.chow-l .num{color:var(--blue)}.chow-l .green{color:var(--green)}.chow-l .red{color:var(--red)}
.chow-more{margin-top:12px}
.chow-more .more-b p{margin:0 0 .55em;line-height:1.5}
.chow-more .more-b p:last-child{margin-bottom:0}
@media (max-width:900px){.chow-g{grid-template-columns:minmax(0,1fr)}}
@media (max-width:640px){.chow-p{gap:10px;padding:8px 10px}.chow-i{width:2.9rem;height:2.9rem}.chow-i>img{width:2rem;height:2rem}.chow-p.is-card .chow-i{--cw:3.8rem;width:3.8rem;height:calc(3.8rem*1.4067)}.chow-p.is-card .chow-i .card{--cw:3.8rem}.chow-l{font-size:.92rem}}

/* ---------- the card pool preview (pages.js charPools), as before ---------- */
.charpool .chap-h .chap-t{flex:1 1 11rem;min-width:0}
.charpool-b{padding:2px calc(var(--pad) + 6px) 18px}
.charpool .chap-h .btn{margin-left:auto}
.pool-h{display:flex;align-items:baseline;gap:.5rem;margin:1rem 0 .15rem;font-size:1.15rem;color:var(--gold-x)}
.pool-h:first-child{margin-top:.3rem}
.pool-h .cnt{font-size:.85rem;color:var(--dim);font-family:var(--font-t)}
.charpool .grid.icons{padding:6px 0 2px}
.pooltile{--pc:var(--gold);flex:none;width:var(--cw);height:calc(var(--cw) * 1.4067);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.45rem;padding:.8rem;text-align:center;
  border-radius:calc(var(--cw) * .06);border:2px dashed color-mix(in srgb,var(--pc) 70%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--pc) 22%,transparent),rgba(0,0,0,.35));
  color:var(--text);font-family:var(--font-t);text-decoration:none;scroll-snap-align:start;transition:scale .22s cubic-bezier(.2,.7,.3,1),border-color .2s,background .2s}
.pooltile img{width:3.4rem;height:3.4rem;object-fit:contain;filter:drop-shadow(0 3px 3px rgba(0,0,0,.55))}
.pooltile b{font-size:1.35rem;color:#fff}
.pooltile span{font-size:.92rem;line-height:1.2;color:var(--gold-x)}
.pooltile:hover,.pooltile:focus-visible{scale:1.05;border-style:solid;border-color:var(--pc);background:linear-gradient(180deg,color-mix(in srgb,var(--pc) 34%,transparent),rgba(0,0,0,.3));text-decoration:none}
.charpool .shelf{padding-right:4.2rem;--sb-r:var(--sb-l);-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 3.5rem),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 3.5rem),transparent)}   /* the preview row runs off the right edge on purpose; a short fade says "there is more" */

/* ---------- Our picks: five numbered cards from the writer's "What to pick up", nothing under them (Bean, 22 Sep 2026: "just remove the explanatory text on our picks in general") ---------- */
.cpicks-b{padding:6px var(--pad) 18px}
@supports (container-type:inline-size){.cpicks-b{container:cpicks/inline-size}}
.cpicks-l{list-style:none;margin:0;padding:6px 0 0;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px 12px}
.cpick{--cw:8.6rem;position:relative;display:flex;flex-direction:column;align-items:center;min-width:0}
@supports (width:1cqi){.cpick{--cw:min(8.6rem,calc((100cqi - 48px)/5))}}
.cpick-n{position:absolute;left:calc(50% - var(--cw)/2 - 6px);top:-6px;z-index:2;width:1.6rem;height:1.6rem;border-radius:50%;background:var(--gold);color:#241600;font:700 .88rem/1.6rem var(--font-t);text-align:center;box-shadow:0 2px 0 rgba(0,0,0,.5);pointer-events:none}
@media (max-width:760px){.cpicks-l{grid-template-columns:repeat(3,minmax(0,1fr))}.cpick{--cw:min(8.6rem,calc((100cqi - 24px)/3))}}
@media (max-width:520px){.cpicks-l{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 10px}.cpick{--cw:min(8.6rem,calc((100cqi - 10px)/2))}.cpicks-b{padding:4px 10px 14px}}

/* ---------- Goes well with: the two stills face each other, the reasons between them (data/duos.json) ---------- */
.cduo-b{display:grid;grid-template-columns:minmax(7rem,13rem) minmax(0,1fr) minmax(7rem,13rem);align-items:center;gap:clamp(10px,2vw,28px);padding:10px var(--pad) 18px}
.cduo-fig{position:relative;display:flex;flex-direction:column;align-items:center;gap:8px;min-width:0;text-decoration:none;color:var(--text)}
.cduo-fig:hover{text-decoration:none}
.cduo-fig img{display:block;height:15rem;width:auto;max-width:100%;object-fit:contain;object-position:50% 100%;filter:drop-shadow(0 10px 8px rgba(0,0,0,.6))}
.cduo-fig.you{scale:-1 1}   /* the partner faces the character (the stills face right); the figure is a .showcase zone, so art3d tilts it on hover */
.cduo-mid{min-width:0;display:flex;flex-direction:column;align-items:center}
.cduo-vs{display:flex;align-items:baseline;justify-content:center;flex-wrap:wrap;gap:6px 12px;font-family:var(--font-d);font-size:1.5rem;line-height:1.1;color:var(--cc);text-shadow:0 2px 0 rgba(0,0,0,.6);text-align:center}
.cduo-vs i{font-style:normal;color:var(--gold);font-size:1.3rem}
.cduo-r{list-style:none;margin:12px 0 14px;padding:0;display:grid;gap:8px;width:100%;max-width:38rem}
.cduo-r li{padding:8px 14px 8px 14px;border-left:3px solid var(--gold);border-radius:0 8px 8px 0;background:rgba(0,0,0,.28);font-size:1rem;line-height:1.42;color:var(--text)}
.cduo-r li a{color:var(--gold-x)}
@media (max-width:760px){.cduo-b{grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-areas:"me you" "mid mid";gap:8px 12px}.cduo-fig.me{grid-area:me}.cduo-fig.you{grid-area:you}.cduo-mid{grid-area:mid}.cduo-fig img{height:11rem}}

/* ---------- History: a STORYBOOK, oldest first (CHARACTERS2; Bean, 22 Sep 2026: "History section should be oldest to newest if it already isn't. I wanted this section
   to read like a storybook more so ... same with the visuals it should be like a storybook") ----------
   An opener (a rule, "The story of", the name in the display face, the count of chapters and the eras), then the pages hanging from one gold thread: each page a dark
   plate with the epoch's portrait as its illustration (framed, the era under it) on the left, then on the right, then on the left again, the game's chapter number as
   the kicker, the title, the passage in the site's reading face with a drop cap. A phone stacks each page: the illustration over the words. Nothing moves; the
   portrait's hover is the timeline's own. */
.chist-b{padding:8px var(--pad) 22px}
.chist-book{position:relative;max-width:66rem;margin:0 auto}
.chist-open{display:flex;flex-direction:column;align-items:center;gap:6px;padding:6px 0 22px;text-align:center}
.chist-open::before{content:"";width:9rem;height:2px;margin-bottom:8px;background:linear-gradient(90deg,transparent,var(--gold) 30%,var(--gold) 70%,transparent)}
.chist-ok{font-family:var(--font-t);font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;color:var(--dim)}
.chist-ot{font-family:var(--font-d);font-weight:700;font-size:clamp(1.7rem,3.2cqi,2.4rem);line-height:1.05;color:var(--gold);text-shadow:0 2px 0 rgba(0,0,0,.65),0 0 16px rgba(0,0,0,.5)}
.chist-os{font-family:var(--font-t);font-size:.92rem;color:var(--muted)}
.chist-os a{color:var(--gold-x)}
.chist-l{list-style:none;margin:0;padding:0;display:grid;gap:22px}
.chist-p{position:relative;display:grid;grid-template-columns:minmax(10rem,15rem) minmax(0,1fr);grid-template-areas:"fig tx";align-items:center;gap:16px clamp(18px,3vw,34px);min-width:0;padding:18px clamp(16px,2.6vw,28px);
  border-radius:12px;border:1px solid var(--line);background:linear-gradient(100deg,rgba(23,40,47,.94),rgba(14,25,31,.97));box-shadow:0 4px 0 rgba(0,0,0,.4),inset 0 1px 0 rgba(255,255,255,.06)}
.chist-p:nth-child(even){grid-template-columns:minmax(0,1fr) minmax(10rem,15rem);grid-template-areas:"tx fig";background:linear-gradient(260deg,rgba(23,40,47,.94),rgba(14,25,31,.97))}
.chist-p+.chist-p::before{content:"";position:absolute;left:50%;top:-23px;width:2px;height:22px;background:linear-gradient(color-mix(in srgb,var(--gold) 60%,transparent),var(--gold));translate:-50% 0}   /* the thread from one page to the next */
.chist-fig{grid-area:fig;display:flex;flex-direction:column;align-items:center;gap:8px;margin:0;min-width:0}
.chist .ep-slot.hs{width:100%;box-shadow:0 0 0 4px #0b151a,0 0 0 5px rgba(255,255,255,.1),0 8px 16px rgba(0,0,0,.5)}
.chist-art{display:grid;place-items:center;width:100%;aspect-ratio:272/168;border-radius:9px;background:radial-gradient(60% 60% at 50% 45%,color-mix(in srgb,var(--cc) 26%,transparent),transparent 72%),#0d1a20;box-shadow:0 0 0 4px #0b151a,0 0 0 5px rgba(255,255,255,.1),0 8px 16px rgba(0,0,0,.5)}
.chist-art img{width:5.2rem;height:5.2rem;object-fit:contain;filter:drop-shadow(0 4px 4px rgba(0,0,0,.6))}
.chist-era{display:flex;align-items:center;justify-content:center;gap:7px;margin:4px 0 0;font-family:var(--font-t);font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;line-height:1.2;color:var(--dim)}
.chist-g{display:block;flex:none;width:1.35rem;height:1.35rem;background:#ffcc66;-webkit-mask:var(--g) center/contain no-repeat;mask:var(--g) center/contain no-repeat;filter:drop-shadow(0 1px 0 rgba(0,0,0,.55))}   /* the timeline's era glyph, drawn as the timeline draws it (potions.css .era-g) */
.chist-tx{grid-area:tx;display:flex;flex-direction:column;gap:4px;min-width:0}
.chist-ch{font-family:var(--font-t);font-size:.74rem;letter-spacing:.14em;text-transform:uppercase;color:color-mix(in srgb,var(--cc) 62%,#c9d3d6)}
.chist-t{margin:0;font-family:var(--font-d);font-weight:700;font-size:1.5rem;line-height:1.15}
.chist-t a{color:var(--gold-x);text-decoration:none}
.chist-t a:hover{text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--gold) 60%,transparent);text-underline-offset:.15em}
.chist-s{margin-top:4px;font-family:var(--font-d);font-size:1.05rem;line-height:1.58;color:var(--text);text-wrap:pretty}
.chist-s p{margin:0}.chist-s p+p{margin-top:.6em}
.chist-s p:first-child::first-letter{font-family:var(--font-d);font-weight:700;font-size:1.75em;line-height:.9;color:var(--gold);text-shadow:0 2px 0 rgba(0,0,0,.6)}   /* a raised initial, not a floated drop cap: many passages are one line long and a float would break "Another" into "A nother" */
.chist-s .red{color:var(--red)}.chist-s .num{color:var(--blue)}.chist-s .green{color:var(--green)}.chist-s .orange{color:var(--orange)}.chist-s .pink{color:var(--necrobinder)}.chist-s .purple{color:var(--purple)}.chist-s .gold,.chist-s .kw{color:var(--gold)}
.chist-s q{quotes:"\201C" "\201D";font-style:italic;color:#fff6e2}
.chist-p.sts1{border-color:color-mix(in srgb,var(--gold) 45%,var(--line))}
/* a narrow window: the illustration over the words, centred */
@media (max-width:640px){.chist-b{padding:6px 10px 16px}.chist-l{gap:18px}
  .chist-p,.chist-p:nth-child(even){grid-template-columns:minmax(0,1fr);grid-template-areas:"fig" "tx";gap:12px;padding:14px 12px 16px}
  .chist-fig{width:min(100%,14rem);margin:0 auto}
  .chist-t{font-size:1.3rem}.chist-s{font-size:1rem}.chist-art img{width:4.2rem;height:4.2rem}}
.charpage .chap-h .chap-t{flex:1 1 11rem;min-width:0}   /* every chapter's title block keeps its place beside the icon on a phone (the pool's rule, for all) */

/* ===== app/characters-index.css ===== */
/* ===== the character box: the /characters directory entry and the character page's banner (wave 5, 22 Sep 2026; app/pages_characters.js charBoxHtml; docs/wave5/characters.md 2 and 3,
   rebuilt by CHARACTERS2 the same evening: docs/wave5/characters2.md) =====
   Bean, 22 Sep 2026: "Each character box needs to span the whole width of the page, have the character in 3d, use the backgrounds we use on the top banner of the
   homepage in some creative way. Have the character name in big letter like on the choose a character screen in slay the spire 2 itself. Show basic info in the Main
   info boxes stylization ... a character explanation that is no more than 2 lines. And a button on the right ... The character needs its little section cutout within
   the box that it sits in". His second look, the same evening: "character directory is completely missing the background (which should be on each box itself with the
   place the character sits being a cut out that doesn't have the background). The spot that is cut out should feel like it's cut out of a solid object for the
   character to sit. There is also a bunch of empty height above each character."
   THE PLATE (section.chb): the Lethal banner's frame (a 2 px line, 16 px corners, the 6 px ledge) and the character's own character-select scene (hero_bg_<id>.webp, the
   home hero's file) ACROSS THE WHOLE PLATE, seen; a scrim stands behind the text column only (.chb-main::before), so the scene is the box and the words still read.
   THE SOCKET (.chb-sock, the rim; .chb-cut, the pit): an eight-sided window cut into the plate, no scene inside it: a bevelled metal rim (lit from the top left, dark at
   the bottom right, the tile housing's cut) around a dark pit with deep inset shadow under its top edge and a floor the still stands on; hovering it tilts the still
   (art3d: the pit is a .showcase zone) and plays a clip (.charart, pages.js). NO DEAD BAND: the pit takes the still's own proportions (--ar from CHAR_AR, width over
   height) so the figure fills 94 % of its height at every width; the pit is a size container and the still is sized in cqh, which holds when art3d moves the still into
   its wrapper. THE NAME: the select screen's lettering (character_select_screen.tscn: Spectral, gold EFC851, a black outline at 25 %): the display face in the site's gold
   with a dark halo, the "View Character" plate at its right. THE FACTS: the enemy page's boxes (factbox.css: one line each), two to a row so they fill the column's height
   instead of leaving it empty; the name stands at the top of the socket, the facts at its floor. Between 641 and 1180 px the socket is capped at 42 % of the box; a phone
   (640 px and under): the socket on top at a fixed height, then the name, the lines, the boxes two to a row and the plate as a full-width button. The page variant
   (.chb-page) is shorter, has no button and carries the "Begin your run with" kicker over the boxes; its scene is at low opacity (Bean's brief for the page banner).
   This file sorts BEFORE enemyturns.css and factbox.css in the bundle: the fact box overrides here carry two classes. */
.chb{--c:var(--gold);--ar:.75;--ch:clamp(20rem,38vh,24rem);--cw:min(calc(var(--ch)*var(--ar) + 14px),40%);--flr:8px;position:relative;isolation:isolate;container-type:inline-size;display:grid;grid-template-columns:var(--cw) minmax(0,1fr);grid-template-areas:"cut main";align-items:center;
  gap:0 clamp(16px,2.6vw,34px);padding:calc(clamp(14px,1.6vw,20px) + var(--flr)) clamp(16px,2vw,28px) clamp(14px,1.6vw,20px) clamp(14px,1.6vw,20px);border-radius:16px;border:2px solid color-mix(in srgb,var(--c) 40%,var(--line));background:#0b1418;
  box-shadow:0 6px 0 rgba(0,0,0,.45);overflow:hidden;transition:border-color .2s ease}
.chb:hover,.chb:focus-within{border-color:color-mix(in srgb,var(--c) 66%,var(--line))}
.chb-stack{display:grid;gap:clamp(14px,1.8vw,24px);margin-top:calc(var(--stack) + 4px)}
/* the scene: the home hero's file across the whole plate, seen (a light foot so the boxes at the bottom sit); the plate's own colour shows through only at the edges */
.chb-bg{position:absolute;inset:-3% -2.5%;z-index:-1;background-size:cover;background-position:50% 40%;opacity:.9;pointer-events:none}   /* a small bleed, clipped by the plate: the game's files have edges of their own (the Ironclad painting a 12 px transparent frame, the Regent's scene a torn dark strip down its left) that showed as bands (Bean, 22 Sep 2026: "The regent and the ironclad backgrounds arent fit to their boxes, it gets cutoff a bit") */
.chb-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(rgba(8,14,18,.06),rgba(8,14,18,.2) 60%,rgba(8,14,18,.46))}
.chb[data-c="ironclad"] .chb-bg{background-position:100% 28%}   /* the select painting: the Ironclad at its right, so he stands behind the text column, the flames toward the socket */
/* the page banner's scene is the directory's, at full strength (Bean, 23 Sep 2026: "they need to be the same as well"; it was .55 under a darker scrim) */
/* the socket: the rim is the tile housing's eight-sided cut in bevelled metal (lit top left, dark bottom right); the pit inside it is a dark well with the shadow of the rim
   under its top edge and a faint floor light where the still stands (the character's colour, 12 %, is the only colour in it) */
.chb-sockw{grid-area:cut;position:relative;z-index:1;align-self:start;min-width:0}   /* the socket plus the candle on its rim; the flame cannot live inside the clip-path. Top-aligned with the name: centred, it moved with the unlock line under the boxes (the Ironclad has none), so the five sockets sat at different heights (QoL pass, 23 Sep 2026) */
.chb-sock{--cut:16px;--tab:12px;position:relative;padding:calc(7px + var(--tab)) 7px 7px;min-width:0;
  clip-path:polygon(var(--cut) var(--tab),calc(50% - 19px) var(--tab),calc(50% - 11px) 0,calc(50% + 11px) 0,calc(50% + 19px) var(--tab),calc(100% - var(--cut)) var(--tab),100% calc(var(--tab) + var(--cut)),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 calc(var(--tab) + var(--cut)));   /* the rim rises in a small tab at the top centre: the candle's holder, cut from the same metal */
  background:linear-gradient(158deg,#7d97a4 0%,#3e5762 20%,#1c2b32 48%,#0a1216 76%,#2b3f48 100%)}
.chb-cut{--cut:12px;position:relative;isolation:isolate;container-type:size;display:flex;align-items:flex-end;justify-content:center;width:100%;aspect-ratio:var(--ar)/1.04;min-width:0;overflow:hidden;
  clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut));
  background:radial-gradient(90% 40% at 50% 100%,color-mix(in srgb,var(--c) 12%,#0d181e),transparent 70%),linear-gradient(#05090b,#0b1418 30%,#0e191f 100%);
  box-shadow:inset 0 0 0 2px #020405,inset 0 26px 34px -10px rgba(0,0,0,.95),inset 18px 0 28px -16px rgba(0,0,0,.8),inset -18px 0 28px -16px rgba(0,0,0,.8),inset 0 -10px 22px -8px rgba(0,0,0,.6)}
.chb-cut::after{content:"";position:absolute;left:8%;right:8%;bottom:0;height:16cqh;z-index:-1;pointer-events:none;background:radial-gradient(50% 60% at 50% 100%,rgba(0,0,0,.8),transparent 72%)}   /* the floor shadow under the feet */
/* the candle (Bean, 22 Sep 2026: "you know this animated candle you did on the top of ancient cards. Can we incorporate that here?"): the ancient banner's flame
   (cardancient.css .fire: the game's Fire AnimatedSprite2D, img/ui/card/ancient/flame_strip.webp, ten 49x69 frames at 10 fps), 20 px wide, seated in a holder that is
   part of the rim: the socket's metal rises in a small tab at the top centre (the --tab row of .chb-sock's clip-path) and the flame's base stands on the tab's
   metal with a small cyan light under it (a dark cup drawn under the base was Bean's "black circle" covering the tab: gone) (Bean's second look: "it would have to be incorporated into the frame, this is just lazily put on top. It should also be a
   lot smaller"). It burns all the time (five on the
   directory, one on a page: nothing measurable, unlike the 18 of the card list that cardancient3d.css pauses) and stands still under reduced motion. The box's top
   padding carries its headroom (--flr, .chb) so the plate's overflow:hidden never cuts the tip. Its own keyframes: anc-fire steps in the card's unit (--u). */
.chb-fire{--fw:20px;position:absolute;left:50%;top:0;z-index:3;width:var(--fw);height:calc(var(--fw)*69/49);translate:-50% calc(-100% + 19px);pointer-events:none;   /* the flame's body fills rows 15 to 57 of its 69-row cell (the rest is glow), 17 px at this size: 19 px of the cell over the tab centres the body on the tab's 12 px (Bean: "move it down so it's centered within its area") (Bean: "now its not over the area it should be its too high") */
  /* the flame in the character's colour (Bean, 22 Sep 2026: "make the candle lights the character colors for each one"): the sprite strip is the MASK (its alpha is
     the flame's shape, stepped through the ten frames as before) over a radial gradient, a white core at the flame's heart, the character's --c (set on .chb) at the
     edges; the glow and the light on the metal take the same colour. The light lives on the wrapper (.chb-sockw::after): inside the masked element it would be cut. */
  /* the body: a small white-hot heart, then the colour at full strength almost at once, a deeper shade at the edge (Bean, 22 Sep 2026: "make the inside of the candle
     (the diamond shape) a little more dynamic and saturated? It looks dull": the heart was a 9 % white disc fading through a half-white tint to the colour at 62 %,
     which read as a pale blob); the gradient is drawn larger than the cell and its size breathes (chb-flick) about a pinned centre, so the colour moves inside the stepping mask and the flame does not */
  background:radial-gradient(ellipse 58% 40% at 50% 64%,#fff 0 4%,color-mix(in srgb,var(--c) 84%,#fff) 15%,var(--c) 40%,color-mix(in srgb,var(--c) 76%,#000) 100%) 50% 64%/130% 130%;
  -webkit-mask:url(/img/ui/card/ancient/flame_strip.webp) 0 0/1000% 100% no-repeat;mask:url(/img/ui/card/ancient/flame_strip.webp) 0 0/1000% 100% no-repeat;
  animation:chb-fire 1s steps(10) infinite,chb-flick .85s ease-in-out infinite alternate;filter:saturate(1.35) drop-shadow(0 0 5px color-mix(in srgb,var(--c) 80%,#fff))}
/* the heart stays put (Bean: "It looks like its bouncing up and down now which I dont like"): the gradient is pinned at its own centre (position 50% 64% = the ellipse's
   centre, so a change of size scales about that point) and only its size breathes, so the colour bands widen and narrow inside the flame without the flame moving */
@keyframes chb-flick{0%{background-size:122% 124%}35%{background-size:140% 130%}70%{background-size:126% 144%}100%{background-size:136% 128%}}
.chb-sockw::after{content:"";position:absolute;left:50%;top:9px;z-index:2;width:56px;height:18px;translate:-50% -50%;border-radius:50%;pointer-events:none;background:radial-gradient(closest-side,color-mix(in srgb,var(--c) 32%,transparent),transparent)}   /* the light on the tab under the flame */
@keyframes chb-fire{to{-webkit-mask-position:calc(-10*var(--fw)) 0;mask-position:calc(-10*var(--fw)) 0}}
@media (prefers-reduced-motion:reduce){.chb-fire{animation:none}}
/* ===== THE RIM, CRACKED (all five boxes (Bean, 22 Sep 2026: "make the outer housing of each character on the character directory more "medieval" or detailed cool ...
   Make one really detailed and cool for ironclad and I will decide if you should do it for the rest"; on a housing drawn in CSS: "it looks pretty bad. To survive it would
   need to look like it came from the game"; on the game's chipped stone card frame tried next: "I think the added cracking / withered texture is good. Just revert to
   the old outline and put texture like that that makes it look a bit rough on it"). So: the bevelled rim and its candle tab above, unchanged, with the stone frame's own
   cracks laid over the metal (ui/home/rim_cracks_t/b/l/r.webp, extract/rim_texture.py: the dark lines that split the quest frame's lintel into chunks, lifted from the
   sprite and flattened onto the rim's 7 px, one strip along each edge with the chipped side out; a first overlay with the game's cloud noise as weathering was
   "a bunch of bright spots": gone) and the outer edge nicked here and there (the same polygon with small chips, none deeper than 2.2 px of the 7 px rim; the pit's
   edge stays straight). Tried on the Ironclad's box first, then all five (Bean: "sure"). The nicks keep clear of the candle's tab (none between 33 % and 66 % of the width, the tab is
   at 50 % +- 19 px) and the top strip is centred with a clear stretch under the tab, so the tab's foot joins the rim unbroken (Bean: "I just dont like how the little
   candle pillar is disconnected a little at the bottom edges"). Nothing moves on hover. ===== */
.chb .chb-sock{
  clip-path:polygon(var(--cut) var(--tab),20% calc(var(--tab) + 1px),27% var(--tab),33% calc(var(--tab) + 1.5px),
    calc(50% - 19px) var(--tab),calc(50% - 11px) 0,calc(50% + 11px) 0,calc(50% + 19px) var(--tab),
    66% calc(var(--tab) + 1px),73% calc(var(--tab) + .5px),80% calc(var(--tab) + 1.8px),86% var(--tab),92% calc(var(--tab) + 1px),
    calc(100% - var(--cut)) var(--tab),calc(100% - 1px) calc(var(--tab) + var(--cut)*.5 + 1px),100% calc(var(--tab) + var(--cut)),
    calc(100% - 1px) 14%,100% 22%,calc(100% - 1.6px) 31%,calc(100% - .6px) 40%,calc(100% - 2.2px) 47%,100% 55%,calc(100% - 1px) 64%,calc(100% - 1.8px) 73%,100% 81%,calc(100% - 1.2px) 89%,
    100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,
    88% calc(100% - 1.4px),80% 100%,70% calc(100% - 1px),60% calc(100% - 2px),50% calc(100% - .6px),40% calc(100% - 1.6px),30% 100%,20% calc(100% - 1.2px),
    var(--cut) 100%,0 calc(100% - var(--cut)),
    1.2px 88%,0 80%,1.8px 71%,.5px 62%,2px 53%,0 45%,1.4px 36%,.8px 28%,2.2px 20%,0 14%,
    0 calc(var(--tab) + var(--cut)));
  background:url(/img/ui/home/rim_cracks_t.webp) 50% var(--tab)/256px 7px repeat-x,url(/img/ui/home/rim_cracks_b.webp) 0 100%/256px 7px repeat-x,
    url(/img/ui/home/rim_cracks_l.webp) 0 0/7px 256px repeat-y,url(/img/ui/home/rim_cracks_r.webp) 100% 0/7px 256px repeat-y,
    linear-gradient(158deg,#7d97a4 0%,#3e5762 20%,#1c2b32 48%,#0a1216 76%,#2b3f48 100%)}
/* ===== THE CHARACTER HOUSINGS (23 Sep 2026; the directory only; images: extract/character_housing.py -> ui/home/housing/)
   Bean, 22 Sep 2026: "Make one really detailed and cool for ironclad and I will decide if you should do it for the rest. It shouldn't stand out too much, but it
   should carry detail"; 23 Sep: "try to make a border like I went back and fourth earlier ... for the character directory around ironclad". A design panel
   (docs/wave5/scratch/house/) chose the pieces under his verdicts (game pixels only, the accepted outline, cracks, tab and flame kept whole); he then rejected
   its lining in the pit ("only added to the inside of the box not the actual housing itself") and any thicker rim ("I dont want the width or anything edited,
   just the detail of it"), and kept the result for all five: "Okay keep this one, just make the colors of what you added unique for each character".
   Every added pixel comes from game files: the relic inspect frame (images/packed/inspect_relic_screen/relic_inspect_frame.png, the filigree the game draws
   round a relic when you inspect it) and the combat energy orbs (ui/combat/energy_counters/), each character's pieces in its own orb's colour (the extractor
   says which layer).
   THE CROWN, engraved into the metal under the candle: the inspect frame's top centre (swash, knot, swash) with the knot beside its mirror, so the flame's foot
   stands in the knots' V and the holder and the rim read as one piece (Bean on the candle: "it would have to be incorporated into the frame").
   THE SEAMS, cut into the rim's four chamfers: the Ironclad orb's forked seam, as dark cuts lit on their lower-right wall like the cracks; no colour, the same
   on all five. THE ENGRAVING, on the rim itself: the inspect frame's swashes and knots at a quarter of a CSS px per game px, cut into the 7 px bands (top
   swashes beyond the crown, the bottom knot pair between two swashes, one side run on each side); the rim keeps its width and outline; the pit stays clean.
   One layer list for all five; each box names its own images (--h-*: crown, top swashes, bottom pair and swashes, the two side runs). Nothing moves; no
   filter. The character page's banner wears the same housing (Bean, 23 Sep 2026: "We need to copy the character housing from the character directory to the dedicated character pages, they need to be the same as well"). ===== */
.chb[data-c="ironclad"]{--h-cr:url(/img/ui/home/housing/ironclad/crown.webp);--h-t:url(/img/ui/home/housing/ironclad/swash_t.webp);--h-tr:url(/img/ui/home/housing/ironclad/swash_t_r.webp);--h-p:url(/img/ui/home/housing/ironclad/pair_b.webp);--h-b:url(/img/ui/home/housing/ironclad/swash_b.webp);--h-br:url(/img/ui/home/housing/ironclad/swash_b_r.webp);
  --h-k:url(/img/ui/home/housing/ironclad/knot_s.webp);--h-su:url(/img/ui/home/housing/ironclad/swash_su.webp);--h-sl:url(/img/ui/home/housing/ironclad/swash_sl.webp);--h-kr:url(/img/ui/home/housing/ironclad/knot_s_r.webp);--h-sur:url(/img/ui/home/housing/ironclad/swash_su_r.webp);--h-slr:url(/img/ui/home/housing/ironclad/swash_sl_r.webp)}
.chb[data-c="silent"]{--h-cr:url(/img/ui/home/housing/silent/crown.webp);--h-t:url(/img/ui/home/housing/silent/swash_t.webp);--h-tr:url(/img/ui/home/housing/silent/swash_t_r.webp);--h-p:url(/img/ui/home/housing/silent/pair_b.webp);--h-b:url(/img/ui/home/housing/silent/swash_b.webp);--h-br:url(/img/ui/home/housing/silent/swash_b_r.webp);
  --h-k:url(/img/ui/home/housing/silent/knot_s.webp);--h-su:url(/img/ui/home/housing/silent/swash_su.webp);--h-sl:url(/img/ui/home/housing/silent/swash_sl.webp);--h-kr:url(/img/ui/home/housing/silent/knot_s_r.webp);--h-sur:url(/img/ui/home/housing/silent/swash_su_r.webp);--h-slr:url(/img/ui/home/housing/silent/swash_sl_r.webp)}
.chb[data-c="defect"]{--h-cr:url(/img/ui/home/housing/defect/crown.webp);--h-t:url(/img/ui/home/housing/defect/swash_t.webp);--h-tr:url(/img/ui/home/housing/defect/swash_t_r.webp);--h-p:url(/img/ui/home/housing/defect/pair_b.webp);--h-b:url(/img/ui/home/housing/defect/swash_b.webp);--h-br:url(/img/ui/home/housing/defect/swash_b_r.webp);
  --h-k:url(/img/ui/home/housing/defect/knot_s.webp);--h-su:url(/img/ui/home/housing/defect/swash_su.webp);--h-sl:url(/img/ui/home/housing/defect/swash_sl.webp);--h-kr:url(/img/ui/home/housing/defect/knot_s_r.webp);--h-sur:url(/img/ui/home/housing/defect/swash_su_r.webp);--h-slr:url(/img/ui/home/housing/defect/swash_sl_r.webp)}
.chb[data-c="necrobinder"]{--h-cr:url(/img/ui/home/housing/necrobinder/crown.webp);--h-t:url(/img/ui/home/housing/necrobinder/swash_t.webp);--h-tr:url(/img/ui/home/housing/necrobinder/swash_t_r.webp);--h-p:url(/img/ui/home/housing/necrobinder/pair_b.webp);--h-b:url(/img/ui/home/housing/necrobinder/swash_b.webp);--h-br:url(/img/ui/home/housing/necrobinder/swash_b_r.webp);
  --h-k:url(/img/ui/home/housing/necrobinder/knot_s.webp);--h-su:url(/img/ui/home/housing/necrobinder/swash_su.webp);--h-sl:url(/img/ui/home/housing/necrobinder/swash_sl.webp);--h-kr:url(/img/ui/home/housing/necrobinder/knot_s_r.webp);--h-sur:url(/img/ui/home/housing/necrobinder/swash_su_r.webp);--h-slr:url(/img/ui/home/housing/necrobinder/swash_sl_r.webp)}
.chb[data-c="regent"]{--h-cr:url(/img/ui/home/housing/regent/crown.webp);--h-t:url(/img/ui/home/housing/regent/swash_t.webp);--h-tr:url(/img/ui/home/housing/regent/swash_t_r.webp);--h-p:url(/img/ui/home/housing/regent/pair_b.webp);--h-b:url(/img/ui/home/housing/regent/swash_b.webp);--h-br:url(/img/ui/home/housing/regent/swash_b_r.webp);
  --h-k:url(/img/ui/home/housing/regent/knot_s.webp);--h-su:url(/img/ui/home/housing/regent/swash_su.webp);--h-sl:url(/img/ui/home/housing/regent/swash_sl.webp);--h-kr:url(/img/ui/home/housing/regent/knot_s_r.webp);--h-sur:url(/img/ui/home/housing/regent/swash_su_r.webp);--h-slr:url(/img/ui/home/housing/regent/swash_sl_r.webp)}
.chb:is([data-c="ironclad"],[data-c="silent"],[data-c="defect"],[data-c="necrobinder"],[data-c="regent"]) .chb-sock{
  background:var(--h-cr) 50% calc(var(--tab) - .5px)/87px 8px no-repeat,
    url(/img/ui/home/housing/seam16.webp) 0 var(--tab)/24px 24px no-repeat,url(/img/ui/home/housing/seam16_r.webp) 100% var(--tab)/24px 24px no-repeat,
    url(/img/ui/home/housing/seam16_b.webp) 0 100%/24px 24px no-repeat,url(/img/ui/home/housing/seam16_br.webp) 100% 100%/24px 24px no-repeat,
    var(--h-t) calc(50% - 74.5px) calc(var(--tab) + .5px)/27px 6.5px no-repeat,var(--h-tr) calc(50% + 74.5px) calc(var(--tab) + .5px)/27px 6.5px no-repeat,
    var(--h-p) 50% calc(100% - .5px)/16px 6.5px no-repeat,var(--h-b) calc(50% - 22px) calc(100% - .5px)/27px 6.5px no-repeat,var(--h-br) calc(50% + 22px) calc(100% - .5px)/27px 6.5px no-repeat,
    var(--h-k) .5px 50%/6.5px 8px no-repeat,var(--h-su) .5px calc(50% - 18.5px)/6.5px 26.5px no-repeat,var(--h-sl) .5px calc(50% + 18.5px)/6.5px 27px no-repeat,
    var(--h-kr) calc(100% - .5px) 50%/6.5px 8px no-repeat,var(--h-sur) calc(100% - .5px) calc(50% - 18.5px)/6.5px 26.5px no-repeat,var(--h-slr) calc(100% - .5px) calc(50% + 18.5px)/6.5px 27px no-repeat,
    url(/img/ui/home/rim_cracks_t.webp) 50% var(--tab)/256px 7px repeat-x,url(/img/ui/home/rim_cracks_b.webp) 0 100%/256px 7px repeat-x,
    url(/img/ui/home/rim_cracks_l.webp) 0 0/7px 256px repeat-y,url(/img/ui/home/rim_cracks_r.webp) 100% 0/7px 256px repeat-y,
    linear-gradient(158deg,#7d97a4 0%,#3e5762 20%,#1c2b32 48%,#0a1216 76%,#2b3f48 100%)}
@media (max-width:640px){.chb:is([data-c="ironclad"],[data-c="silent"],[data-c="defect"],[data-c="necrobinder"],[data-c="regent"]) .chb-sock{   /* the phone's socket has a 14 px chamfer: the seams laid on its own mitres */
  background:var(--h-cr) 50% calc(var(--tab) - .5px)/87px 8px no-repeat,
    url(/img/ui/home/housing/seam14.webp) 0 var(--tab)/24px 24px no-repeat,url(/img/ui/home/housing/seam14_r.webp) 100% var(--tab)/24px 24px no-repeat,
    url(/img/ui/home/housing/seam14_b.webp) 0 100%/24px 24px no-repeat,url(/img/ui/home/housing/seam14_br.webp) 100% 100%/24px 24px no-repeat,
    var(--h-t) calc(50% - 74.5px) calc(var(--tab) + .5px)/27px 6.5px no-repeat,var(--h-tr) calc(50% + 74.5px) calc(var(--tab) + .5px)/27px 6.5px no-repeat,
    var(--h-p) 50% calc(100% - .5px)/16px 6.5px no-repeat,var(--h-b) calc(50% - 22px) calc(100% - .5px)/27px 6.5px no-repeat,var(--h-br) calc(50% + 22px) calc(100% - .5px)/27px 6.5px no-repeat,
    var(--h-k) .5px 50%/6.5px 8px no-repeat,var(--h-su) .5px calc(50% - 18.5px)/6.5px 26.5px no-repeat,var(--h-sl) .5px calc(50% + 18.5px)/6.5px 27px no-repeat,
    var(--h-kr) calc(100% - .5px) 50%/6.5px 8px no-repeat,var(--h-sur) calc(100% - .5px) calc(50% - 18.5px)/6.5px 26.5px no-repeat,var(--h-slr) calc(100% - .5px) calc(50% + 18.5px)/6.5px 27px no-repeat,
    url(/img/ui/home/rim_cracks_t.webp) 50% var(--tab)/256px 7px repeat-x,url(/img/ui/home/rim_cracks_b.webp) 0 100%/256px 7px repeat-x,
    url(/img/ui/home/rim_cracks_l.webp) 0 0/7px 256px repeat-y,url(/img/ui/home/rim_cracks_r.webp) 100% 0/7px 256px repeat-y,
    linear-gradient(158deg,#7d97a4 0%,#3e5762 20%,#1c2b32 48%,#0a1216 76%,#2b3f48 100%)}}
.chb-cut .charart{position:relative;margin:0 0 3cqh;height:94cqh;max-width:100%;display:block;line-height:0;cursor:pointer;border-radius:12px;-webkit-tap-highlight-color:transparent;text-decoration:none}   /* on the directory it is the link to the page (a.chb-still) */
.chb-cut .charart img{display:block;height:94cqh;width:auto;max-width:92cqw;object-fit:contain;object-position:50% 100%;filter:drop-shadow(0 12px 10px rgba(0,0,0,.7))}   /* a descendant selector and container units on purpose: art3d moves the still into its wrapper on hover and the size must hold there; the still is 94 % of the pit, the pit has the still's proportions, so nothing is empty above the figure and art3d's lift (about 1.06) stays inside the window */
.chb-cut .charart:focus-visible{outline:2px solid var(--gold);outline-offset:6px}
.chb-cut .charart .a3d-t:has(>canvas.ca-live)>.a3d-sheen{display:none}   /* art3d's rim light is cut to the still's shape; over the moving skeleton it would be a ghost (character.css had the same rule for the old showcase) */
/* the copy column, as tall as the socket: the name (with the plate at its right) at the top, the two lines under it, the boxes at the socket's floor, the unlock line last;
   a scrim behind the column only, fading out toward the socket so the scene stays the box */
.chb-main{grid-area:main;position:relative;align-self:stretch;display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto minmax(10px,1fr) auto auto;grid-template-areas:"n n" "d d" "sp sp" "f f" "u go";align-items:center;gap:0 16px;min-width:0;padding:4px 0}   /* the plate stands under the boxes at the right, the unlock line at its left (Bean, 22 Sep 2026: "I think you should move the view character down here"; before that evening it stood centred beside the name) */
.chb-main::before{content:"";position:absolute;z-index:-1;top:-40px;bottom:-40px;left:-22px;right:-48px;pointer-events:none;
  background:linear-gradient(90deg,rgba(8,14,18,0) 0,rgba(8,14,18,.54) 9%,rgba(8,14,18,.64) 40%,rgba(8,14,18,.7) 100%)}
.chb-n{grid-area:n;margin:0;font-family:var(--font-d);font-weight:700;font-size:clamp(2rem,4.8cqi,3.9rem);line-height:1;letter-spacing:.012em;color:var(--gold);text-wrap:balance;
  text-shadow:0 3px 0 rgba(0,0,0,.7),0 0 2px rgba(0,0,0,.95),0 0 18px rgba(0,0,0,.75),0 0 44px rgba(0,0,0,.55)}
.chb-page .chb-n{font-size:clamp(2rem,4.4cqi,3.5rem)}
.chb-d{grid-area:d;margin:10px 0 0;max-width:56ch;font-size:1.14rem;line-height:1.48;color:#fff6e2;text-shadow:0 1px 0 rgba(0,0,0,.7),0 0 12px rgba(0,0,0,.5);text-wrap:pretty}
.chb-d .kw{color:var(--gold)}
.chb-k{grid-area:k;display:block;margin:14px 0 0;font-family:var(--font-t);font-size:.74rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;line-height:1;color:color-mix(in srgb,var(--c) 62%,#c9d3d6);text-shadow:0 1px 0 rgba(0,0,0,.6)}
/* the fact boxes: the enemy page's, two to a row (they fill the column instead of leaving it empty and the relic's name always shows whole); the label takes the character's colour */
.chb .ew-facts.chb-facts{grid-area:f;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));margin:12px 0 0;gap:10px}
.chb-k+.chb-facts{margin-top:8px}
.chb .chb-facts .ew-fact{flex:none;width:auto;max-width:none;min-width:0;padding:11px 14px 13px;background:linear-gradient(rgba(10,16,20,.9),rgba(5,9,12,.94))}   /* darker and near neutral on the directory only (Bean, 22 Sep 2026: "I know we have a style guide for the main info boxes, however I feel like the color doesn't fit here, can we make darken them a bit"): the boxes' teal ground fought the red, green and gold scenes behind them; border, type and layout unchanged */
.chb .chb-facts .ew-fact-t{font-size:1.1rem}
.chb .chb-facts .ew-fact-h{color:color-mix(in srgb,var(--c) 60%,#c9d3d6)}
.chb .chb-facts .ew-fact-t a{color:var(--text);text-decoration:none}
.chb .chb-facts .ew-fact-t a:hover{text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--gold) 60%,transparent);text-underline-offset:.15em}
.chb .chb-facts .ew-fact-t a b{color:#fff}
@media (hover:none) and (pointer:coarse){.chb .chb-facts .ew-fact-t{padding-block:11px;margin-block:-11px}.chb .chb-facts .ew-fact-t>a{display:inline-block;padding:11px 0;margin-block:-11px}}   /* the value links (the relic, the pool) reach 40 px under a finger without moving the box: the clip box grows with them (QoL pass, 23 Sep 2026) */
/* the unlock line: only for a character the game locks; the game's own sentence (wp1pages.js charUnlockHtml) with the lock from the statistics screen */
.chb-unlock{grid-area:u;margin:10px 0 0;font-size:.95rem;line-height:1.35;color:var(--muted);text-shadow:0 1px 0 rgba(0,0,0,.6)}
.chb-unlock .rk-unlock{display:inline-flex;align-items:flex-start;gap:8px}
.chb-unlock .rk-unlock img{width:1.25rem;height:1.25rem;object-fit:contain;opacity:.9;flex:none;margin-top:1px}
.chb-unlock .rk-unlock>span{display:inline}
.chb-unlock-none{visibility:hidden}.chb-unlock-none .rk-unlock::before{content:"";width:1.25rem;height:1.25rem;flex:none;margin-top:1px}   /* the reserved row: the padlock's box and one line of text, nothing shown */
.chb-unlock .green{color:var(--silent)}.chb-unlock .orange{color:var(--regent)}.chb-unlock .pink{color:var(--necrobinder)}
.chb-unlock a{color:inherit;text-decoration:underline;text-decoration-color:color-mix(in srgb,currentColor 50%,transparent);text-underline-offset:.16em}
@media (hover:none) and (pointer:coarse){.chb-unlock a{padding-block:11px}}   /* the character link in the unlock line: vertical padding on an inline link grows its tap area, not the line (QoL pass, 23 Sep 2026: 18 px) */
/* the plate at the right (Bean: "a button on the right", "'View Page' here should say 'View Character'"), centred between the top of the box and the fact boxes
   (Bean, 22 Sep 2026: "center the view character box in the middle of the top of the box and the below info texts") */
.chb-go{grid-area:go;align-self:center;justify-self:end;margin-top:22px;padding:0 0 0 4px}   /* 22 px between the boxes and the plate: the spacer row above the boxes gives it up, the plate stays put (Bean: "These are too close together where I've circled. However we cant move them down anymore, so move up") */
.chb-unlock{margin-top:22px}
.chb-go .btn{white-space:nowrap}   /* the glossary's "Learn more" plate as it is, grey and small (Bean, 23 Sep 2026: "Make the "View Character" button like the "Learn more"
   one on other pages, the grey variation of the same button please"; it was gold and a size up) */
/* the page banner: shorter, the crumbs stand over it, no button */
.chb-page{--ch:clamp(20rem,38vh,24rem);margin-top:2px}   /* the directory's socket: with the HP line under the name the page's text column is as tall as a directory box, and the smaller socket (32vh) ended 59 px above the boxes (QoL pass, 23 Sep 2026) */
.chb-page .chb-main{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto minmax(6px,1fr) auto auto auto;grid-template-areas:"n" "d" "sp" "k" "f" "u"}
/* a narrower window: the socket is capped at 42 % of the box (the pit keeps the still's proportions, so it just gets smaller) */
@media (max-width:1180px) and (min-width:641px){.chb{--ch:clamp(17rem,38vh,22rem);--cw:min(calc(var(--ch)*var(--ar) + 14px),42%)}.chb-page{--ch:clamp(18rem,40vh,24rem)}}   /* the page banner's column holds three rows of boxes here, so its socket may be as tall as the directory's */
/* a column under about 40rem: the relic's box and the pool's box each take a whole row (two to a row cut "Ring of the Snake"); Health and Gold still share one */
@media (max-width:1180px){.chb .chb-facts .ew-fact:nth-child(3),.chb .chb-facts .ew-fact:nth-child(4){grid-column:1/-1}}
/* a phone: the socket over the copy at a fixed height (the whole width, the figure centred on its floor), boxes two to a row, the plate the full width under everything */
@media (max-width:640px){
  .chb,.chb-page{--ch:clamp(13rem,40vh,18rem);grid-template-columns:minmax(0,1fr);grid-template-areas:"cut" "main";gap:12px 0;padding:calc(12px + var(--flr)) 12px 12px}
  .chb-sock{--cut:14px}
  .chb-sockw{align-self:stretch}
  .chb-cut{aspect-ratio:auto;height:var(--ch)}
  .chb-main{grid-template-columns:minmax(0,1fr);grid-template-rows:none;grid-template-areas:"n" "d" "k" "f" "u" "go";align-self:auto}
  .chb-main::before{top:-14px;bottom:-14px;left:-14px;right:-14px;background:linear-gradient(rgba(8,14,18,.55),rgba(8,14,18,.78) 40%,rgba(8,14,18,.82))}
  .chb-n{font-size:clamp(1.9rem,9cqi,2.8rem)}
  .chb-page .chb-n{font-size:clamp(1.8rem,8.5cqi,2.6rem)}
  .chb-d{font-size:1rem}
  .chb .chb-facts .ew-fact{padding:8px 10px 9px}
  .chb-go{justify-self:stretch;margin-top:14px;padding:0}
  .chb-go .btn{width:100%}
  .chb-bg{background-position:50% 30%}}
@media (max-width:420px){.chb .chb-facts .ew-fact-t{font-size:.96rem}.chb .chb-facts .ew-fact-t b{font-size:1.15rem}}
/* the directory page */
.charidx .lead{max-width:60ch}
.charpage h2[id]{scroll-margin-top:calc(var(--tb-h) + 14px)}   /* a link to a chapter (characters/ironclad#Relics, the banner's deck count) stops under the sticky top bar */

/* HP UNDER THE NAME (Bean, 23 Sep 2026: "You have to put the hp below the name on the character homepage"): the name and the HP line share the name's grid area;
   three boxes remain, Gold and Card pool side by side and the starting relic across the full width */
.chb-nw{grid-area:n;min-width:0}
.chb-hp{margin:10px 0 0}
.chb-hp .ew-fact-row{display:inline-flex;align-items:center;gap:10px}
.chb-hp .ew-fact-i{width:40px;height:40px}
.chb-hp .ew-fact-t{position:relative;padding-right:1.6rem;font-size:1.35rem;color:#fff6e2;text-shadow:0 1px 0 rgba(0,0,0,.7),0 0 12px rgba(0,0,0,.5)}
.chb-hp .ew-fact-t b{color:#fff}
.chb .chb-facts .ew-fact:last-child:nth-child(odd){grid-column:1/-1}

/* ===== app/climb.css ===== */
/* ===== Today's Daily Climb (app/daily.js climbPage / climbFill; wave 4, WP6, 21 Sep 2026: docs/wave4/wp6-progress-reference.md) =====
   Bean's design law for wave 4: info boxes look like the enemy page's Health / Gold boxes ("large 3d icon etc. ... We should be consistent across the site with this design
   law"). The climb's facts and its three modifiers are factBox / factRow (pages_acts.js; their look is enemyturns.css .ew-facts / .ew-fact, bundled after this file, so every
   rule here is scoped under .climbpage to out-rank it). Six facts stand as two even rows of three (three rows of two where the column is narrow: beside the rail at 1000px, on a phone).
   THE MODIFIERS ARE A ROW OF THEIR OWN under the portrait and the facts (wave 5, 22 Sep 2026; overview audit D7, D8: in the facts column they stacked one word per row beside
   the rail at 1000 px, and at 1345 they pushed that column 130 px past the portrait). .climb-modsec spans the hero's two columns; the three boxes stay three across down to
   700 px and go one per row under it (a modifier's box holds an icon and a name; a third of a phone is too narrow for "Night Terrors"). The portrait's column is now exactly
   the two rows of facts and the art is centred on them, no band. No ragged last row, no box stretched over an empty band.
   The box is filled in the browser (the export keeps the neutral placeholder), so nothing here shifts a pre-rendered page. */
.climbpage .climb-hero{grid-template-columns:auto minmax(0,1fr);align-items:center}
.climbpage .climb-who{display:flex;align-items:center;justify-content:center;min-width:6.5rem}
.climbpage .climb-who .creature{max-height:11rem}
.climbpage .climb-main{min-width:0}
.climbpage .climb-modsec{grid-column:1/-1;min-width:0}
.climbpage .climb-facts,.climbpage .climb-mods{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:0}
.climbpage .climb-facts{grid-template-columns:repeat(auto-fit,minmax(min(100%,max(13.5rem,calc((100% - 20px)/3))),1fr))}   /* never more than three across (a column is at least a third of the row), two beside the rail at 1000px: six boxes never leave a part row, and the seed always fits its box */
.climbpage .ew-fact-t b a{color:inherit}
.climbpage .ew-fact-t b a:hover{color:var(--gold)}
.climbpage .climb-seed{font-size:1.02rem;letter-spacing:0;white-space:nowrap}
.climbpage #climb-cd{font-variant-numeric:tabular-nums}
.climbpage .climb-h{margin:4px 0 8px;font-size:1.15rem;color:var(--gold-x)}
/* good and bad: the box keeps the site's look, a lit top edge and the label say which (colour is never the only signal: the label reads "Good modifier" / "Bad modifier") */
.climbpage .climb-mod{--mc:#6fd08c;position:relative;overflow:hidden}
.climbpage .climb-mod.bad{--mc:#ff8f6b}
.climbpage .climb-mod::after{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:linear-gradient(90deg,transparent,var(--mc) 30%,var(--mc) 70%,transparent);opacity:.85;pointer-events:none}
.climbpage .climb-mod .ew-fact-h{color:color-mix(in srgb,var(--mc) 62%,var(--dim))}
.climbpage .climb-mod .ew-fact-row{align-items:flex-start}
.climbpage .climb-mod .ew-fact-t small{margin-top:3px;font-size:.92rem;color:var(--text)}
.climbpage .climb-note{margin:12px 2px 0;font-size:.95rem;color:var(--muted)}
@media (max-width:760px){
  .climbpage .climb-hero{grid-template-columns:minmax(0,1fr)}
  .climbpage .climb-who .creature{max-height:8.5rem}
}
@media (max-width:700px){.climbpage .climb-mods{grid-template-columns:minmax(0,1fr)}}
@media (max-width:640px){
  .climbpage .climb-facts{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .climbpage .climb-facts .ew-fact{padding:8px 10px 10px}
  .climbpage .climb-facts .ew-fact-row{gap:8px}
  .climbpage .climb-facts .ew-fact-i{width:2.2rem;height:2.2rem}
  .climbpage .climb-seed{font-size:.92rem}
}

/* ===== app/creatureanim.css ===== */
/* ===== creature animation player (creatureanim.js, docs/wave3/creature-anim.md) =====
   The canvas is the creature's whole frame box (lunges, weapon trails and deaths reach well past the still), so it overflows
   the still on purpose: the stage must not clip it (no overflow:hidden on the creature's wrappers), and the still needs a
   positioned ancestor. It never takes part in layout or hit testing; the still keeps both. Geometry (left, top, width,
   height) is set inline; the player ends the canvas at the page's right edge, so it never widens the page. */
.ca-canvas{position:absolute;display:block;margin:0;padding:0;border:0;max-width:none;max-height:none;pointer-events:none;-webkit-user-select:none;user-select:none;opacity:0;
  filter:drop-shadow(0 6px 6px rgba(0,0,0,.55))}
.ca-canvas.ca-live{opacity:1}
/* the still stays for layout while frames draw; visibility (not display) so its box and the alt text survive */
img.ca-hide{visibility:hidden!important}
@media (prefers-reduced-motion:reduce){.ca-canvas:not(.ca-asked){display:none}img.ca-hide:not(.ca-asked){visibility:visible!important}}   /* a clip the visitor asked for (.ca-asked, creatureanim.js mount opts.asked) still shows */

/* ===== app/dailyhub.css ===== */
/* ===== the daily pages' "Full rules" expander (daily.js rulesFoldHtml; wave 4, docs/wave4/daily.md) =====
   Bean, 21 Sep 2026: "'Full rules' on How the daily works should be maybe a more properly designed expander, I understand a dropdown like should be simpler, but something about
   it feels wrong, its also given a litte too much height to sit on it's own. Let's move it to the far right and have it on the same line as the explanatory text in this box,
   doesn't need its own space, we can wrap around the explanatory text a bit earlier anyway."
   The control is the <summary> of a native <details> (so it works with no script and the rules stay in the HTML), dressed as the site's small plate button (.btn.sm, buttons.css)
   with a chevron that turns. It takes no row: .rf-hole is an empty float of the button's size in the block's top right corner and the summary is lifted onto that spot, so the text
   wraps a little earlier beside the button and runs the full width again below it. The panel opens under the text; its height is animated by the listener in daily.js (Web
   Animations; under reduced motion, or without script, the native toggle answers at once). Used by the three daily pages' rule boxes (hub, Card of the day, Daily Climb). */
.rf-wrap{position:relative;--rfw:9.7rem;--rfh:2.5rem}
.rf-wrap::after{content:"";display:block;clear:both}
.rf-hole{float:right;width:var(--rfw);height:var(--rfh);margin:0 0 4px clamp(14px,2.4vw,28px)}
.rf-wrap>p{margin:0}
.rulesfold>summary{list-style:none}
.rulesfold>summary::-webkit-details-marker{display:none}
.rulesfold>summary.rf-btn{position:absolute;top:3px;right:3px;box-sizing:border-box;min-width:calc(var(--rfw) - 6px);gap:9px}   /* --rfw comes from the label's length (rulesFoldHtml), so the hole and the plate agree */
.rf-chev{flex:none;width:.5em;height:.5em;margin:-.22em 1px 0 0;border:solid currentColor;border-width:0 2.5px 2.5px 0;rotate:45deg;filter:drop-shadow(1px 1px 0 var(--ink));transition:rotate .3s cubic-bezier(.2,.8,.2,1),margin .3s}
.rulesfold[open]:not(.closing) .rf-chev{rotate:225deg;margin-top:.2em}
.rf-body{clear:both;overflow:hidden}
.rf-body>:first-child{margin-top:14px;padding-top:12px;border-top:2px solid rgba(255,255,255,.08)}
.rf-body>:last-child{margin-bottom:2px}
.rf-body ul{margin-bottom:0;padding-left:1.25em}
.rf-body li+li{margin-top:6px}
.rf-body p{margin:0}.rf-body p+p{margin-top:10px}
@media (max-width:640px){.rf-hole{margin-left:12px}}
@media (hover:none) and (pointer:coarse){.rf-wrap{--rfh:3rem}}
@media (prefers-reduced-motion:reduce){.rf-chev{transition:none}}

/* ===== app/dailyplate.css ===== */
/* ===== the daily games' housing: Card of the day (.cgroom, .cg-tabs, .cg-plate) and Lethal (.lzroom, .dg-tabs, .dg-plate) wear the same one =====
   Moved here from cardguess.css (wave 6, 23 Sep 2026; docs/wave6/guess.md, docs/wave6/lethal.md) so the two games read as one family. The old rounded room box
   (style.css .room) gave way to the plate every section wears since 23 Sep (plate.css, banner.css: the game's settings tab, ui/settings_tab_selected, as a
   nine-slice at 20 px, the dark wash, the 5 px ledge), pulled 4 px past the column like the rules banner under it. Daily and Practice were the settings screen's
   own tabs over the plate until 23 Sep 2026 evening; they are the title row's game toggle now (below). The ledge's shadow is drawn on the plate's own layer, so the animated game inside never repaints a filter. The day's number is the sticker
   beside the page title (h1row + dayMarkHtml), so the tab says "Daily" alone. */
.cgroom,.lzroom{position:relative;margin-top:6px}
.lzroom{container-type:inline-size}   /* .cgroom is the cg container (cardguess.css); the narrow rules below ask whichever holds the plate */
/* Daily / Practice sit at the right end of the title row, on one line with the title and the day sticker (Bean, 23 Sep 2026: "The daily and practice buttons
   both look bad here, they also need to be moved to the right side of the game not on the left, that way the title can be moved down and everything is o one line"):
   the site's one game toggle (.upg-toggle.game in buttons.css: the card pages' Base / Upgraded plates, the Rankings' board switch), each plate as wide as its word.
   A narrow title row wraps it to a line of its own, still at the right. */
.ptitle-row .dg-mode{margin-left:auto;align-self:center;flex:none;display:flex;gap:8px 12px;padding:0}
.dg-mode button{width:auto;min-width:6.75rem;height:3.27rem;aspect-ratio:auto;padding:0 1.15rem .1rem 1.45rem;white-space:nowrap}
.cg-plate,.dg-plate{position:relative;isolation:isolate;margin:0 -4px;padding:24px 24px 20px}
:is(.cg-plate,.dg-plate)::before{content:"";position:absolute;inset:0;z-index:-2;pointer-events:none;border:20px solid transparent;border-image:url(/img/ui/settings_tab_selected.webp) 40 fill / 20px / 0 round;filter:drop-shadow(0 5px 0 rgba(0,0,0,.5))}
:is(.cg-plate,.dg-plate)::after{content:"";position:absolute;inset:9px;z-index:-1;pointer-events:none;border-radius:6px;background:linear-gradient(rgba(255,255,255,.04),rgba(255,255,255,0) 38%,rgba(0,0,0,0) 62%,rgba(0,0,0,.22)),linear-gradient(rgba(0,0,0,.54),rgba(0,0,0,.54))}
/* narrow: measured on the housing itself, because the rail takes its share of the window first */
@container (max-width:35rem){
  .cg-plate,.dg-plate{padding:18px 12px 14px}
  :is(.cg-plate,.dg-plate)::before{border-width:16px;border-image-width:16px}
}

/* ===== app/daymark.css ===== */
/* ---------- the daily's number: a sticker made of the game's run badge ----------
   Bean, 17 Sep 2026: "#3 feels out of place ... good info to show the user, but not displayed in a way that feels like the game, just floating boring text", then,
   of a slate top-bar chip: "it should feel more like a badge or sticker that says the day, that's it". So it is the run summary's medallion (ui/game_over_screen/badge_gold,
   drawn tilted in the sprite) with DAY over the number. Static, not a button.
   DARK SINCE 21 SEP 2026 (Bean: "The 'Day 7' icon used next to the title and in the lethal card illustration both don't fit the website. That map beige color we have manually
   removed from many spots on the site, now that we've modernized the rest of the site it feels out of place. If we can get a darker colored icon that looks more modern and fits
   all the changes we've been making"). The sprite is now img/ui/daily/daymark.webp (extract/daily_art.py): the same badge, its beige face repainted ink slate (the Lethal card's
   info plate colours), the painted rim kept and pulled to the site's gold, written at 2x. On the dark face the figures need no outline: DAY in the site's gold, the number in the
   title font in the cream-to-gold ink of the Lethal logo, and a faint gold halo so the rim reads as lit. Still a badge / sticker, never a flat chip. Markup and box sizes are the
   17 Sep ones (core.js dayMarkHtml: span.daymark > span.dm-l + b.bignum; 60 px, 46 px beside a title, 66 / 52 px on the banner), so whoever hosts it needs no change.
   Runner-ups kept for Bean in docs/wave4/daily.md (the game's own lemon rim without the halo, a warm lacquer face, a teal face, the game's silver badge, an octagonal seal, a calendar leaf). */
.daymark{position:relative;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;flex:none;width:60px;height:60px;vertical-align:middle;
  background:center/contain no-repeat;rotate:-5deg;filter:drop-shadow(0 3px 0 rgba(0,0,0,.5)) drop-shadow(0 0 7px rgba(239,200,81,.26));font-family:var(--font-t);font-weight:700;color:#ffe9b0;line-height:1;text-align:center;
  text-shadow:0 1px 0 rgba(0,0,0,.75)}
.daymark .dm-l{font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;margin-top:5px;color:#efc851}
.daymark .bignum{font-size:1.45rem;margin-top:-1px;font-style:normal;letter-spacing:0;color:#ffe9b0}
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .daymark .bignum{background:linear-gradient(#fff6e2 18%,#ffe08a 58%,#e9b83e);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:none;filter:drop-shadow(0 1px 0 rgba(0,0,0,.8))}}
/* beside a section title: a touch smaller and tucked against the words (Bean: "slightly smaller and slightly closer to the daily puzzles text"); the row's
   18 px gap is eaten by the negative margin */
.ptitle-row .daymark,.dl-head .daymark{width:46px;height:46px;margin:-4px 0 -2px -8px}
.ptitle-row .daymark .bignum,.dl-head .daymark .bignum{font-size:1.12rem}
.ptitle-row .daymark .dm-l,.dl-head .daymark .dm-l{font-size:.5rem;margin-top:4px}
/* the small sticker in the Lethal result pop-up's verdict line (app/lethalresult.js lrDay: beside "Clean line" under the ribbon) */
.daymark.lr-day{width:46px;height:46px;margin:-6px 0;rotate:-6deg}
.daymark.lr-day .dm-l{font-size:.48rem;margin-top:3px}
.daymark.lr-day .bignum{font-size:1.08rem}
/* the sticker on the Lethal banner: stuck in the top-left corner of the frame, over the art */
.lethalbanner>.daymark{position:absolute;top:10px;left:12px;z-index:4;width:66px;height:66px;rotate:-8deg}
@media (max-width:640px){.lethalbanner>.daymark{top:6px;left:8px;width:52px;height:52px}.lethalbanner>.daymark .bignum{font-size:1.2rem}.lethalbanner>.daymark .dm-l{font-size:.52rem}}

/* ===== app/detailpage.css ===== */
/* ---------- the dedicated item page: cards and relics (build/app/detailpage.js; docs/wave4/detail.md; wave 5 docs/wave5/cardpage.md; Bean, 21-22 Sep 2026) ----------
   Every rule is .dp-* / .syn-*; the fact boxes are the enemy page's (.ew-fact, enemyturns.css) and CORE's one-line law (factbox.css), only LAID OUT here: no
   font, icon or wrap override of a fact remains (wave 5 CARDPAGE 7: the icon cell is 2.7rem on every page, the sub line is the hover). */

/* a relic's showcase is one icon, its info column is the long one: the panel takes the row's height and keeps the icon in its middle, so there is no empty band
   under a short panel (a card's showcase, with the toggle and the versions under the card, is left alone) */
.hero:has(>.infocol .dp-factwrap)>.showcase:not(:has(.upg-stage)){align-self:stretch;justify-content:center}
/* THE RELIC'S HOUSING (wave 5, 22 Sep 2026; Bean: "Relic pages get the housing back"): the directory's eight-sided slot (tilehousing.css .ih-slot, directories.js
   houseSlot) scaled up as the potion page does it (potions.css .pt-bigslot): the cut corner grows with the frame, the rim keeps its width, the gem is twice its
   size and hangs on the lower edge; the colours are the relic's rarity (the tile's, the chip's and the tip's are the same variables). Hovering the icon lights the
   well and the gem (core.js setHover puts .hov on the icon; tilehousing.css :has(.hov)). Hover changes colours only, never a size. */
.dp-rshow{padding:1.4rem 1rem 1.7rem}
.dp-bigslot{--rc:#7d8b91;display:grid;place-items:center}
.dp-bigslot[data-rar="starter"],.dp-bigslot[data-rar="basic"]{--rc:var(--r-basic)}
.dp-bigslot[data-rar="common"]{--rc:var(--r-common)}
.dp-bigslot[data-rar="uncommon"]{--rc:var(--r-uncommon)}
.dp-bigslot[data-rar="rare"]{--rc:var(--r-rare)}
.dp-bigslot[data-rar="ancient"]{--rc:var(--r-ancient)}
.dp-bigslot[data-rar="shop"]{--rc:var(--gold-d)}
.dp-bigslot[data-rar="event"]{--rc:var(--green-d)}
.dp-bigslot .ih-slot{--cut:34px;width:12.6rem;height:12.6rem;box-shadow:0 20px 22px -28px rgba(0,0,0,.8)}
.dp-bigslot .ih-slot::after{inset:5px;--cut:31px}
.dp-bigslot .big .relic{width:8.8rem;height:8.8rem}
.dp-bigslot .ih-gem{--gem-hov:1.11;bottom:-.6rem;width:1.2rem;height:1.2rem;border-radius:2px}
.dp-bigslot .ih-slot:has(.hov){--ih-top:#d2e8ef;--ih-mid:#4f7380;--ih-glow:54%}
@media (max-width:640px){.dp-bigslot .ih-slot{--cut:28px;width:10.2rem;height:10.2rem}.dp-bigslot .ih-slot::after{--cut:25px}.dp-bigslot .big .relic{width:7.2rem;height:7.2rem}.dp-bigslot .ih-gem{width:1rem;height:1rem}}

/* the `how` text: a small paragraph in its own quiet box under the rules text. No heading, no accent rule: the gold rule belongs to the game's words above it */
.dp-how{margin:-4px 0 14px;padding:10px 14px 11px;border-radius:10px;background:rgba(0,0,0,.2);border:1px solid rgba(255,255,255,.07);font-size:.95rem;line-height:1.5;color:var(--muted);scroll-margin-top:5.5rem}
.dp-how p{margin:0}.dp-how p+p{margin-top:.5rem}
.infocol .dp-flavor{margin:-4px 0 12px}.dp-flavor+.dp-how{margin-top:0}   /* a relic's flavor line stands between the rules text and the box */
.dp-how a{color:var(--gold)}.dp-how b,.dp-how strong{color:var(--text)}

/* the facts: a 12-column grid, the span of each box comes from factGrid() (--s4 / --s3 / --s2 = its share in a row of up to 4 / 3 / 2), picked by the
   grid's own width, so the rows are even at every width and in both page layouts (beside the showcase, under it) */
.dp-factwrap{container:dpf/inline-size;margin:0}
.dp-facts{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:10px;margin:0}
.dp-cell{grid-column:span var(--s2);min-width:0;display:flex}
@container dpf (min-width:35rem){.dp-cell{grid-column:span var(--s3)}}
@container dpf (min-width:48rem){.dp-cell{grid-column:span var(--s4)}}
/* fitted rows (factGrid {fit:true}, detailpage.js FITTED ROWS; the card, relic and potion pages): one span per band of the grid's width (DP_FIT), --f0 under
   22rem (a 320 to 350 px phone), --f1 / --f2 from 22 / 23rem (360, 375 px), --f3 from 24rem, --f4 / --f5 / --f6 from 35 / 37 / 40rem, --f7 / --f8 / --f9 from 48 / 51 / 54rem */
.dp-facts.fit>.dp-cell{grid-column:span var(--f0,6)}
@container dpf (min-width:22rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f1,6)}}
@container dpf (min-width:23rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f2,6)}}
@container dpf (min-width:24rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f3,6)}}
@container dpf (min-width:35rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f4,4)}}
@container dpf (min-width:37rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f5,4)}}
@container dpf (min-width:40rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f6,4)}}
@container dpf (min-width:48rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f7,3)}}
@container dpf (min-width:51rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f8,3)}}
@container dpf (min-width:54rem){.dp-facts.fit>.dp-cell{grid-column:span var(--f9,3)}}
.dp-facts .ew-fact{flex:1 1 auto;width:100%;min-width:0}
.dp-facts .ew-fact-t b a{color:inherit;text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--gold) 55%,transparent);text-underline-offset:.16em}
.dp-facts .ew-fact-t b a:hover{color:var(--gold)}
/* a value the upgrade changes: both values share one cell (the box keeps the wider one's width, nothing moves), the page's Base / Upgraded toggle picks one
   through the showcase stage's .is-up (pages.js showcaseSet). The upgraded one is in the green the rules text uses for a changed number */
.dp-ud{display:inline-grid;justify-items:start;vertical-align:baseline}
.dp-ud>*{grid-area:1/1}
.dp-uu{visibility:hidden;color:var(--green)}
.hero:has(#upgstage.is-up) .dp-uu{visibility:visible}
.hero:has(#upgstage.is-up) .dp-ub{visibility:hidden}
/* the rarity word in its rarity colour, as the chips write it */
.dp-rar.r-common,.dp-rar.r-basic,.dp-rar.r-starter{color:var(--r-common,#c9d1d3)}.dp-rar.r-uncommon{color:var(--r-uncommon)}.dp-rar.r-rare{color:var(--r-rare)}.dp-rar.r-ancient{color:var(--r-ancient)}.dp-rar.r-shop{color:#3fd8cf}
/* side padding 8 px on a phone: at 390 px two boxes share a row and "All characters" (relic and potion pages) was 1 px wider than its 108 px cell and clipped to "All characte..." (lead, wave 5; Bean: no cut-off text) */
@container dpf (max-width:26rem){.dp-facts{gap:8px}.dp-facts .ew-fact{padding:8px 8px 10px}.dp-facts .ew-fact-row{gap:8px}}

/* "When to take it": one compact block, the title at the left of its two lines (over them on a narrow page) */
.dp-pick{container:dpp/inline-size;margin:var(--stack) 0 0;border-radius:12px;background:rgba(0,0,0,.26);border:1px solid rgba(255,255,255,.08);position:relative;overflow:hidden}
.dp-pick::before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;background:var(--gold)}
/* the title over the text; beside it once the block is wide enough for the text to still fit its two lines there. No max-width on the text: the lines run the
   block's width so the writer's 185 characters stay two lines down to a 1000 px window */
.dp-pick-in{display:grid;grid-template-columns:minmax(0,1fr);align-items:center;gap:4px 22px;padding:10px var(--pad) 12px}
.dp-pick-h{display:flex;align-items:center;gap:12px}
.dp-pick-h h2{margin:0;font-size:1.2rem}
.dp-pick-b{min-width:0;font-size:1rem;line-height:1.45;color:var(--text)}
.dp-pick-b p{margin:0}.dp-pick-b a{color:var(--gold)}
@container dpp (min-width:60rem){.dp-pick-in{grid-template-columns:auto minmax(0,1fr);padding:12px var(--pad)}.dp-pick-h h2{white-space:nowrap}.dp-pick-b{font-size:1.02rem}}

/* synergies: the directory's own tiles, smaller. Cards: the card component at a smaller --cw with a bigger hover grow (the text of a small card is read
   on hover); relics: the relic tile at its small size, so that section is the lower one. Nothing reflows on hover (scale only). */
.dp-syn-b{padding:2px var(--pad) 14px}
.dp-syn .syn-hint{text-transform:none;letter-spacing:.02em}
.grid.cards.syn-cards{--cw:8.2rem;gap:16px 12px;padding:6px 0 4px}   /* the directory's own columns (auto-fill, 1fr, centred): full rows span the section */
.syn-cards .card{--hov-scale:1.32}
.grid.icons.syn-relics{grid-template-columns:repeat(auto-fill,7rem);justify-content:start;gap:12px 10px;padding:4px 0 2px}
.syn-relics .itemcell{width:7rem}
.grid.icons.dp-relrel{grid-template-columns:repeat(auto-fill,7rem);justify-content:start;gap:12px 10px;padding:4px 0 2px}.dp-relrel .itemcell{width:7rem}   /* the related relics: the synergy grid's tiles (detailpage.js dpRelatedSection) */
.syn-it{position:relative;min-width:0}
/* the reason: read by screen readers and crawlers, shown by the tooltip on a hover device */
.syn-why{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
.chap .syn-also{margin:10px 0 0;max-width:78ch;font-size:.95rem;line-height:1.45;color:var(--muted)}
.syn-also a{color:var(--gold)}
/* THE TOOLTIP (wave 5, 22 Sep 2026; Bean: the "why" stands out): CORE's plate (tipbox.css .tp-plate: rim, ledge and left stripe in the partner's rarity colour) whose
   first block is the REASON on a lit plate: the rarity colour washed over the dark, a hairline of it round the plate, the game's chain icon (the statistics screen's
   stats_chain, its link mark) beside a small-caps kicker and, on the right, the name of the rule that found the pair; the reason itself in cream with the two names in
   the tip gold. Under it the partner's kind line, its name and its own rules text, dimmer (.tp-dim): the reader came for the why. */
.syn-tip{max-width:23rem}
.tip .tp-syn .tp-why{position:relative;margin:7px 7px 4px 5px;padding:8px 11px 9px;border-radius:9px;
  background:linear-gradient(color-mix(in srgb,var(--rc) 30%,rgba(16,30,36,.98)),color-mix(in srgb,var(--rc) 16%,rgba(12,22,27,.98)));
  box-shadow:0 0 0 1px color-mix(in srgb,var(--rc) 55%,transparent),inset 0 1px 0 rgba(255,255,255,.12),0 2px 0 rgba(0,0,0,.35)}
.tip .tp-why-k{display:flex;align-items:center;gap:7px;margin-bottom:5px;font-family:var(--font-t);font-size:.66rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;line-height:1;color:#efc851}
.tip .tp-chain{width:1.05rem;height:1.05rem;flex:none;object-fit:contain;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
.tip .tp-why-r{margin-left:auto;padding-left:8px;font-style:normal;font-weight:700;letter-spacing:.08em;color:color-mix(in srgb,var(--rc) 70%,#e7eef0);white-space:nowrap}
.tip .tp-why-t{font-size:1rem;line-height:1.4;color:#fff6e2}
.tip .tp-why-t b{color:#efc851;font-weight:700}
.tip .tp-syn .tp-head{padding-top:6px}
.tip .tp-syn .tp-name{font-size:1rem}
.tip .tp-syn .tp-body.tp-dim{color:color-mix(in srgb,#f3ead9 62%,transparent);font-size:.9rem;padding-top:4px}
.tip .tp-syn .tp-body.tp-dim .kw{color:color-mix(in srgb,var(--gold) 62%,transparent)}.tip .tp-syn .tp-body.tp-dim .num{color:color-mix(in srgb,var(--blue) 62%,transparent)}
/* no hover, no tooltip (core.js showTip returns on touch): the reason is simply shown beside its tile, one tile per row, two on a tablet */
@media (hover:none){
  .dp-syn .syn-hint{display:none}
  .grid.cards.syn-cards,.grid.icons.syn-relics{grid-template-columns:repeat(auto-fit,minmax(min(100%,19rem),1fr));gap:12px 18px;justify-items:stretch}
  .syn-it{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:12px}
  .grid.cards.syn-cards{--cw:6.4rem}
  .syn-why{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto;clip-path:none;white-space:normal;font-size:.95rem;line-height:1.4;color:var(--text)}
  .syn-why>*{display:block}
  .syn-relics .itemcell{width:auto}.syn-relics .itemcell .nm{display:none}   /* the name is the caption's first line */
  /* the caption: the name, then the REASON first (lit, the names in gold), the item's own text last and dimmer */
  .syn-n{font-family:var(--font-t);font-size:1.05rem;color:var(--gold)}
  .syn-r{margin-top:3px;padding:5px 8px 6px;border-radius:7px;background:rgba(255,255,255,.06);box-shadow:inset 2px 0 0 var(--gold);color:var(--text)}.syn-r b{color:var(--gold)}
  .syn-fx{margin-top:4px;font-size:.86rem;color:var(--muted)}
}
@media (max-width:640px){.dp-syn-b{padding:2px 12px 12px}.grid.cards.syn-cards{--cw:7.4rem;gap:14px 10px}}
@media (max-width:640px) and (hover:none){.grid.cards.syn-cards{--cw:6rem}}
/* wave 6 QoL (23 Sep 2026; docs/wave6/qol-itempages.md). THE KEYBOARD: the pressed Base / Upgraded plate had no focus mark (buttons.css keeps the dark
   outline on .on:focus-visible), so after Space or Enter the focus vanished; on the card page it now wears the same gold outline as the other plate */
.hero .upg-toggle.game button.on:focus-visible::after{filter:brightness(.6) sepia(1) saturate(3);opacity:1}
/* THE FINGER (a touch screen): 40 px targets without moving anything. The Character / Unlock links of the fact boxes (23 px tall) and the item chips of
   "Changes by version" (23 px) get a taller hit area from a pseudo-element (the value cell's clip box grows by the same 9 px, its layout does not);
   "All N patch notes" (32 px) and "Show this version" (39 px) get a 40 px minimum */
@media (hover:none) and (pointer:coarse){
  .dp-facts .ew-fact-t:has(b a){padding-block:9px;margin-block:-9px}
  .dp-facts .ew-fact-t b a{position:relative}
  .dp-facts .ew-fact-t b a::after{content:"";position:absolute;inset:-9px -4px}
  .cvt-g .tagc.cvt-item{position:relative}
  .cvt-g .tagc.cvt-item::after{content:"";position:absolute;inset:-9px -3px}
  .cvt-w>details.more>summary{min-height:40px}
  .cv-jump{min-height:40px}
}

/* ===== app/enemy.css ===== */
/* ===== enemy pages (pages.js "enemies" block; docs/wave3/enemies.md) =====
   Everything is scoped under .epage (the enemy detail page root) so the older .move / .facts / .asc-tog rules in style.css stay untouched.
   Parts: Ascension variants (.av) and the Base / A8 / A9+ control (.asc-ctl), the attack pattern as a turn track (.pat: groups .pg, sequences .pseq,
   move nodes .pn, branch blocks .pb with lanes, end markers .pend), the move reference (.mvc), the hero kit additions (.ekit, .ewhere).
   Sprites are the game's: intent icons and power icons come from the markup; from here the popup plate (the toggle), the targeting-arrow head (the arrows
   between turns) and the top bar's Ascension flame. Nothing animates at rest except the stage intent; every transition is off with reduced motion. */
.epage{--asc:#ff9b4a;--asc-d:#c4501c;--n-atk:#e2574c;--n-def:#5aa9e6;--n-buf:#6fd08c;--n-deb:#c583e8;--n-idle:#8a9aa1;--n-misc:#d8b45a}

/* ---------- Ascension variants: every value is in the HTML, html[data-asc] picks one (set at load and by the control, pages.js ascApply) ---------- */
.av>span,.av-sep,.asc-note>span{display:none}
html:not([data-asc="8"]):not([data-asc="9"]) .av>.s0,html[data-asc="8"] .av>.s8,html[data-asc="9"] .av>.s9{display:inline}
html:not([data-asc="8"]):not([data-asc="9"]) .asc-note>.s0,html[data-asc="8"] .asc-note>.s8,html[data-asc="9"] .asc-note>.s9{display:inline}
:is(.epage,.encpage) .av>.chg{color:var(--asc);text-shadow:0 0 10px rgba(255,140,50,.35),0 2px 0 #000}
:is(.epage,.encpage) .av>.chg::after{content:"▲";display:inline-block;font-size:.5em;line-height:1;vertical-align:.95em;margin-left:.12em;font-style:normal}
:is(.epage,.encpage) .av>.chg.dn::after{content:"▼"}
/* the gold number: the Ascension colour, no arrow (a down triangle after "75" read as minus 75; pages_acts.js goldBox) */
.av>.gv{color:var(--asc);text-shadow:0 0 10px rgba(255,140,50,.35),0 2px 0 #000}
:is(.epage,.encpage).asc-flash .av>.chg{animation:ascpop .6s cubic-bezier(.16,1,.3,1)}
@keyframes ascpop{0%{scale:1.5;filter:brightness(1.8)}100%{scale:1;filter:none}}
:is(.epage,.encpage) .av>.chg{display:none;position:relative;transform-origin:50% 60%}
html[data-asc="8"] :is(.epage,.encpage) .av>.s8.chg,html[data-asc="9"] :is(.epage,.encpage) .av>.s9.chg{display:inline-block}
/* in the diagram, the chips and the hero the marker's room is reserved at every level (and the marker sits in it), so switching never re-wraps a row */
.epage .pn-num .av,.epage .fx .av,.epage .rk-t .av,.epage .hpbar .av{position:relative;display:inline-block;padding-right:.5em}
/* THE MARKER HANGS FROM THE NUMBER ITSELF (.chg is position:relative), never from .av (Bean, 19 Sep 2026: "the little up arrow when initially coming in blends
   in with the number and then moves over after. It needs to not do that and just spawn in properly next to the number"). While ascpop runs, its scale and
   filter make .chg the containing block of its own absolutely positioned ::after, so a marker placed with right:0 against .av sat ON the number for .6 s and
   jumped into the reserved room when the animation ended. Hung from .chg it is in the same spot during and after: its right edge 1 em of its own (half) size
   past the number, which is exactly the .5 em of room .av reserves; .8 em on the HP bar, which reserves none. */
.epage .pn-num .av>.chg::after,.epage .fx .av>.chg::after,.epage .rk-t .av>.chg::after,.epage .hpbar .av>.chg::after{position:absolute;left:100%;right:auto;top:.12em;margin:0 0 0 1em;translate:-100% 0;vertical-align:baseline}
.epage .hpbar .av{padding-right:0}.epage .hpbar .av>.chg::after{margin-left:.8em}

/* ---------- the control (wave 4: three popup plates in the title row) is now the dropdown in the frame's bottom left: pages.js ascCtl, enemyturns.css .asc-pick ---------- */
.asc-ctl{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:4px 8px;margin-left:auto;font-family:var(--font-t)}
.asc-ctl .asc-flame{width:1.5rem;height:2.1rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.asc-ctl .asc-l{font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);margin-right:2px}
.asc-ctl button{position:relative;isolation:isolate;--v:1;--tint:saturate(1.05) brightness(1);--ink:#10283a;display:inline-flex;align-items:center;justify-content:center;width:5.4rem;aspect-ratio:198/96;padding:0 .4rem .1rem .8rem;margin:0;border:0;border-radius:0;background:none;box-shadow:none;font-family:var(--font-t);font-weight:700;font-size:.92rem;line-height:1;letter-spacing:.02em;color:#fff6e2;text-shadow:1px 0 0 var(--ink),-1px 0 0 var(--ink),0 1px 0 var(--ink),0 -1px 0 var(--ink),1px 1px 0 var(--ink),-1px -1px 0 var(--ink),1px -1px 0 var(--ink),-1px 1px 0 var(--ink),2px 2px 0 rgba(0,0,0,.2);cursor:pointer;user-select:none;-webkit-user-select:none;transition:transform .5s cubic-bezier(.16,1,.3,1)}
.asc-ctl button::before,.asc-ctl button::after{content:"";position:absolute;pointer-events:none;background-size:100% 100%;background-repeat:no-repeat;background-position:center}
.asc-ctl button::before{inset:0;z-index:-1;background-image:url(/img/ui/popup_confirm_button.webp);filter:var(--tint) brightness(var(--v)) drop-shadow(0 3px 2px rgba(0,0,0,.5));transition:filter .5s cubic-bezier(.16,1,.3,1)}
.asc-ctl button::after{inset:-2px -2px -3px;z-index:-2;background-image:url(/img/compressed/popup_confirm_button_outline.webp);filter:brightness(0);opacity:.45}
.asc-ctl button:hover{transform:scale(1.04);--v:1.25;transition-duration:.05s}
.asc-ctl button:hover::before{transition-duration:.05s}
.asc-ctl button:hover::after,.asc-ctl button:focus-visible::after{filter:brightness(.6) sepia(1) saturate(3);opacity:1}
.asc-ctl button:active{transform:scale(.96);--v:.85;transition-duration:.12s}
.asc-ctl button:focus-visible{outline:0}
.asc-ctl button.on{--tint:grayscale(1) sepia(1) saturate(2.8) brightness(1.32);color:#241600;text-shadow:none;cursor:default}
.asc-ctl button.on:hover,.asc-ctl button.on:active{transform:none;--v:1}
/* the two Ascension plates burn in the flame's orange when they are the active one */
.asc-ctl button[data-asc="8"].on,.asc-ctl button[data-asc="9"].on{--tint:grayscale(1) sepia(1) saturate(4.2) hue-rotate(-22deg) brightness(1.18)}
.asc-ctl .asc-note{flex-basis:100%;text-align:right;font-family:var(--font-b);font-size:.86rem;color:var(--muted);min-height:1.25em}
:is(.epage,.encpage) .asc-none{margin-left:auto;align-self:center;font-family:var(--font-t);font-size:.86rem;color:var(--dim)}
html[data-asc="8"] .asc-ctl .asc-note,html[data-asc="9"] .asc-ctl .asc-note{color:var(--asc)}
html[data-asc="8"] .asc-ctl .asc-flame,html[data-asc="9"] .asc-ctl .asc-flame{filter:drop-shadow(0 0 6px rgba(255,120,30,.8)) drop-shadow(0 2px 2px rgba(0,0,0,.6))}
html:not([data-asc="8"]):not([data-asc="9"]) .asc-ctl .asc-flame{filter:grayscale(.85) brightness(.8) drop-shadow(0 2px 2px rgba(0,0,0,.6))}

/* ---------- hero: kind chip, "Enters the fight with:", "Appears in" ---------- */
.epage .ekind{font-family:var(--font-t);font-weight:700;letter-spacing:.04em;color:#fff6e2}
.epage .ekind-boss{border-color:#c4382e;background:rgba(160,30,24,.4)}
.epage .ekind-elite{border-color:#b04ac0;background:rgba(110,40,140,.38)}
.epage .ekind-minion,.epage .ekind-pet{border-color:var(--line-l)}
.epage .ekit{margin-top:6px}
.epage .ekit .power{width:3.6rem;height:3.6rem}
.epage .ekit .rk-t a{color:var(--gold-x)}
.epage .ewhere{align-items:center}
.epage .ewhere .ewhere-l{font-family:var(--font-t);font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);font-weight:400}
.epage .ewhere span{gap:6px}
.epage .ewhere img{width:1.7rem;height:1.7rem;opacity:1;filter:drop-shadow(0 2px 1px rgba(0,0,0,.6))}
.epage .ewhere i{font-style:normal}
.epage .stage .intent .pi{display:inline-flex;align-items:center;gap:4px}
.epage .stage .intent .pi+.pi{margin-left:6px}
.epage .stage .intent .pn-num i{font-style:normal;font-size:.8em}
/* what a buff/debuff/status intent stands for (pages.js piWhat): power icon + amount + name beside the intent icon, in the intent's own text style */
.pi-what{display:inline-flex;align-items:center;gap:7px;margin-left:3px;font-family:var(--font-t);font-weight:700;font-size:1rem;line-height:1;color:#fff;text-shadow:0 2px 0 #000,0 0 6px rgba(0,0,0,.7);white-space:nowrap}
.pi-what>span{display:inline-flex;align-items:center;gap:3px}
.pi-what b{font-weight:700;margin-right:2px}
.epage .pi .pi-what img,.pi-what img{width:1.5rem;height:1.5rem;object-fit:contain;filter:drop-shadow(0 1px 0 rgba(0,0,0,.6))}
.pn .pi-what{display:none}   /* the pattern card's chips (.pn-fx) already say it; the markup stays so the turn walk can copy .pn-int into the hero */
.epage .stage .intent.peek{animation:none}
.epage .hpbar .lbl .av>.chg{color:#ffd9b0}

/* ---------- the pattern chapter ---------- */
.epage .epat{--acc:var(--n-atk)}
.epage .epat .chap-h{align-items:flex-start}
.epage .epat-b{padding:6px var(--pad) 18px}
.epage .pat{display:flex;flex-wrap:wrap;align-items:flex-start;gap:18px 18px}
.epage .pg{position:relative;flex:0 1 auto;min-width:0;padding:1.55rem 14px 14px;border-radius:12px;background:rgba(0,0,0,.22);border:1px solid rgba(255,255,255,.08)}
.epage .pg-loop{flex:1 1 20rem;border:2px dashed rgba(239,200,81,.45);background:radial-gradient(120% 140% at 50% 0,rgba(239,200,81,.07),transparent 60%),rgba(0,0,0,.22)}
.epage .pg-phase{flex:1 1 100%;border:2px dashed rgba(226,87,76,.5);background:radial-gradient(120% 140% at 50% 0,rgba(226,87,76,.08),transparent 60%),rgba(0,0,0,.22)}
.epage .pg-h{position:absolute;left:12px;top:-.72rem;margin:0;padding:1px 10px 2px;border-radius:6px;background:#15252b;border:1px solid rgba(255,255,255,.14);font-family:var(--font-t);font-size:.82rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--gold-x);max-width:calc(100% - 24px)}
.epage .pg-h small{font-weight:400;letter-spacing:.02em;text-transform:none;color:var(--muted);font-size:.8rem;margin-left:4px}
.epage .pg-loop>.pg-h{border-color:rgba(239,200,81,.55)}
.epage .pg-phase>.pg-h{position:static;display:block;margin:-.6rem 0 12px;border-color:rgba(226,87,76,.6);color:#ffb3ad;max-width:none}
.epage .pg-phase>.pg-h small{display:block;margin:2px 0 1px;line-height:1.3;font-size:.86rem}
/* the arrow between two groups: the opening runs into the loop */
.epage .pg-open{padding-right:20px}

/* a sequence: nodes left to right, the game's targeting-arrow head between them (grey sprite, tinted the way the game tints it red) */
.epage .pseq{list-style:none;margin:0;padding:0 26px 0 0;display:flex;flex-wrap:wrap;align-items:stretch;gap:12px 36px}
.epage .pseq>li{position:relative;display:flex;min-width:0}
.epage .pseq>li:not(:last-child)::after{content:"";position:absolute;right:-30px;top:50%;width:22px;height:24px;margin-top:-12px;background:url(/img/ui/combat/targeting_arrow_head.webp) center/contain no-repeat;transform:rotate(90deg);filter:sepia(1) saturate(5) hue-rotate(-42deg) brightness(.95) drop-shadow(0 2px 0 rgba(0,0,0,.5));pointer-events:none}
.epage .pseq>li.ps-b{flex:1 1 16rem}
.epage .pseq:has(>.ps-b)>.ps,.epage .pseq:has(>.pend)>.ps{align-self:center}
.epage .lane .pseq{padding-right:22px}
.epage .pb-pool .lane .pseq{padding-right:0}

/* a move node: the tip-box plate with the intent the game would show, the hit numbers big, then the side effects as icon chips */
.epage .pn{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:3px;min-width:7.6rem;max-width:13.5rem;padding:9px 12px 10px;border-radius:9px;background:linear-gradient(#22383f,#152429);border:2px solid #4c6b76;box-shadow:0 3px 0 rgba(0,0,0,.45);color:var(--text);text-align:center;text-decoration:none;transition:transform .5s cubic-bezier(.16,1,.3,1),border-color .2s,box-shadow .2s}
.epage .pn::before{content:"";position:absolute;left:10px;right:10px;top:-2px;height:4px;border-radius:0 0 4px 4px;background:var(--nc,var(--n-misc))}
.epage .pn-atk{--nc:var(--n-atk)}.epage .pn-def{--nc:var(--n-def)}.epage .pn-buf{--nc:var(--n-buf)}.epage .pn-deb{--nc:var(--n-deb)}.epage .pn-idle{--nc:var(--n-idle)}
.epage a.pn:hover,.epage a.pn:focus-visible{transform:scale(1.05);border-color:var(--gold);box-shadow:0 3px 0 rgba(0,0,0,.45),0 0 0 2px rgba(239,200,81,.25),0 0 18px rgba(239,200,81,.25);text-decoration:none;outline:0;transition-duration:.05s,.2s,.2s;z-index:2}
.epage .pn.now{border-color:var(--gold-x);box-shadow:0 3px 0 rgba(0,0,0,.45),0 0 14px rgba(255,224,138,.35)}
.epage .pn-turn{font-family:var(--font-t);font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);line-height:1}
.epage .pn.now .pn-turn{color:var(--gold-x)}
.epage .pn-flag{font-family:var(--font-t);font-size:.74rem;line-height:1.2;color:var(--gold-x);max-width:12rem}
.epage .pn-flag i{font-style:normal;font-size:.7em;margin-right:2px}
.epage .pn-int{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:2px 8px;min-height:3.2rem}
.epage .pi{display:inline-flex;align-items:center;gap:3px}
.epage .pi img{width:3rem;height:3rem;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.6))}
.epage .pn-num{font-family:var(--font-t);font-weight:700;font-size:1.75rem;line-height:1;color:#fff;text-shadow:0 2px 0 #000,0 0 6px rgba(0,0,0,.7);font-variant-numeric:tabular-nums;white-space:nowrap}
.epage .pn-num i{font-style:normal;font-size:.72em;color:#ffe9c4;margin-left:1px}
.epage .pn-num.sm{font-size:1.2rem}
.epage .pn-name{font-family:var(--font-t);font-size:1rem;line-height:1.15;color:#fff6e2;text-wrap:balance}
.epage .pn-fx{display:flex;flex-wrap:wrap;justify-content:center;gap:4px;margin-top:3px}
.epage .fx{display:inline-flex;align-items:center;gap:4px;padding:1px 7px 1px 3px;border-radius:999px;background:rgba(0,0,0,.38);border:1px solid rgba(255,255,255,.12);font-size:.82rem;line-height:1.25;color:var(--muted);white-space:nowrap}
.epage .fx img{width:1.35rem;height:1.35rem;object-fit:contain;flex:none}
.epage .fx b{color:var(--blue);font-family:var(--font-t);font-variant-numeric:tabular-nums}
.epage .fx-deb{border-color:rgba(197,131,232,.45)}.epage .fx-buf{border-color:rgba(111,208,140,.4)}.epage .fx-blk{border-color:rgba(90,169,230,.5)}
.epage .fx-to{font-style:normal;color:var(--dim);font-size:.92em}
.epage .fx-txt,.epage .fx-card{padding-left:7px}.epage .fx-card img{margin-left:-4px}
/* the start of a loop carries the return mark; a copy of a node drawn elsewhere is a shade quieter */
.epage .pn-loopto::after{content:"↺";position:absolute;left:-9px;top:-10px;width:1.35rem;height:1.35rem;display:grid;place-items:center;border-radius:50%;background:#15252b;border:1px solid rgba(239,200,81,.7);color:var(--gold-x);font-size:.85rem;line-height:1}
.epage .pn-ref{background:linear-gradient(#1d3037,#132126)}

/* end markers */
.epage .pend{align-items:center;gap:6px;align-self:center;padding:5px 12px 5px 8px;border-radius:999px;background:rgba(0,0,0,.35);border:1px solid rgba(239,200,81,.4);font-family:var(--font-t);font-size:.9rem;color:var(--muted);white-space:nowrap}
.epage .pend b{color:#fff6e2}
.epage .pend-i{color:var(--gold-x);font-size:1.15rem;line-height:1}
.epage .pend-goto{border-color:rgba(255,255,255,.2)}
.epage .pend-goto .pend-i{color:var(--muted);font-size:.9rem}

/* a branch block: the machine really branches here. Random picks show their odds, checks their condition in plain words */
.epage .pb{flex:1;min-width:0;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.12);overflow:hidden}
.epage .pb-h{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;padding:5px 12px 5px 8px;background:rgba(255,255,255,.05);border-bottom:1px solid rgba(255,255,255,.08);font-family:var(--font-t);font-size:.95rem;font-weight:700;color:#fff6e2}
.epage .pb-h img{width:1.9rem;height:1.9rem;object-fit:contain}
.epage .pb-h .pn-flag{font-weight:400;margin-left:auto}
.epage .pb-loopto>.pb-h::after{content:"↺";color:var(--gold-x);font-size:1.05rem;margin-left:2px}
.epage .pb-h .pn-flag+*{margin-left:0}
.epage .pb-lanes{list-style:none;margin:0;padding:0}
.epage .lane{display:grid;grid-template-columns:minmax(6.5rem,9.5rem) minmax(0,1fr);gap:8px 14px;align-items:center;padding:10px 12px}
.epage .lane+.lane{border-top:1px dashed rgba(255,255,255,.12)}
.epage .lane-l{display:flex;flex-direction:column;gap:1px;font-family:var(--font-t);line-height:1.2;color:#fff6e2;font-size:.95rem}
.epage .lane-p{font-size:1.5rem;line-height:1.05;color:var(--gold-x);text-shadow:0 2px 0 #000;font-variant-numeric:tabular-nums}
/* odds that depend on a condition (Two-Tailed Rat): both sets, each with its words */
.epage .lane-2{display:flex;align-items:baseline;gap:6px;font-size:1.15rem;line-height:1.15}
.epage .lane-2 .lane-when{font-family:var(--font-b);font-weight:400;color:var(--muted);font-size:.78rem;text-shadow:none;text-align:left}
.epage .lane-l small{color:var(--muted);font-size:.8rem;font-family:var(--font-b)}
.epage .lane-c{color:var(--gold-x)}
.epage .lane-or{font-style:normal;color:var(--dim)}
.epage .pc-raw{color:var(--muted);border-bottom:1px dotted var(--dim);cursor:help}
/* a pool: every lane is one move and they all end the same way, so the moves stand side by side with their odds on top */
.epage .pb-pool>.pb-lanes{display:flex;flex-wrap:wrap;gap:10px;padding:10px 12px}
.epage .pb-pool .lane{display:flex;flex-direction:column;align-items:center;gap:5px;padding:0;border:0;flex:0 1 auto}
.epage .pb-pool .lane-l{align-items:center;text-align:center;max-width:13rem}
.epage .pb-pool .lane .pseq{justify-content:center}
.epage .pb-f{display:flex;align-items:center;gap:6px;padding:5px 12px 7px;border-top:1px dashed rgba(255,255,255,.12);font-family:var(--font-t);font-size:.9rem;color:var(--muted)}
.epage .pb-f b{color:#fff6e2}
.epage .pat-note{margin:12px 2px 0;font-size:.88rem;color:var(--dim);max-width:78ch}

/* ---------- move reference ---------- */
.epage .mvcs{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,21rem),1fr));gap:10px}
.epage .mvc{position:relative;display:grid;grid-template-columns:5.6rem minmax(0,1fr);gap:4px 12px;align-items:start;padding:10px 12px 10px 10px;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.09);border-left:4px solid var(--nc,var(--n-misc));scroll-margin-top:5rem;outline:0}
.epage .mvc-atk{--nc:var(--n-atk)}.epage .mvc-def{--nc:var(--n-def)}.epage .mvc-buf{--nc:var(--n-buf)}.epage .mvc-deb{--nc:var(--n-deb)}.epage .mvc-idle{--nc:var(--n-idle)}
.epage .mvc-int{display:flex;flex-direction:column;align-items:center;gap:4px}
.epage .mvc-int .pi{flex-direction:column;gap:0}
.epage .mvc-int .pi img{width:2.7rem;height:2.7rem}
.epage .mvc-int .pn-num{font-size:1.35rem}
.epage .mvc-n{font-family:var(--font-t);font-size:1.12rem;line-height:1.2;color:#fff;margin:1px 0 3px}
.epage .mvc-fx{margin:0;padding:0;list-style:none;color:var(--muted);font-size:.96rem;line-height:1.4}
.epage ul.mvc-fx li{margin:0;padding-left:.9rem;position:relative}
.epage ul.mvc-fx li::before{content:"";position:absolute;left:.1rem;top:.62em;width:.32rem;height:.32rem;border-radius:50%;background:var(--nc,var(--n-misc))}
.epage .mvc-fx b{color:var(--blue);font-family:var(--font-t);font-variant-numeric:tabular-nums}
.epage .mvc-nx{margin:5px 0 0;font-size:.86rem;color:var(--dim)}
.epage .mvc-nx a{color:var(--gold-x)}
.epage .mvc.hit{animation:mvchit 1.6s ease-out}
@keyframes mvchit{0%,35%{border-color:var(--gold);box-shadow:0 0 0 2px rgba(239,200,81,.45),0 0 22px rgba(239,200,81,.35);background:rgba(239,200,81,.1)}100%{box-shadow:0 0 0 0 transparent}}

/* ---------- narrow screens: the track runs top to bottom, arrows point down ---------- */
@media (max-width:640px){
  .epage .epat-b{padding:6px 12px 14px}
  .epage .asc-ctl{justify-content:flex-start;margin-left:0;width:100%}
  .epage .asc-ctl .asc-note{text-align:left}
  .epage .asc-ctl button{width:4.6rem;font-size:.86rem}
  .epage .asc-ctl .asc-l{display:none}
  .epage .pseq:has(>.ps-b)>.ps,.epage .pseq:has(>.pend)>.ps{align-self:stretch}
  .epage .pg{flex:1 1 100%;padding:1.4rem 10px 12px}
  .epage .pg-open{padding-right:10px}
  .epage .pseq{flex-direction:column;flex-wrap:nowrap;align-items:stretch;gap:30px;padding-right:0}
  .epage .pseq>li:not(:last-child)::after{right:auto;left:50%;top:auto;bottom:-27px;margin:0 0 0 -11px;transform:rotate(180deg)}
  .epage .pseq>li.ps-b{flex:none}
  .epage .pn{max-width:none;min-width:0;flex:1}
  .epage .pend{align-self:center}
  .epage .lane{grid-template-columns:1fr;gap:6px;padding:10px}
  .epage .lane-l{flex-direction:row;flex-wrap:wrap;align-items:baseline;gap:2px 8px}
  .epage .pb-pool>.pb-lanes{padding:10px}
  .epage .pb-pool .lane{flex:1 1 8rem}
  .epage .pb-pool .lane .pseq{align-self:stretch}
  .epage .mvc{grid-template-columns:4.4rem minmax(0,1fr)}
}
@media (hover:none) and (pointer:coarse){.epage .asc-ctl button{width:5.6rem}}
@media (prefers-reduced-motion:reduce){
  .epage .pn,.epage a.pn:hover,.epage a.pn:focus-visible,.asc-ctl button,.asc-ctl button:hover,.asc-ctl button:active{transform:none;transition:none}
  .epage.asc-flash .av>.chg,.epage .mvc.hit{animation:none}
  .epage .mvc.hit{border-color:var(--gold)}
}

/* ---------- below the arena (19 Sep 2026): the diagram and the move cards share a row, boxes are solid enough to read over the room, the pattern in words folds ---------- */
.epage .eturns{display:flex;flex-wrap:wrap;align-items:stretch;gap:var(--gap);margin:var(--stack) 0 0}
.epage .eturns>.chap{margin:0;min-width:0}
.epage .eturns>.epat{flex:1 1 24rem}
.epage .eturns>.emoves{flex:1.4 1 26rem}
.epage .eturns>.emoves .mvcs{grid-template-columns:repeat(auto-fill,minmax(min(100%,17rem),1fr))}
.epage .chap{background:rgba(9,15,19,.84)}
.epage .ewords{margin:0 var(--pad) 16px}
.epage .ewords .evtold-b{margin-top:10px}

/* ===== the Enemies directory (pages.js mtCard, reassigned in pages_enemies.js; wave 5, 22 Sep 2026, docs/wave5/enemies.md) =====
   ONE BODY RULE (Bean: "We really need congruency here, everything should be a similar size and in the dead center to the human eye"). mtStand gives a member the
   class vb and the body box of its still (app/stillbox.js, tools/still_boxes.py): the .lm IS the body (its shape --ar, its height --f of --mh), and the whole picture
   hangs inside it by --ix --iy --iw --ih (percent of the body box; it may reach past it: a shadow under the feet, a flyer's far shadow). A lone body is 56 % of the
   picture's height (--mh) with its feet on the ground line at 75.5 % (--g, MT_G in pages_enemies.js), so its middle is at 47.5 %: the middle of the band between the
   act tag and the name plate. A fight's row keeps the game's proportions and shrinks as one when it is wider than 86 % of the picture (--rs on the lineup, with its
   ground line raised by half of what it lost). No per-member width cap any more (it squeezed one member of a row and not the others). The picture fills its own box
   exactly (object-fit:fill on the still's own shape), which is what creatureanim.js place() reads for the hover clip. (.mtc.arena, five classes: acts.css keeps a
   per-member cap of 86cqw / n on the boss and elite cards' bodies, which squeezed The Kin's three and the Kaiser Crab; the same weight and the later file win.) */
.mtc.arena .arena-stage{--mh:56cqh}
.mtc.arena .encstage .lineup{gap:2.5%}
.mtc.arena .encstage .lm{height:calc(var(--rs,1)*var(--f,1)*var(--mh));max-width:calc(92%/var(--n,1))}
.mtc.arena .encstage .lm.vb{height:auto;aspect-ratio:var(--ar);width:calc(var(--rs,1)*var(--f,1)*var(--mh)*var(--ar));max-width:none}
.mtc.arena .encstage .lm.vb .lm-img{position:absolute;left:var(--ix);top:var(--iy);width:var(--iw);height:var(--ih);max-width:none;object-fit:fill}
/* THE KIND TAGS AND CHIPS: one icon and one colour per kind (pages_enemies.js MT_KIND_ICO; Bean, 22 Sep 2026: "The elite tag ... the background is a little bright on
   it, and the "ELITE" text is a little too white, I would darken it a tiny bit ... other tags like bosses, monsters, minions, and pets need similarly unique tags like
   this with an icon and color that matches their new filters at the top"). The same five pairs feed the Kind filter chips (#fkind, the FILTERS stream's --ki / --rc
   hook in filters.css), the removable filter tags (.fico), the tiles' tags (.mq-kind, style.css sets the plate) and the enemy page's chip (.tagc-kind, tags.css). The
   plates are the kind's colour deep in the dark, the text a shade under white so it sits IN the plate rather than on it. */
#fkind .fchip[data-v="Boss"],.fico[data-k="kind"][data-v="Boss"]{--rc:#c4382e;--ki:url(/img/ui/game_over_screen/score_boss.webp);--ki-size:contain}
#fkind .fchip[data-v="Elite"],.fico[data-k="kind"][data-v="Elite"]{--rc:#b04ac0;--ki:url(/img/ui/run_history/elite.webp)}
#fkind .fchip[data-v="Monster"],.fico[data-k="kind"][data-v="Monster"]{--rc:#c9a05a;--ki:url(/img/ui/run_history/monster.webp)}
#fkind .fchip[data-v="Minion"],.fico[data-k="kind"][data-v="Minion"]{--rc:#a9c6b7;--ki:url(/img/powers/minion_power.webp)}
#fkind .fchip[data-v="Pet"],.fico[data-k="kind"][data-v="Pet"]{--rc:#6fb9cc;--ki:url(/img/ui/emote/heart.webp)}
.mq-kind{--kc:#8a9aa1;border-color:color-mix(in srgb,var(--kc) 78%,transparent);background:color-mix(in srgb,var(--kc) 30%,rgba(6,10,12,.9));color:#efe4d2;gap:0}
.mq-kind .kind-i{width:1.6em;height:1.6em;margin:-.45em .38em -.4em -.3em;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.mq-boss{--kc:#c4382e;background:rgba(92,18,14,.86);color:#f3d9d2}
.mq-elite{--kc:#b04ac0;background:rgba(48,16,66,.86);color:#dcc6e6}
.mq-monster{--kc:#c9a05a;color:#efe0c2}
.mq-minion{--kc:#a9c6b7;color:#e2ece6}
.mq-pet{--kc:#6fb9cc;color:#d8eef4}
.tagc-kind[data-v="boss"]{--fc:#c4382e}.tagc-kind[data-v="elite"]{--fc:#b04ac0}.tagc-kind[data-v="monster"]{--fc:#c9a05a}.tagc-kind[data-v="minion"]{--fc:#a9c6b7}.tagc-kind[data-v="pet"]{--fc:#6fb9cc}
.tagc-kind .kind-i{width:1.15rem;height:1.15rem;margin:0 0 0 -2px;object-fit:contain;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
/* THE ACT ON EACH CARD (pages.js mtActTag; Bean, 21 Sep 2026, on Relics: "I don't like how there are sub titles throughout the directory": the act headings over the
   grid are gone, one grid in every sort). The chip itself is the Events cards' (events.css .evq-act: the act's gem and its name, the colours of the Act filter chips);
   it sits in the picture's top left corner, the boss's map node has the top right. The event fights take the Act filter's own colour for them (acts.css .fgrp-encact). */
.mtc .mt-act{position:absolute;left:8px;top:8px;z-index:4;display:flex;pointer-events:none}
.mtc .mt-act .evq-act{background:rgba(0,0,0,.68);box-shadow:0 2px 0 rgba(0,0,0,.4)}
.evq-act.a-event{--rc:#8a9aa1}

/* ===== app/enemyturns.css ===== */
/* ===== The arena: the enemy page's hero (build/app/pages_enemyturns.js; docs/wave3/enemy-turns.md) =====
   Bean, 18 Sep 2026 (night): "The turns auto changing can be removed, just allow the users to click through it themselves. The issue now the attack info
   being shown on the left takes up far too much space, and having all this info within 1 box is too much. ... Just make the enemy pages MUCH better and
   readable". So there is NO panel around the hero (.ehero has no background): the pieces stand on the page by themselves.
   THE ALLOCATION after Bean's notes of 19 Sep 2026 (all of them, in order, in docs/wave3/enemy-turns.md):
   - .ew-left, the LEFT column, one flex column reading from the top with nothing between: .ew-head (the title row with the Ascension control, the "one
     part of" plate; never a row of its own above the frame), then .ew-facts: separate small titled boxes (.ew-fact), never one panel, never bare, then on a
     fight page the cast box (.ew-cast). Bean on the boxes standing at the column's foot: "having all the empty space below the title like we do now makes
     no sense". Spare height is at the column's foot; when the column is the taller one the frame stretches.
   - .ew-box, RIGHT, the enemy's frame: the encStage recipe (acts.css) inside its own rounded border, the room clipped inside, the creature LARGE and
     centred on the ground line, intent over its head, HP bar / nameplate / powers at its feet. No turn text inside it. In two columns it has a preferred
     height (a square, a fight 3:2, capped so the hero stays in view) and stretches when the left column needs more: never a hole under it.
   - .ew-strip, THE STUB, hanging from the frame at exactly its width: gold arrow, ONE row of dark socket tokens (the lit one gold), gold arrow, the fight picker. No play /
     pause, no progress ring: the reader steps.
   - NO TURN TEXT anywhere in the hero ("this info isnt needed we see the turn number and stuff in the enemy video frame"): the intent in the frame and the
     lit token say it; .ew-when is a screen-reader line.
   - a fight page: numbered pips in the stub, that one row steps every member ("There is no need for the multiple rows just the one that flickers
     through for all of them, the visual is enough to explain").
   Hover feedback is light only (brightness, a soft glow): nothing in the stub grows or moves. Every overlay in the box is absolutely positioned: the
   creature's box never moves between turns (the live skeleton reads its rect). Sizes inside the box are container units (the stage is a size container):
   --top is the room the intent needs above the creature, --feet the room the HP bar / nameplate / powers need under its feet, --mh the creature height
   between them. Under a 900 px HERO the parts stack (.ew-left dissolves): head, frame + stub, facts, cast. (Wave 5, 22 Sep 2026: the line was 700 px; between
   700 and 900 the two columns left a 433 to 600 px frame whose preferred height, .6 of its width, stood under most left columns, so the frame stretched to the
   column and the creature's size followed the number of fact boxes: at a 760 px window the 110 heroes stood between .30 and .64 of their frames. Stacked, the
   frame is the page's width at one height on every page.) */

/* ---------- the hero stands on the page: one grid. Left: .ew-left, a flex column (head, fact boxes, a fight's cast box) spanning the frame's row and the stub's
   row. Right: the frame and, hanging from it, the stub. The frame's row is the 1fr one: a left column taller than frame + stub stretches the frame, never
   the stub. --lc / --cg are the left column and the column gap ---------- */
.ehero{position:relative;margin:2px 0 0}
.ewin{--lc:clamp(16.5rem,37cqw,25rem);--cg:clamp(18px,2.4vw,36px);--tuck:10px;position:relative;display:grid;grid-template-columns:var(--lc) minmax(0,1fr);grid-template-areas:"left box" "left strip";grid-template-rows:minmax(0,1fr) auto;gap:12px var(--cg);align-items:start}
.ewin.noturns{grid-template-areas:"left box";grid-template-rows:auto}
.ewin.nowalk>.ew-strip{display:none}
.ewin>.ew-left{grid-area:left;min-width:0;display:flex;flex-direction:column;gap:12px}
.ewin .ew-head{grid-area:head;min-width:0;container-type:inline-size}
.ewin>.ew-box{grid-area:box;min-width:0;position:relative;z-index:2}
.ewin>.ew-strip{grid-area:strip}
.ewin .ew-facts{grid-area:facts}
/* the head in the column: the title, its chips, then the Ascension control on its own line, left-aligned; the control's buttons shrink with the column and its
   word goes when the column cannot hold it (the flame and the note under the buttons still say what it is) */
.ehero .ew-head .ench-top{margin:0;align-items:center;gap:6px 12px}
.ehero .ew-head .ench-top h1{text-wrap:balance}
.ehero .ew-head .asc-ctl,.ehero .ew-head .asc-none{flex-basis:100%;margin:4px 0 0;justify-content:flex-start}
.ehero .ew-head .asc-ctl button{width:min(5.4rem,calc((100cqw - 9.8rem)/3))}   /* beside the flame and the word; "A9+" must never wrap onto a row of its own */
.ehero .ew-head .asc-ctl .asc-note{text-align:left}
@container (max-width:23.5rem){.ehero .ew-head .asc-ctl .asc-l{display:none}.ehero .ew-head .asc-ctl button{width:min(5.4rem,calc((100cqw - 3.6rem)/3))}}
.ehero .ew-head .ew-part{margin:12px 0 0;flex-wrap:wrap;gap:8px 12px}
/* the fact boxes in the left column: INDIVIDUAL BOXES right under the head, two to a row, a wide one and a lone last one taking the whole row (a wrapping
   flex row, so no box sits beside a hole), a little tighter than when stacked. Bean, 19 Sep 2026, on the version that floated them bare: "The info is all
   floating now, some things need to be in individual boxes on the left". They ALWAYS ride here in two columns (there is no "does it fit" estimate any more:
   the frame stretches when the column is the taller one; boxes dropped under the hero left the title alone over a void) */
.ehero{container:ehero/inline-size}
@container ehero (min-width:900px){
  /* the frame has a PREFERRED height (its square, a fight's 3:2, capped so the hero stays in view) and stretches past it when the left column needs more: an
     aspect-ratio box with a max-height could not grow, and left a hole between itself and what hangs under it. The grid item .ew-box carries that height
     (min-height + stretch); the stage fills it absolutely, so its own size stays DEFINITE: it is a size container, and with an auto or percent height its
     cqh units (and with them the room, the lineup and the creature) collapsed to nothing */
  /* THE FRAME IS 60 % OF WHAT IT WAS (wave 5; Bean, 22 Sep 2026: "The enemy display boxes can be made much smaller, along with the enemy within them. Honestly they are
     overwhelming at the moment"): its preferred height is .6 of its width (it was a square), capped at 23 rem (was 36); at 1345 px that is 362 px for 563, and the
     creature height inside (--mh) 214 px for 372. The left column (head, Health | Gold, Found in, Part of) is built to stand about that tall, so the stretch rarely acts */
  .ewin>.ew-box{align-self:stretch;min-height:min(calc((100cqw - var(--lc) - var(--cg))*.6),max(16rem,min(23rem,calc(100vh - 14rem))))}
  .ewin-fight>.ew-box{min-height:min(calc((100cqw - var(--lc) - var(--cg))*.6667),max(20rem,min(36rem,calc(100vh - 12rem))))}
  .ewin>.ew-box>.enc-hero{position:absolute;inset:0;width:auto;height:auto;aspect-ratio:auto;max-height:none}
  .ewin .ew-facts{margin:0;gap:8px}
  .ewin .ew-fact{flex:1 1 calc(50% - 4px);padding:7px 11px 9px;gap:4px;box-shadow:0 3px 0 rgba(0,0,0,.4)}
  .ewin .ew-fact.wide,.ewin .ew-fact.full{flex-basis:100%;display:flex}
  .ewin .ew-fact:not(.wide):not(.full){min-width:max-content}.ewin .ew-fact:not(.wide):not(.full) .ew-fact-t{white-space:nowrap}   /* "10-20 gold" never breaks in a half-width box: the box takes its own row instead */
  /* (no icon size of its own any more: factbox.css sets the one size every page uses; Bean, 22 Sep 2026: "We need this icon sizing to match the other pages") */
  /* a fight's cast box in the column: its tiles share the rows the way the fact boxes do */
}

/* ---------- the enemy's box ---------- */
.ewin .enc-hero{width:100%;aspect-ratio:1/1;min-height:0;max-height:max(20rem,min(36rem,calc(100vh - 12rem)));border-radius:12px;border:2px solid rgba(79,112,124,.85);box-shadow:0 5px 0 rgba(0,0,0,.4);--ico:min(2.8rem,9cqh);--top:calc(var(--ico) + 30px);--feet:calc(4.7rem + 10px);--mh:calc((100cqh - var(--top) - var(--feet))*var(--ms,1))}
.ewin .encstage::before{background:radial-gradient(90% 60% at 50% 100%,rgba(0,0,0,.35),transparent 70%),linear-gradient(rgba(0,0,0,.22),transparent 30%,transparent 70%,rgba(0,0,0,.3));box-shadow:inset 0 2px 12px rgba(0,0,0,.5)}
/* the ground line sits --feet above the box's bottom (the room's own ground line, .6543 of its height, lands on it: the acts.css formula with --feet for --g); the creature stands in the middle */
.ewin .encstage .lineup{left:0;right:0;bottom:var(--feet)}
.ewin .encstage .encroom{top:calc(100cqh - var(--feet) - .6543*max(calc((100cqh - var(--feet))/.6543),46.875cqw));height:max(calc((100cqh - var(--feet))/.6543),46.875cqw)}
.ewin .encstage .lm.stage{max-width:92cqw}
/* the intent over the head: bigger than a lineup's, 10 px above the VISIBLE top of the sprite (--vt, measured per slot by etIntentFit: the art is contained in
   its slot standing on the floor, so the slot's own top can be far above the creature; Bean: "way too far above the chars ... like 10px above the visible top of
   each individual character sprite"); a label of several powers wraps under itself instead of widening the row */
/* a status intent's card count is already in its label ("2 Slimed"): the bare "×2" beside it would say it twice */
.ewin .encstage .intent .pi:has(>.pi-what)>.pn-num.sm{display:none}
/* the enemy page's hero keeps its intent on ONE row (wave 6 QoL, 23 Sep 2026): the intent hangs from the middle of the creature's body box (left 50%), so an auto
   width shrank it to its narrowest, and a move giving two powers (the Axebot's 14 with Weak and Frail) stacked them into a column that ran 27 px out of the frame's
   top. The fight lineups' intents already take their own width (THE MEMBERS SPREAD OUT below) */
.ewin .encstage .lm.stage .lm-int,.ewin .encstage .lineup.ew-aft>.lm:only-child .lm-int{width:max-content;max-width:94cqw}   /* and the one enemy a death adds in its place (the Axebot's Stock: the new Axebot's 12/14 with Weak and Frail stacked 25 px over the top) */
.ewin .encstage :is(.lm.stage,.lineup.ew-aft>.lm:only-child) .lm-int .pi-what{max-width:94cqw}   /* its powers on one row too: the Queen's 99 Frail, Weak and Vulnerable broke after two (the 230 u cap below, meant for a fight's neighbours) and ran 25 px over the frame's top at 760 px */
.ehero .intent.pop>.pi{animation:eturnpop .45s cubic-bezier(.16,1,.3,1)}
@keyframes eturnpop{0%{scale:1.3;filter:brightness(1.6)}100%{scale:1;filter:none}}
/* ---------- THE GAME'S COMBAT UI (Bean, 23 Sep 2026, a screenshot of the game beside ours: "We need every fight / the block and attack to be sized the same as the
   game. There should be no difference in sizing of health, attack, block, debuffs and whatever else", "the display methods and sizing compared to each other, like
   look at our health bars and the text exiting the health bard top and bottom", "missing the red outline also on the hp numbers"). Every piece is its size in the
   game's 1920 x 1080 scenes times the frame's UI unit --u (CSS px per game px; pages_enemyturns.js cuiVars / etUiFit; the creatures keep their sizes). The numbers are the scenes' (scenes/combat/health_bar.tscn, intent.tscn, power.tscn, creature_state_display.tscn; build/extract/combat_ui.py):
   HP BAR     hitbox + 24 wide (--hbw), 16 tall, 7 under the feet: the dark back (health_bar_bg, 9 px ends, 1 in from each side), the red fill F1373E in a 10 px strip
              3 down and 5 in, cut to the mask's pointed ends; with Block the fill is 3B6FA3 and the pale outline (health_bar_stroke) shows. Label "44/44" Kreon Bold
              24 cream, a 16 px outline 900000 (1B3045 with Block), shadow (6, 4) at .25, centred on the bar: it spills out over and under it, as in the game.
   BLOCK      the shield 60 x 60 centred on the hitbox's left edge (12 in from the bar's), 26 over the bar's top; its number 24, outline 14 0B5569, shadow (4, 4) .25.
   INTENT     a 64 x 64 slot, the icon 72 x 72 with its middle at (30, 31), the number 22 at (2, 40) with a 12 px black outline at .5, "x4" at 18; slots 10 apart.
   POWERS     40 x 40 icons in 48 px steps from the hitbox's left, 25 under the feet, wrapping at the hitbox + 25; the amount 18 right-aligned 4 px past the icon,
              outline 10 1F1A15, shadow (3, 3) .19.
   NAMEPLATE  Kreon 24 cream, shadow (2, 1) .25, 31 under the feet on the soft plate (black .66), shown only while the creature is hovered (the powers fade to .5).
   Measured on Bean's game screenshot at the bar's own scale: an outline's visible width is .22 of the game's outline_size (3.5 px for the HP label's 16)
   and Godot's Kreon digits stand .77 of the font size against the browser's .71, so every font size here is the game's x 1.09.
   ONE UI SIZE PER FRAME, AS IN THE GAME (Bean, on a pair of Nibbits whose UI had followed their blown-up size: "wtf is this?"): the game draws all of it at one
   size on the screen whatever the creature, only a bar's width follows the creature (its hitbox). So --u is the frame's: its height / 540 (the same in every
   frame of that size; never under .55 px, the HP label 13 px), and the hitbox part of a width takes the member's own unit --uw (pages_enemyturns.js etUiFit). */
.ewin .encstage .lm{--uw:calc(var(--jf,1)*var(--f,1)*var(--mh)/var(--gsh,300));--u:max(calc(100cqh/540),.55px)}
/* THE OUTLINE IS ROUND (the game's font outline; a css text stroke draws sharp spikes at a glyph's corners): a ring of hard shadows at the outline's radius --or
   and one at half of it, in --oc, under the label's own drop shadow */
.ewin .encstage .lm :is(.lm-hp>b,.lm-blk b,.pn-num,.pi-what,.lm-pow b,.pw-pow>b){--ring:calc(var(--or)*1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*1.0) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*-1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-1.0) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*0.5) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*-0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*-0.354) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-0.5) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*-0.354) 0 var(--oc)}
.ewin .encstage .lm .lm-int{gap:0;align-items:flex-end;font-family:var(--font-t);font-weight:700;line-height:1;text-shadow:none;color:#FFF6E2}
.ewin .encstage .lm .lm-int .pi{position:relative;display:inline-flex;align-items:center;gap:calc(6*var(--u));min-width:calc(64*var(--u));min-height:calc(64*var(--u));padding-left:calc(64*var(--u));margin:0}
.ewin .encstage .lm .lm-int .pi+.pi{margin-left:calc(-10*var(--u))}
.ewin .encstage .lm .lm-int .pi:has(>.pi-what:not(.pw-defend))+.pi{margin-left:calc(8*var(--u))}
/* no words beside a Block intent: the game shows the shield alone, and the amount already stands on the HP bar's Block shield that turn */
.ewin .encstage .lm .lm-int .pi-what.pw-defend{display:none}
/* a buff or debuff the move gives is its power's icon with its amount, no name, the power's hover box on the icon (Bean, 23 Sep 2026: "No need to even say "strength"
   the icon explains it. If you wish to allow the user to hover over the icon for an explanation tool tip just do that"). The amount is the attack number's size and
   outline (.pn-num: 24, outline 2.6, cream) and stands to the LEFT of the icon, clear of it, as the attack's number stands clear of its sword (Bean: "you see how the 6 is
   bigger and more spaced out relative to the icon than the 2", then "How are these 2 icons strength and attack similar in anyway. The 2 has to go to the left of the
   sword like it was before, the issue was the sizing of the 2. It needs to be the same size as the 6 on attack"): the icon keeps the power size (40, as power.tscn) and
   the attack slot's height (64, centred); the number's box starts 40 down the slot as .pn-num's does, 7 from the icon (the game's attack swords come 7 or more past
   the number's edge on its rows, intent_attack_1..4). */
.ewin .encstage .lm .lm-int .pi-what .pw-pow{position:relative;display:inline-flex;align-items:flex-start;height:calc(64*var(--u));cursor:help;pointer-events:auto}   /* the intent lets the pointer through to the creature; its power icons take it, for their hover box */
.ewin .encstage .lm .lm-int .pi-what .pw-pow+.pw-pow{margin-left:calc(10*var(--u))}
.ewin .encstage .lm .lm-int .pi-what .pw-pow>img{order:1;flex:none;margin:calc(12*var(--u)) 0 0 calc(7*var(--u));width:calc(40*var(--u));height:calc(40*var(--u));object-fit:contain}
.ewin .encstage .lm .lm-int .pi-what .pw-pow>b{order:0;flex:none;position:relative;margin-top:calc(40*var(--u));z-index:1;font-size:calc(24*var(--u));line-height:1;font-weight:700;color:#FFF6E2;white-space:nowrap;--or:calc(2.6*var(--u));--oc:rgba(0,0,0,.5);text-shadow:var(--ring)}
.ewin .encstage .lm .lm-int .pi-what .pw-n{display:none}
.ewin .encstage .lm .lm-int .pi-what .pw-pow .av>.chg::after{display:none}
/* no Block intent over an enemy whose bar shows the Block that same turn (Bean, 23 Sep 2026: "the left nibbit (for this example) doesnt need to have a block icon
   above it. We can see its blocking in the bottom left. No need for the icon above"): the icon and the shield on the bar are the same move's one fact */
.ewin .encstage .lm:has(.lm-blk:not([hidden])) .lm-int .pi:has(>img.ia-defend){display:none}
/* the moving intents (pages_enemyturns.js etIa): the icon's own picture is pushed out of its box and the game's frame strip steps under it, 15 frames a second */
.ewin .encstage .lm .lm-int img.ia{object-fit:none;object-position:-9999px 0;background:var(--ia) 0 0/calc(var(--n)*100%) 100% no-repeat;animation:ewia calc(var(--n)*1s/15) steps(var(--n)) infinite}
@keyframes ewia{to{background-position:calc(var(--n)*-72*var(--u)) 0}}
.ia-buff{--ia:url(/img/intents/anim/buff.webp);--n:30}.ia-card_debuff{--ia:url(/img/intents/anim/card_debuff.webp);--n:15}.ia-debuff{--ia:url(/img/intents/anim/debuff.webp);--n:11}
.ia-defend{--ia:url(/img/intents/anim/defend.webp);--n:45}.ia-escape{--ia:url(/img/intents/anim/escape.webp);--n:40}.ia-heal{--ia:url(/img/intents/anim/heal.webp);--n:45}
.ia-sleep{--ia:url(/img/intents/anim/sleep.webp);--n:16}.ia-status_card{--ia:url(/img/intents/anim/status_card.webp);--n:19}.ia-stun{--ia:url(/img/intents/anim/stun.webp);--n:16}
.ia-summon{--ia:url(/img/intents/anim/summon.webp);--n:25}.ia-unknown{--ia:url(/img/intents/anim/unknown.webp);--n:30}
@media (prefers-reduced-motion:reduce){.ewin .encstage .lm .lm-int img.ia{animation:none}}
.ewin .encstage .lm .lm-int .pi>.av{position:static}
.ewin .encstage .lm .lm-int .pi>img,.ewin .encstage .lm .lm-int .pi>.av img{position:absolute;left:calc(-6*var(--u));top:calc(50% - 37*var(--u));width:calc(72*var(--u));height:calc(72*var(--u));object-fit:contain;filter:none}
.ewin .encstage .lm .lm-int .pn-num{position:absolute;left:calc(2*var(--u));top:calc(50% + 8*var(--u));z-index:1;margin:0;font-size:calc(24*var(--u));line-height:1;font-weight:700;color:#FFF6E2;--or:calc(2.6*var(--u));--oc:rgba(0,0,0,.5);text-shadow:var(--ring);white-space:nowrap}
.ewin .encstage .lm .lm-int .pn-num i{font-style:normal;font-size:calc(19.5*var(--u))}
.ewin .encstage .lm .lm-int .pi-what{display:flex;flex-wrap:wrap;align-items:center;gap:calc(2*var(--u)) calc(8*var(--u));max-width:calc(230*var(--u));font-size:calc(19.5*var(--u));line-height:1.1;font-weight:700;color:#FFF6E2;--or:calc(2.2*var(--u));--oc:#1F1A15;text-shadow:var(--ring),calc(3*var(--u)) calc(3*var(--u)) 0 rgba(0,0,0,.19)}
.ewin .encstage .lm .lm-int .pi-what>span{display:inline-flex;align-items:center;gap:calc(4*var(--u));white-space:nowrap}
.ewin .encstage .lm .lm-int .pi-what img{position:static;width:calc(32*var(--u));height:calc(32*var(--u));filter:none}
.ewin .encstage .lm .lm-hp{top:calc(100% + 7*var(--u));width:min(calc((var(--hbw,276) - 24)*var(--uw) + 24*var(--u)),var(--hbc,100000px));translate:calc(-50% + var(--hbx,0px)) 0;max-width:none;height:calc(16*var(--u));border:0;border-radius:0;background:none;box-shadow:none;z-index:3}
.ewin .encstage .lm .lm-hp::before,.ewin .encstage .lm .lm-hp::after{content:"";position:absolute;inset:0 var(--u);border:0 solid transparent;border-width:0 calc(9*var(--u));border-image:url(/img/ui/combat/hp/bg.webp) 0 9 fill/0 calc(9*var(--u)) stretch;pointer-events:none}
.ewin .encstage .lm .lm-hp::after{display:none;border-image-source:url(/img/ui/combat/hp/stroke.webp)}
.ewin .encstage .lm .lm-hp .fill{position:absolute;inset:calc(3*var(--u)) calc(5*var(--u));z-index:1;overflow:hidden;background:none;border-radius:0;clip-path:polygon(0 50%,calc(5*var(--u)) 0,calc(100% - 5*var(--u)) 0,100% 50%,calc(100% - 5*var(--u)) 100%,calc(5*var(--u)) 100%)}
.ewin .encstage .lm .lm-hp .fill::before{content:"";position:absolute;left:0;right:0;top:calc(-4*var(--u));bottom:calc(-4*var(--u));border:0 solid transparent;border-width:0 calc(6*var(--u));border-image:url(/img/ui/combat/hp/fill_red.webp) 0 6 fill/0 calc(6*var(--u)) stretch}
.ewin .encstage .lm .lm-hp>b{z-index:2;font-family:var(--font-t);font-weight:700;font-size:calc(26*var(--u));line-height:1;letter-spacing:var(--u);color:#FFF6E2;--or:calc(3.5*var(--u));--oc:#900000;text-shadow:var(--ring),calc(6*var(--u)) calc(4*var(--u)) 0 rgba(0,0,0,.25)}
.ewin .encstage .lm .lm-hp:has(>.lm-blk:not([hidden]))::after{display:block}
.ewin .encstage .lm .lm-hp:has(>.lm-blk:not([hidden])) .fill::before{border-image-source:url(/img/ui/combat/hp/fill_block.webp)}
.ewin .encstage .lm .lm-hp:has(>.lm-blk:not([hidden]))>b{--oc:#1B3045}
.ewin .encstage .lm .lm-blk{position:absolute;left:calc(-18*var(--u));top:calc(-26*var(--u));translate:none;z-index:4;width:calc(60*var(--u));height:calc(60*var(--u));display:grid;place-items:center;filter:none}
.ewin .encstage .lm .lm-blk[hidden]{display:none}
.ewin .encstage .lm .lm-blk img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain}
.ewin .encstage .lm .lm-blk b{position:relative;left:calc(.5*var(--u));top:calc(3*var(--u));translate:none;font-family:var(--font-t);font-weight:700;font-size:calc(26*var(--u));line-height:1;color:#FFF6E2;--or:calc(3.1*var(--u));--oc:#0B5569;text-shadow:var(--ring),calc(4*var(--u)) calc(4*var(--u)) 0 rgba(0,0,0,.25)}
.ewin .encstage .lm .lm-pows{position:absolute;left:calc(50% - (var(--hbw,276) - 24)*var(--uw)/2 + var(--pwx,0px));top:calc(100% + 25*var(--u));translate:none;z-index:3;display:flex;flex-wrap:wrap;gap:0 calc(8*var(--u));width:calc((var(--hbw,276) - 24)*var(--uw) + 25*var(--u));white-space:nowrap;transition:opacity .2s}
/* a bar that etUiFit stopped at the frame or halfway to a neighbour (--hbc, --hbx) takes its power row with it: the row starts 12 u in from the bar's new left
   end and wraps at its width, so two neighbours' icons no longer run into each other on a phone (wave 6 QoL) */
.ewin .encstage .lm[style*="--hbc"] .lm-pows{left:calc(50% + var(--hbx,0px) - min(calc((var(--hbw,276) - 24)*var(--uw) + 24*var(--u)),var(--hbc,100000px))/2 + 12*var(--u) + var(--pwx,0px));
  width:min(calc((var(--hbw,276) - 24)*var(--uw) + 25*var(--u)),calc(var(--hbc,100000px) + var(--u)))}.ewin .encstage .lm .lm-pow{position:relative;display:block;width:calc(40*var(--u));height:calc(40*var(--u));margin-bottom:calc(4*var(--u));cursor:help}
.ewin .encstage .lm .lm-pow img{width:100%;height:100%;object-fit:contain;filter:none}
.ewin .encstage .lm .lm-pow>i{display:grid;place-items:center;width:100%;height:100%;border-radius:50%;background:rgba(0,0,0,.5);font-style:normal;font-family:var(--font-t);font-size:calc(18*var(--u));color:#FFF6E2}
.ewin .encstage .lm .lm-pow b{position:absolute;right:calc(-4*var(--u));top:calc(21*var(--u));font-family:var(--font-t);font-weight:700;font-size:calc(19.5*var(--u));line-height:1;color:#FFF6E2;--or:calc(2.2*var(--u));--oc:#1F1A15;text-shadow:var(--ring),calc(3*var(--u)) calc(3*var(--u)) 0 rgba(0,0,0,.19)}
.ewin .encstage .lm .lm-blk .av>.chg::after,.ewin .encstage .lm .lm-pow .av>.chg::after{display:none}
.ewin .encstage .lm:not(.lm-q) .lm-name{top:calc(100% + 31*var(--u));height:calc(28*var(--u));padding:0 calc(6*var(--u));display:flex;align-items:center;font-family:var(--font-t);font-weight:400;font-size:calc(26*var(--u));line-height:1;letter-spacing:0;color:#FFF6E2;text-shadow:calc(2*var(--u)) var(--u) 0 rgba(0,0,0,.25);opacity:0;transition:opacity .2s;pointer-events:none}
.ewin .encstage .lm:not(.lm-q) .lm-name::before{left:calc(-51*var(--u));right:calc(-50*var(--u));top:calc(-21*var(--u));bottom:calc(-20*var(--u));background:rgba(0,0,0,.66)}
.ewin .encstage .lm:not(.lm-q):is(:hover,:focus-visible) .lm-name{opacity:1;transition-duration:.15s}
.ewin .encstage .lm:not(.lm-q):is(:hover,:focus-visible) .lm-pows{opacity:.5;transition-duration:.15s}

/* ---------- THE STUB: the sequence hangs from the frame (Bean, 19 Sep 2026, marking the room right under the frame: "connect the fight sequence box to the
   enemy frame actually like this. Make it feel like a ticket stub or something so its kinda connected in a slight 3d way"; earlier the same day: "how the
   turns were displayed before was fine put that under the enemy video frame", "keep the fight sequence and this toggle within the width of the fight frame").
   Exactly the frame's width; its top --tuck px sit BEHIND the frame (the frame's hard shadow falls on it), then the tear line: a perforation with a notch at
   each end, in shade above it; the dashes are a pale, thin line (Bean: "make the dotted black line a lighter color so its less noticeable"); then gold arrow, the tokens, gold arrow, the fight picker. THE STONE ("the box around
   the fight sequence isnt a good color, it should also be slightly textured like the game, a little grungy") is the game's own panel,
   images/ui/reward_screen/reward_panel (cracked teal), as a background at its true proportions (a stretched 9-slice centre smears the cracks), darkened a
   little, with a dark rim and an inner vignette. The stone, the notches (a
   mask) and the rim live on ::before so the mask never cuts the tokens' glow; the hard drop shadow is a filter on the stub, so it follows the notches ---------- */
.ewin>.ew-strip{--perf:calc(var(--tuck) + 10px);position:relative;z-index:1;min-width:0;margin-top:calc(-12px - var(--tuck));padding:calc(var(--perf) + 9px) 8px 7px;display:flex;align-items:center;gap:6px;filter:drop-shadow(0 4px 0 rgba(0,0,0,.42))}
.ewin>.ew-strip::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:0 0 13px 13px;
  background:repeating-linear-gradient(90deg,rgba(176,206,216,.26) 0 6px,transparent 6px 12px) 0 var(--perf)/100% 1px no-repeat,
    linear-gradient(rgba(0,0,0,.62),rgba(0,0,0,.2)) 0 0/100% var(--perf) no-repeat,
    linear-gradient(rgba(8,16,20,.18),rgba(8,16,20,.4)),url(/img/ui/reward_screen/reward_panel.webp) 60% 46%/max(880px,130%) auto no-repeat #2b424d;
  box-shadow:inset 0 0 0 2px rgba(6,12,15,.85),inset 0 0 20px rgba(0,0,0,.35);
  -webkit-mask:radial-gradient(circle 8px at 0 calc(var(--perf) + 1px),transparent 7px,#000 7.6px),radial-gradient(circle 8px at 100% calc(var(--perf) + 1px),transparent 7px,#000 7.6px);-webkit-mask-composite:source-in;
  mask:radial-gradient(circle 8px at 0 calc(var(--perf) + 1px),transparent 7px,#000 7.6px),radial-gradient(circle 8px at 100% calc(var(--perf) + 1px),transparent 7px,#000 7.6px);mask-composite:intersect}
/* the notches are TRANSPARENT: the page shows through them (Bean, 19 Sep 2026: "remove the black from these indents please, they should just be transparent so we
   can see the page background"). No backing layer behind the mask, ever */
.ewin .ew-step{flex:none;width:2.7rem;height:2.7rem;margin:0;padding:.3rem;border:0;border-radius:50%;background:none;box-shadow:none;cursor:pointer;display:grid;place-items:center;color:var(--gold);font-size:1.8rem;line-height:1;filter:brightness(.92) drop-shadow(0 2px 2px rgba(0,0,0,.6));transition:filter .15s}
.ewin .ew-step img{width:100%;height:100%;object-fit:contain;pointer-events:none}
.ewin .ew-step:hover{filter:brightness(1.2) drop-shadow(0 0 6px rgba(239,200,81,.55))}
.ewin .ew-step:active{filter:brightness(.8) drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.ewin .ew-step:focus-visible{outline:2px solid var(--gold);outline-offset:-2px}
/* ONE sequence at a time, ALWAYS ONE ROW (Bean, 19 Sep 2026: "we cant have the fight sequence buttons stack on smaller resolutions"), and AT MOST SEVEN
   BUTTONS IN VIEW ("We should show a max amount of fight sequence buttons of 7, showing 9 and a half is too much"). The scroller .ew-toks is a size
   container, so the row knows the room it really has: --nv = min(turns, 7) equal columns fill it exactly (--col), a token centred in each, between 2 and
   2.5 rem. A row of more than seven turns, or one whose columns would fall under 2 rem (a phone), SLIDES: it keeps the full 2.5 rem token (--big), its
   columns never shrink under the token, and the stepper moves the window by whole columns (pages_enemyturns.js lightStrip), so no half button ever
   shows; the side with more fades (--fl / --fr, etEdges). Never two rows. */
.ewin .ew-toks{container-type:inline-size;flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:stretch;gap:6px;padding:6px 6px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;
  -webkit-mask:linear-gradient(90deg,transparent var(--xl,0px),#000 calc(var(--xl,0px) + var(--fl,0px)),#000 calc(100% - var(--xr,0px) - var(--fr,0px)),transparent calc(100% - var(--xr,0px)));mask:linear-gradient(90deg,transparent var(--xl,0px),#000 calc(var(--xl,0px) + var(--fl,0px)),#000 calc(100% - var(--xr,0px) - var(--fr,0px)),transparent calc(100% - var(--xr,0px)))}   /* --xl / --xr (etEdges): a button the resting window cuts is masked out whole */
.ewin .ew-toks::-webkit-scrollbar{display:none}
/* --nvj is the WHOLE number of columns in view, written by the stepper (etCols: at most seven, as many 2.5 rem tokens as the stub holds when the row
   slides); without it (no script yet) the count is min(turns, 7). --twmin is the smallest token a row that fits may use (2.5 rem when stacked: a thumb) */
.ewin .ew-pass{--twmin:2rem;--brk:14px;--nv:var(--nvj,min(var(--n),7));--fit:calc((100cqw - 4px - (var(--nv) - 1)*6px - var(--mk,0)*var(--brk))/var(--nv));
  --big:max(clamp(0px,calc((var(--n) - 7)*9999px),.5rem),clamp(0px,calc((var(--twmin) - var(--fit))*9999),.5rem));--tw:min(2.5rem,calc(clamp(var(--twmin),var(--fit),2.5rem) + var(--big)));--col:max(var(--tw),var(--fit));
  display:grid;grid-template-columns:repeat(var(--n),var(--col));justify-items:center;gap:6px;padding:0 2px;min-width:max-content}
.ewin .ew-pass[hidden]{display:none}
/* where a triggered phase begins inside the fight's row (etBrkHtml; its hover box says what triggers it): a small gold diamond, nothing else (Bean: "just
   remove the vertical dotted line that goes through the diamond"). It rides INSIDE the phase's first token, hung half way into the gap before it, so it
   takes no column of its own and the window of seven stays seven whole columns.
   THE DIAMOND GETS ITS OWN ROOM (Bean, 20 Sep 2026: "There needs to be extra space here so it looks good, the yellow square has no space here, add extra
   space for this spcifically only"): the 14 px diamond filled the ordinary 17 px gap. The phase's first column alone is --brk wider (etPassCols writes the
   pass's columns inline) and its token keeps --brk of left margin, so it stays centred in the ordinary part of the column; the diamond sits in the middle of
   the wider gap. Every other gap is untouched. --mk (marks in the pass, inline) takes that room out of --fit, so seven whole buttons PLUS the wider gap fill
   the stub exactly; a window without the divider shows --brk of plain bar at its right end, never a sliver of the next button on a desktop */
.ewin .ew-tok.ew-ph0{margin-left:var(--brk)}
.ewin .ew-tok>.ew-brk{position:absolute;top:0;bottom:0;width:14px;right:calc(100% + (6px + var(--col) - var(--tw) + var(--brk))/2 - 7px);cursor:help}
.ewin .ew-tok>.ew-brk::after{content:"";position:absolute;left:50%;top:50%;width:7px;height:7px;translate:-50% -50%;rotate:45deg;background:var(--gold);box-shadow:0 0 0 2px #14242a,0 1px 2px 2px rgba(0,0,0,.5)}
/* the bar is EXACTLY as wide as the frame and the sequence spreads over it (equal columns, a token centred in each), so it reads as the frame's own
   control bar, not as an island under it. A newly picked sequence fades in. The fight picker is the site's dropdown (.sel select),
   in the gold of the current turn, big enough to read (a list of small radio words was rejected: "looks terrible and doesnt switch ... clearly") */
.ewin .ew-pass.in{animation:ewpassin .28s ease-out both}
@keyframes ewpassin{0%{opacity:0;translate:10px 0}100%{opacity:1;translate:0 0}}
.ewin .ew-box>.ew-pick{position:absolute;right:10px;bottom:10px;z-index:4}   /* in the frame's bottom right corner ("Move this dropdown within the fight screen in the bottom right corner") */
/* the Ascension control: the picker's twin in the frame's bottom LEFT corner, the top bar's flame then the same plated dropdown, no word (Bean, 22 Sep 2026: "move the
   Ascension filter to inside the enemy area in the bottom left", "No need for the 'ascension' text just the toggle and it should be a dropdown with a fire icon to the
   left of it"; pages.js ascCtl). Under 600 px of frame both pickers share the bottom line: the fight picker keeps the right, this one the left, each no wider than half. */
.ewin .ew-box>.asc-pick{position:absolute;left:10px;bottom:10px;z-index:4;display:inline-flex;align-items:center;gap:6px}   /* its own classes, not the picker's: the picker's change handler and tools/enemy_patterns_check.js read .ew-pick / .ew-sel as a lineup picker */
.ewin .ew-box>.asc-pick .asc-flame{width:1.6rem;height:2.2rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ewin .ew-box>.asc-pick select{min-width:5.2rem}
@container (max-width:600px){.ewin>.ew-box>:is(.ew-pick,.asc-pick){max-width:calc(50% - 14px)}.ewin>.ew-box>:is(.ew-pick,.asc-pick) select{max-width:100%}}
/* a picker that names its cases in words ("While Torch Head Amalgam is alive") is wider than the corner beside the nameplate and the powers under it: the enemy
   stands one picker's height higher, so the words have the frame's bottom line to themselves (20 Sep 2026: on a phone the Frog Knight's lay over its power row) */
/* (wave 5: only while the FRAME is narrower than 600 px, whatever the viewport: the frame is an inline-size container for this one query. On a wider frame the
   picker's words and the powers under the nameplate never meet, and the raise made 22 of the 110 enemies stand a fifth smaller and higher than the rest: Bean,
   22 Sep 2026, "different enemy pages enemies being sized differently than one another or too high / low within their housing compared to others"; the sweep in
   docs/wave5/scratch/enemies/sweep_pages.js measures the two rows against each other) */
.ewin>.ew-box{container-type:inline-size}
@container (max-width:600px){.ewin>.ew-box:has(>.ew-pick>.ew-sel[data-wide])>.enc-hero{--feet:calc(4.7rem + 10px + 2.6rem)}}
.ewin :is(.ew-pick,.asc-pick) select{padding:7px 30px 5px 12px;border:2px solid rgba(10,18,22,.9);border-radius:8px;background:rgba(9,17,21,.84);box-shadow:0 2px 9px rgba(0,0,0,.26);color:var(--gold-x);font-family:var(--font-t);font-size:1rem;font-weight:700;line-height:1.1;cursor:pointer}
/* its shadow is soft and faint (Bean: "needs to be more diffused and lesser, it just looks like its part of the dropdown its [s]o bold": a hard 3 px ledge read as a second edge of the box) */
.ewin :is(.ew-pick,.asc-pick) select:hover{border-color:rgba(176,206,216,.4)}
/* clicking it changes NOTHING about its look ("when you click the dropdown it doesnt produce that ugly inner glow"): no outline, no gold border, no shadow
   inside. Only a keyboard focus (no data-m: pages_enemyturns.js marks a pointer press) shows the site's white ring, OUTSIDE the box */
.ewin :is(.ew-pick,.asc-pick) select:focus,.ewin :is(.ew-pick,.asc-pick) select:active{outline:0;box-shadow:0 2px 9px rgba(0,0,0,.26)}
.ewin :is(.ew-pick,.asc-pick) select[data-m]:hover,.ewin :is(.ew-pick,.asc-pick) select[data-m]:focus{border-color:rgba(10,18,22,.9)}
.ewin :is(.ew-pick,.asc-pick) select:focus-visible:not([data-m]){outline:2px solid #fff;outline-offset:2px}
.ewin :is(.ew-pick,.asc-pick) select option{color:#fff6e2;background:#0f1c22}
.ewin :is(.ew-pick,.asc-pick).sel::after{right:11px;border-color:var(--gold-x)}
/* a token: a DARK SOCKET sunk into the stub's stone (Bean, 19 Sep 2026: "the buttons 1, 2, 3 etc for the fight sequence ... that map esque color they are now
   doesnt fit here it should be a darker or more fitting color for the display"; they were the map's parchment node). THE CURRENT ONE IS LIT: a warm lamp with
   a light glow, no ring anywhere ("I don't like the super bright outline on this, the button itself should just get brighter no outline needed unless its a
   light glow, also the number is being covered by the outline too"); a hovered one is half way. Fills and box-shadows only (no filter, no image): the badge
   is a child, so it always paints over its button's glow; the keyboard focus is a soft white halo */
.ewin .ew-tok{position:relative;flex:none;width:var(--tw,2.5rem);height:var(--tw,2.5rem);margin:0;padding:0;border:0;border-radius:50%;cursor:pointer;display:grid;place-items:center;
  background:radial-gradient(circle at 50% 30%,#1c323b,#0e1b21 78%);box-shadow:inset 0 2px 4px rgba(0,0,0,.65),inset 0 0 0 1px rgba(0,0,0,.45),0 1px 0 rgba(255,255,255,.09);transition:background-color .15s,box-shadow .15s}
.ewin .ew-tok img{width:calc(var(--tw,2.5rem)*.6);height:calc(var(--tw,2.5rem)*.6);object-fit:contain;opacity:.62;filter:drop-shadow(0 1px 0 rgba(0,0,0,.6));pointer-events:none;transition:opacity .15s}
.ewin .ew-tok b{position:absolute;z-index:1;right:-.22rem;bottom:-.22rem;min-width:1.1rem;height:1.1rem;padding:0 .2rem;border-radius:.6rem;display:grid;place-items:center;background:#15252b;border:1px solid rgba(255,255,255,.3);font-family:var(--font-t);font-weight:700;font-size:.68rem;line-height:1;color:#fff6e2}
.ewin .ew-tok:hover{background:radial-gradient(circle at 50% 30%,#2b4a55,#16282f 78%)}
.ewin .ew-tok:hover img{opacity:.9}
.ewin .ew-tok.on{background:radial-gradient(circle at 50% 30%,#ffe9ad,#d9ab4e 75%);box-shadow:inset 0 1px 0 rgba(255,255,255,.55),inset 0 -2px 3px rgba(110,70,8,.45),0 0 9px rgba(255,226,150,.42)}
.ewin .ew-tok.on img{opacity:1}
.ewin .ew-tok.on b{background:var(--gold);color:#241600;border-color:#241600}
.ewin .ew-tok:focus-visible{outline:0;box-shadow:inset 0 2px 4px rgba(0,0,0,.65),0 0 0 2px rgba(255,255,255,.85),0 0 8px rgba(255,255,255,.5)}
.ewin .ew-tok.on:focus-visible{box-shadow:inset 0 1px 0 rgba(255,255,255,.55),0 0 0 2px rgba(255,255,255,.85),0 0 9px rgba(255,226,150,.5)}
/* A FIGHT PAGE'S TOKEN (.ew-pip) IS THE SAME SOCKET, WITH WHAT THE LINEUP INTENDS THAT TURN IN IT (Bean, 20 Sep 2026: "we still need it to match looking as
   good as that, they cant be blank"; it was a bare number a size under the tokens): one icon at the solo size, two side by side, three as a triangle
   (pages_enemyturns.js etFightTok: one icon per intent family, attacks first). The number badge is the solo token's. */
.ewin .ew-tok .ew-tk{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;width:calc(var(--tw,2.5rem)*.98);pointer-events:none}
.ewin .ew-tok .ew-tk2 img{width:calc(var(--tw,2.5rem)*.5);height:calc(var(--tw,2.5rem)*.5)}
.ewin .ew-tok .ew-tk2 img+img{margin-left:calc(var(--tw,2.5rem)*-.06)}
.ewin .ew-tok .ew-tk3{translate:0 -4%}
.ewin .ew-tok .ew-tk3 img{width:calc(var(--tw,2.5rem)*.43);height:calc(var(--tw,2.5rem)*.43);margin:calc(var(--tw,2.5rem)*-.04) calc(var(--tw,2.5rem)*-.01)}
/* A DEATH THAT ADDS ENEMIES IS A STEP OF THE FIGHT (Bean, 20 Sep 2026: "Phrog parasite needs to show in its fight sequence buttons it dying and the wrigglers
   spawning in, that is apart of the fight"; pages_enemyturns.js etStagePlans / etEvTok). WHEN the enemy dies is the player's doing, so the death is an EVENT in
   the row, not a numbered turn: the same stone socket (the lit one the same gold disc: nothing restyled), holding the icon of the power that does it, and where a
   turn wears its number a small gold DIAMOND, the mark the row already uses for "the fight changes here" (.ew-brk). The turns after it are the added enemies',
   numbered on. No new size, nothing that moves: the event takes an ordinary column. */
.ewin .ew-tok .ew-evm{position:absolute;z-index:1;right:.02rem;bottom:.02rem;width:.5rem;height:.5rem;rotate:45deg;background:var(--gold);box-shadow:0 0 0 2px #14242a,0 1px 2px 2px rgba(0,0,0,.5);pointer-events:none}
.ewin .ew-tok.on .ew-evm{box-shadow:0 0 0 1.5px #241600,0 1px 2px 1px rgba(0,0,0,.35)}
.ewin .ew-tok.ew-ev{cursor:pointer}
/* in the frame: the enemies a death adds wait in their own lineup (.ew-aft, hidden until their event is picked; a group of them, .ew-grp, stands like a fight's
   lineup: the twin selectors above; a lone comeback keeps the hero's sizes). On an enemy page the enemy's OWN lineup steps aside while they show: out of sight but
   still laid out, because the live skeleton reads the still's box */
.ewin .encstage .lineup.ew-off{visibility:hidden;pointer-events:none}
.ewin .encstage .lineup.ew-off *{animation-play-state:paused}
.ewin .encstage .lineup.ew-grp{--ico:min(2.2rem,7cqh)}
/* the added enemies at their size beside the one that died (--rs, etStagePlans: a Sneaky Gremlin is half a Gremlin Merc; without it the lineup's tallest fills the frame) */
.ewin .encstage .lineup.ew-aft{--mh:calc((100cqh - var(--top) - var(--feet))*var(--ms,1)*var(--rs,1))}
@media (max-width:640px){.ewin .encstage .lineup.ew-grp{--ico:min(1.7rem,6cqh)}}
/* before the script counts the columns (etCols), a fight's stub assumes twelve where an enemy page assumes seven, so the row does not jump on load. From 700 px of
   arena, the width etColCap starts counting at (it was 900: between the two, a phone-to-laptop window of 741 to 940 px, the static page drew seven columns and the
   script then packed twelve into the same stub, wave 6 QoL) */
@container ehero (min-width:699.5px){.ewin-fight .ew-pass{--nv:var(--nvj,min(var(--n),12))}}

/* ---------- the facts: separate titled boxes under the strip (pages_acts.js factBox / factRow). A short small-caps title, then rows of the game's icon + the
   value (+ one quiet second line). A wrapping flex row, so every row is filled edge to edge and no box is left beside a hole; a box with a sentence in it
   (.wide) takes a double share ---------- */
.ew-facts{display:flex;flex-wrap:wrap;gap:10px;margin:4px 0 0}
.ew-fact{flex:1 1 9.5rem;display:flex;flex-direction:column;justify-content:flex-start;gap:6px;min-width:0;padding:9px 14px 11px;border-radius:10px;background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.ew-fact.wide{flex:2 1 19rem}
/* a box with three or more rows (an enemy met in many fights) takes the whole row and lays its rows out in columns, so the short boxes beside it are never stretched tall */
.ew-fact.full{flex:1 1 100%;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,21rem),1fr));gap:8px 24px;align-items:start}
.ew-fact.full>.ew-fact-h{grid-column:1/-1}
.ew-fact[data-tip]{cursor:help}
.ew-fact-h{font-family:var(--font-t);font-size:.7rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;line-height:1;color:var(--dim)}
.ew-fact-row{display:flex;align-items:center;gap:10px;min-width:0}
.ew-fact-i{flex:none;width:2.7rem;height:2.7rem;display:grid;place-items:center}
.ew-fact-i .mi{width:2.5rem;height:2.5rem}
.ew-fact-i .power,.ew-fact-i .potion{width:2.7rem;height:2.7rem}   /* a potion in a fact box (the "Starts when" box) keeps the box's icon size */
/* the sprite icons are the site's 3D icons (pages_acts.js factIco3d: .relic with data-rimself; icons3d.css gives the hover tilt, lift, ground shadow, rim and
   sheen). The wrapper fills the icon cell; the sprite keeps the 88% the effect layers are cut for */
.ew-fact-i .ew-fact-3d{width:100%;height:100%;cursor:default;--lift:7px;--hov-scale:1.12}
.ew-fact[data-tip] .ew-fact-3d{cursor:help}
.ew-fact-i .ew-fact-3d .mi{width:92%;height:92%}
.ew-fact-i .ew-fact-3d :is(.shd,.rim,.sheen){inset:4%}
/* NO PARCHMENT NODE BEHIND A FACT ICON (Bean, 20 Sep 2026: "it has that yellow map texture I don't like"): the boxes use the run-history icons (pages_acts.js ROOM_ICO),
   full-colour sprites that fill their square and stand on the dark box by themselves */
.ew-fact-i img[src*="run_history/"]{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.55))}
.ew-part-i:has(>img[src*="map/icons/"]){border-radius:50%;background:url(/img/ui/map/icons/map_node_background.webp) center/130% no-repeat}
.ew-part-i>img[src*="map/icons/"]{scale:1.5;filter:none}
.ew-fact-t{min-width:0;font-family:var(--font-t);font-size:1.02rem;line-height:1.25;color:var(--text)}
.ew-fact-t b{font-size:1.25rem;color:#fff}
.ew-fact-t .ew-k{font-style:normal;font-weight:700;color:#fff}
.ew-fact-t small{display:block;margin-top:1px;font-family:var(--font-b);font-size:.86rem;line-height:1.3;color:var(--muted)}
.ew-fact-t a{color:var(--gold)}

/* ---------- fights (the encounter pages, Bean 18 Sep 2026: "all one fight"): the same arena with the whole opening lineup in the box ----------
   The box is wider (3:2) so three knights stand side by side at a size that still reads; the members are sized against the tallest (encStage's relative
   sizing, the .42 floor), the slots may lean into each other a little (the game's slots overlap too), every member has its own intent (smaller than the
   solo's), HP bar, nameplate and power row. Numbers in the box and the floating text are the base game's: a fight page shows no Ascension (the solo pages do). */
.ewin-fight .enc-hero{aspect-ratio:3/2;--ico:min(2.2rem,7cqh);--top:calc(var(--ico) + 28px);--feet:calc(4.4rem + 8px)}
.ewin-fight .encstage .lineup,.ewin .encstage .lineup.ew-grp{left:2%;right:2%;gap:0}
/* THE MEMBERS SPREAD OUT, UP TO A CAP (Bean, 21 Sep 2026, on three Inklets standing shoulder to shoulder in the middle of a 1,320 px box: "you can spread them
   out in general on multi enemy fight scenes, they are too close together just keep a safe space around what I've drawn now, however keep a max distance between
   each char or it will look dumb as well being too far apart"). The row was centred with a fixed 4% gap, so a wide box left two thirds of itself empty. Now the
   room between two members is an element of its own (.lm-gap, pages_enemyturns.js ewLineupHtml) and the row's two ends are its ::before / ::after: all of them
   share the box's free width, a gap taking twice an end's share, and a gap stops at --gapmax (the ends take the rest, so the group stays centred). The safe
   space is the gap's floor, 4% of the box as before: a member's box is as wide as everything drawn for it (still, HP bar, name, powers), so nothing of one
   member ever touches its neighbour's, and when there is no free width the members shrink exactly as they did. No script, no measuring: flexbox does it. */
.ewin-fight .encstage .lineup::before,.ewin-fight .encstage .lineup::after,.ewin .encstage .lineup.ew-grp::before,.ewin .encstage .lineup.ew-grp::after{content:"";flex:1 1 0;min-width:0}
.encstage .lm-gap{flex:2 1 0;min-width:4%;max-width:var(--gapmax,clamp(3rem,11cqw,7.5rem));height:0}
.ewin-fight .encstage .lm,.ewin .encstage .ew-grp .lm{max-width:calc(100%/var(--n,1) + 6%)}
/* an intent never leaves its own slot: past the slot's width the label wraps under the icons (the rightmost member's used to run out of the box) */
.ewin-fight .encstage .lm-int,.ewin .encstage .ew-grp .lm-int{width:max-content;max-width:calc(96cqw/var(--n,1));flex-wrap:wrap;justify-content:center;bottom:calc(100% - var(--vt,0px) + 6px)}   /* 6 px of box + the 4 px the line keeps under its icons (they sit on the text baseline) = 10 px seen */
/* the two outer members: an intent wider than its creature grows toward the middle of the box, never past the box edge (seen at 375 px: the third knight's
   "6, 5 Block" lost its last letters). min-width keeps a narrow intent centred over its creature */
.ewin-fight .encstage .lm:first-child:not(:only-child) .lm-int,.ewin .encstage .ew-grp .lm:first-child:not(:only-child) .lm-int{left:0;right:auto;translate:none;min-width:100%;animation-name:ewbobedge}
.ewin-fight .encstage .lm:last-child:not(:only-child) .lm-int,.ewin .encstage .ew-grp .lm:last-child:not(:only-child) .lm-int{left:auto;right:0;translate:none;min-width:100%;animation-name:ewbobedge}
@keyframes ewbobedge{0%,100%{translate:0 0}50%{translate:0 -5px}}   /* style.css intentbob without its -50% (that one centres the intent) */
/* a fight page carries the Base / A8 / A9+ control in its title row (Bean, 19 Sep 2026: "We are also missing the a1 a8 and a9+ toggles"): frame, fact boxes
   and cast tiles follow html[data-asc] like an enemy page (enemy.css). The HP bar's marker hangs outside the number so the bar's text stays centred. */
.ewin-fight .lm-hp .av,.ewin .ew-aft .lm-hp .av{position:relative;display:inline-block}
.ewin-fight .lm-hp .av>.chg::after,.ewin .ew-aft .lm-hp .av>.chg::after{position:absolute;left:100%;top:.1em;margin:0 0 0 .1em;vertical-align:baseline}
/* a member past the end of its own pattern (a stop: it left or died) goes dim with nothing over its head */
.ewin-fight .lm.ew-gone,.ewin .ew-aft .lm.ew-gone{opacity:.3;filter:grayscale(.7)}
.ewin-fight .lm.ew-gone .lm-int,.ewin-fight .lm.ew-gone .lm-hp,.ewin-fight .lm.ew-gone .lm-pows,.ewin .ew-aft .lm.ew-gone .lm-int,.ewin .ew-aft .lm.ew-gone .lm-hp,.ewin .ew-aft .lm.ew-gone .lm-pows{visibility:hidden}
/* a random pick: the game's "?" map icon standing in the slot (the pool is in its hover box and under the floating text) */
/* the possible lineups (pages_enemyturns.js ewLineups): one .lineup per draw, only the picked one shown; a random pick carries the game's "?" before its name; the
   lineup picker sits in the frame's TOP right corner (the bottom one is where the last member's nameplate and powers stand) */
.ewin-fight .encstage .lineup[hidden],.ewin .encstage .lineup[hidden]{display:none}
.ewin-fight .encstage .lineup.in,.ewin .encstage .lineup.in{animation:ewlinein .28s ease-out both}
@keyframes ewlinein{from{opacity:0}to{opacity:1}}
.ewin-fight .lm-rq,.ewin .lm-rq{display:inline-block;width:1.35em;height:1.35em;margin:-.2em .3em -.2em -.15em;vertical-align:-.3em;cursor:help}
.ewin-fight .lm-rq img,.ewin .lm-rq img{display:block;width:100%;height:100%;object-fit:contain}
.ewin .ew-box>.ew-pick.ew-pick-l{top:10px;bottom:auto}
/* ... and the member standing under that corner never reaches into it: a lineup whose right-hand member is its tallest (--fl, ewLineupHtml) stands a little smaller, so that
   member's intent starts under the picker (48 px: 10 + the picker + a gap); a lineup with a short member there keeps the full height */
.ewin-fight .ew-box:has(>.ew-pick-l) .lineup{--mh:min(calc((100cqh - var(--top) - var(--feet))*var(--ms,1)),calc((100cqh - var(--feet) - 48px - var(--ico) - 12px)/var(--fl,1)),calc((var(--rowcap,86cqw) - (var(--n,1) - 1)*4cqw)/var(--sar,1)))}
/* EVERY CREATURE STANDS BY ITS VISIBLE BODY (wave 4, 21 Sep 2026; Bean: "Some enemies are being displayed too high ... So measure by the visual itself";
   pages_enemyturns.js ewVb / ewHeroVb, docs/wave4/enemies.md). A member with the class vb IS its still's body box (app/stillbox.js): shape --ar, height the usual
   --f share of --mh (the slot's max-width still holds: a wide body shrinks with its shape and stays on the ground line), and the whole picture hangs inside it by
   --ix --iy --iw --ih (percent of the body box; it may reach past the box: a shadow under the feet, a flyer's far shadow). The picture fills its own box exactly,
   which is what creatureanim.js place() reads for the hover clip. While the enemy page's still is hovered art3d.js wraps it in a plate of the still's own pixel
   size: the plate takes the still's place and the still fills the plate, so nothing moves. */
.ewin .encstage .lm.vb{height:auto;aspect-ratio:var(--ar);width:calc(var(--jf,1)*var(--f,1)*var(--mh)*var(--ar))}   /* --jf: the row fitted to its box while summoned minions stand in it (etMinFit) */
.ewin .encstage .lineup.ew-join .lm:not(.vb){height:calc(var(--jf,1)*var(--f,1)*var(--mh))}
.ewin .encstage .lm.vb .lm-img{position:absolute;left:var(--ix);top:var(--iy);width:var(--iw);height:var(--ih);max-width:none;max-height:none;object-fit:fill}
/* THE ROW SHRINKS AS ONE (wave 5; the tiles' rule, pages_enemies.js mtStand, brought to the fight scenes). A body box has no canvas padding around it, so the row
   keeps its air itself: the members' widths in creature heights add up to --sar (ewLineupHtml), and when that row with its 4 % gaps would be wider than --rowcap (86 % of the box; 72 % in the page-wide fight frame, below) of the
   box, the creature height is capped so it fits: everyone shrinks by the same share and the game's proportions stay. The per-member cap of 86 % / n it replaces
   squeezed one member alone: the Slumbering Beetle stood at two thirds of its size between two full-size Bowlbugs (sweep_pages.js, 22 Sep 2026). The room between
   two members may still grow a little further than in a canvas row (Bean, 21 Sep 2026: "they are too close together ... however keep a max distance") */
.ewin-fight .encstage .lineup,.ewin .encstage .lineup.ew-grp{--mh:min(calc((100cqh - var(--top) - var(--feet))*var(--ms,1)*var(--rs,1)),calc((var(--rowcap,86cqw) - (var(--n,1) - 1)*4cqw)/var(--sar,1)))}
.ewin-fight .encstage .lm.vb,.ewin .encstage .ew-grp .lm.vb{max-width:none}
.ewin-fight .encstage .lineup:has(>.lm.vb),.ewin .encstage .lineup.ew-grp:has(>.lm.vb){--gapmax:clamp(3.5rem,13cqw,9rem)}
.ewin .encstage .lm.vb>.a3d{position:absolute;left:var(--ix);top:var(--iy)}
.ewin .encstage .lm.vb>.a3d .lm-img{position:relative;left:0;top:0;width:100%;height:100%}
/* ONE BODY, SEVERAL TARGETS (the Kaiser Crab: Crusher and Rocket are the two claws of one crab, ewLineupHtml): the members' boxes join into the body's box, the first
   holds the picture over both, and the body breathes whichever half is hovered */
@media (prefers-reduced-motion:no-preference){.ewin .encstage .lineup:has(>a.lm-part:hover) .lm-img,.ewin .encstage .lineup:has(>a.lm-part:focus-visible) .lm-img{animation:breathe 2.2s ease-in-out infinite}}
/* the cast under a fight's hero: one row, the tiles stretch over all of it (a box with an empty half was rejected on 19 Sep 2026) */
.ehero-fight>.ew-cast{margin-top:14px}
.ehero-fight>.ew-cast .ew-cm{flex:1 1 13rem}
.ewin-fight .lm.lm-q{display:flex;align-items:flex-end;justify-content:center;cursor:help}
.ewin-fight .lm-qimg{height:auto;width:min(100%,7.5rem);max-height:100%;opacity:.92;filter:drop-shadow(0 6px 5px rgba(0,0,0,.6));animation:intentbob 2.4s ease-in-out infinite}
.ewin-fight .lm-q:hover .lm-qimg,.ewin-fight .lm-q:focus-visible .lm-qimg{opacity:1}
.ewin-fight .lm-q .lm-name{color:var(--muted)}
/* the cast box under the arena: the members' own pages (Bean: "some way to differentiate from 'Here is the real fight' and here are the individual characters") */
.ew-cast{margin:var(--stack) 0 0;padding:12px var(--pad) 14px;border-radius:12px;background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.ew-cast-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;margin:0 0 10px}
.ew-cast-h h2{margin:0;font-size:1.3rem}
.ew-cast-tag{font-family:var(--font-t);font-size:.74rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}
.ew-cast-row{display:flex;flex-wrap:wrap;gap:10px}
.ew-cm{position:relative;display:inline-flex;align-items:center;gap:10px;padding:7px 14px 7px 8px;border-radius:10px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.1);color:#fff6e2;text-decoration:none;transition:border-color .15s,background-color .15s}
a.ew-cm:hover,a.ew-cm:focus-visible{border-color:var(--gold);background:rgba(239,200,81,.07);text-decoration:none;outline:0}
.ew-cm-im{flex:none;width:3.4rem;height:3.4rem;display:grid;place-items:center}
/* width / height 100%, not max-: the cell is a grid and its row grows with the picture, so a tall still (an Inklet is 53 x 83) was never held by max-height and hung
   out of the tile's foot (Bean, 21 Sep 2026: "enemy is out of the box here") */
.ew-cm-im img{width:100%;height:100%;min-width:0;min-height:0;object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.ew-cm-t{display:flex;flex-direction:column;gap:2px;font-family:var(--font-t);line-height:1.15}
.ew-cm-t b{font-size:1.1rem}
.ew-cm-t b i{font-style:normal;color:var(--gold-x)}
.ew-cm-k{font-size:.82rem;color:var(--muted);font-family:var(--font-b)}
.ew-cm-tag{font-size:.7rem;letter-spacing:.08em;text-transform:uppercase;color:var(--gold-x)}
/* the solo page's plate over the arena: "One part of the Queen fight", one short line, the fight's button; its own box */
.ew-part{display:flex;align-items:center;gap:14px;margin:0 0 14px;padding:9px 14px;border-radius:10px;background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.ew-part-i{flex:none;width:2.6rem;height:2.6rem;display:grid;place-items:center}
.ew-part-i .mi{width:2.4rem;height:2.4rem}
.ew-part-t{flex:1 1 16rem;min-width:0;display:flex;flex-direction:column;gap:2px;line-height:1.3}
.ew-part-h{font-family:var(--font-t);font-size:1.15rem;color:#fff6e2}
.ew-part-h a{color:var(--gold-x)}
.ew-part-s{font-size:.93rem;color:var(--muted)}
.ew-part-s a{color:var(--gold)}
.ew-part-go{flex:none;font-size:.9rem}

/* ---------- A FIGHT'S FRAME IS AS WIDE AS THE PAGE (Bean, 20 Sep 2026: "On multi enemy combats we need to put the enemy screen the full width of the screen
   (besides safe space the site has). Then we put the Fight, Health, and Gold + the headline info above it"). A fight page is ONE column at every width: the
   headline (title, kind, the Ascension control at its right end), the fact boxes as one wrapping row (Fight takes two shares, every row is filled), the frame
   over the whole content width (2.8:1, never under 19 rem or over 26 rem tall: a lineup is wide, not tall), the stub hanging from it, then the cast row.
   The markup is the enemy page's (.ew-left > .ew-head + .ew-facts); .ew-left dissolves. The selectors out-rank the two-column rules above and the stacked
   rules below (.ehero-fight>.ewin.ewin-fight), so the order is the same on a phone. ---------- */
.ehero-fight>.ewin.ewin-fight{grid-template-columns:minmax(0,1fr);grid-template-areas:"head" "facts" "box" "strip";grid-template-rows:none;gap:12px}
.ehero-fight>.ewin.ewin-fight.noturns{grid-template-areas:"head" "facts" "box"}
.ehero-fight>.ewin.ewin-fight>.ew-left{display:contents}
/* the Ascension control rides at the title row's right end while the head is wide enough to hold a title beside it; under that it takes the enemy page's place:
   its own line, left-aligned (right-aligned on a line of its own it left a hole beside it). The note is a full-basis flex item: without the cap the control
   claims 800 px and drops under any title longer than "The Kin" */
@container (min-width:54rem){
  .ehero-fight .ew-head .asc-ctl,.ehero-fight .ew-head .asc-none{flex-basis:auto;max-width:30rem;margin:0 0 0 auto;justify-content:flex-end}
  .ehero-fight .ew-head .asc-ctl .asc-note{text-align:right}
  .ehero-fight .ew-head .asc-ctl button{width:5.4rem}
  .ehero-fight .ew-head .asc-ctl .asc-l{display:inline}
}
.ehero-fight>.ewin.ewin-fight .ew-facts{margin:0;gap:8px}
.ehero-fight>.ewin.ewin-fight .ew-fact{flex:1 1 11rem;min-width:0}
.ehero-fight>.ewin.ewin-fight .ew-fact.wide,.ehero-fight>.ewin.ewin-fight .ew-fact.full{flex:2 1 19rem;display:flex}
@container ehero (min-width:900px){
  .ehero-fight>.ewin.ewin-fight>.ew-box{align-self:auto;aspect-ratio:2.8/1;min-height:19rem;max-height:26rem;max-width:100%;--rowcap:72cqw}   /* --rowcap (wave 5): in this low, wide frame a row stops at 72 % of the width, a seventh of the frame free at either end; the stacked 16:10 frame stops at 78 % (its width is the tighter side), the phone's 5:4 frame at 86 % */   /* max-width (wave 4, 21 Sep 2026): between 700 and 798 px of page the 19rem floor times 2.8 made the frame WIDER than the page (798 px in a 718 px column at a 760 px window, 54 px of sideways page scroll, since the page frame got narrower the same day); now the floor only makes it taller */
}
/* Bean, 20 Sep 2026, on The Kin in the page-wide frame: "The enemies are shown a bit big now since we are spanning the full width, you can make them smaller". The
   frame is lower (2.8:1, 19 to 26 rem; it was 2.4:1, 21 to 30 rem) and a member takes a share of the height between its intent and its feet (--ms), so a lineup
   stands in its room instead of filling it. THE SHARE IS .64 (wave 5, 22 Sep 2026; it was .88; Bean, on two Nibbits and two Chompers each 200 px tall in a
   361 px frame, the pair from edge to edge: "multi enemy combat enemies are being shown way too large within their space, shrink them its overwhelming"):
   the tallest member is .40 of the frame's height (was .55), the intents start at .28 of it instead of .13, and with the page-wide frame's row cap of 72 %
   (--rowcap above; THE ROW SHRINKS AS ONE below; it was 86 %) a pair stands with a seventh of the frame free at either end. The enemy page's single hero keeps
   its own rule (it shares no number with this). */
.ehero-fight .enc-hero{--ms:.64}

/* ---------- THE ENEMY PAGE'S OWN BOXES (wave 5, pages_enemies.js enFacts) ----------
   FOUND IN (Bean, 22 Sep 2026: ""found in" section should relate to the act you find them in, not the pool. So put use a cool act symbol on the right side, on the left
   it has 2 lines "found in" and underneath The Overgrowth""): the act's name in the value cell, the act's symbol at the row's right end. The game has no emblem per
   act (three bosses each, no crest in the assets), and the site already marks an act by its GEM (the Act filter chips, the event cards' act chips: events.css
   .evq-act::before, one colour per act), so the symbol is that gem cut large (pages_enemies.js enActGem): a rotated square with four lit facets and a table facet
   in the act's colour, a soft glow of the same colour behind it. A first try, a round medallion of the act's first room thumbnail, was a dark smudge at 2.7 rem. PART OF ("This should say
   "Apart of" as a small title (displayed the same as "found in" in the below box. Below that "Overgrowth Crawlers Fight" and the "See fight" button should be pinnd to
   the left side centered height wise in this box"): the button stands where a row's icon stands, at the left edge and centred in the box's height, the title and the
   fight's name to its right. Both are ordinary fact boxes otherwise (factbox.css: one line, the sub text as the value's hover). */
.ew-facts .ew-fact.ew-fact-act .ew-fact-row{gap:12px}
.en-act{flex:none;position:relative;width:2.7rem;height:2.7rem;display:grid;place-items:center;--rc:#7d8b91;--hi:color-mix(in srgb,var(--rc) 55%,#fff);--lo:color-mix(in srgb,var(--rc) 55%,#000)}
.en-act.a-overgrowth{--rc:#A78A67}.en-act.a-underdocks{--rc:#9F95A5}.en-act.a-hive{--rc:#9B9562}.en-act.a-glory{--rc:#819A97}
.en-act::before{content:"";position:absolute;inset:.2rem;border-radius:50%;background:radial-gradient(circle,color-mix(in srgb,var(--rc) 45%,transparent),transparent 70%)}
.en-act-i{position:relative;width:1.75rem;height:1.75rem;rotate:45deg;border-radius:3px;
  background:conic-gradient(from 0deg at 50% 50%,var(--hi) 0 90deg,var(--rc) 90deg 180deg,var(--lo) 180deg 270deg,color-mix(in srgb,var(--rc) 80%,#000) 270deg 360deg);
  box-shadow:0 0 0 1.5px rgba(0,0,0,.65),0 2px 3px rgba(0,0,0,.5),inset 0 0 0 1px rgba(255,255,255,.22)}
.en-act-i::after{content:"";position:absolute;inset:27%;background:color-mix(in srgb,var(--rc) 78%,#fff);opacity:.9;box-shadow:inset 0 0 0 1px rgba(255,255,255,.35),0 0 0 1px rgba(0,0,0,.25)}
.ew-facts .ew-fact.ew-fact-part{flex-direction:row;align-items:center;gap:12px}
.ew-facts .ew-fact.ew-fact-part .en-part-t{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:6px}
.ew-facts .ew-fact.ew-fact-part .en-part-go{flex:none;white-space:nowrap}
.ew-facts .ew-fact.ew-fact-part .ew-fact-row{flex:0 0 auto}
/* the points under the "How to fight it" banner (pages_enemies.js enHow): the chapter's list look without a chapter of their own */
:is(.epage,.encpage) .en-how{margin:0 0 var(--stack)}
:is(.epage,.encpage) .secban+.en-how{margin-top:22px}   /* room under the "How to fight it" banner (Bean, 22 Sep 2026: "not enough space here inbetween the header and the info text below"): the plate's shadow reaches 11 px past its edge */
:is(.epage,.encpage) .en-how .evpts{margin:0}
/* ---------- SUMMONED MINIONS IN THE ROW (wave 5; Bean, 22 Sep 2026: "we need to show the enemy spawn in which will move the main enemy to the right to give space for the
   minions joining the fight, this needs to look cool and not feel forced"; pages_enemyturns.js ewMinionsHtml / etMinShow). A minion is a member of the summoner's own
   lineup, hidden until its turn; a row with minions in it is .ew-join. ON THE SUMMONING TURN the minion's slot opens from nothing (ewminin: width from 0, the site's
   card-motion ease-out; the gap after it the same), so the flex row slides the summoner to the right as the slot grows, and the body pops up in the open slot a beat
   later (ewminpop: from small and low, over the ground line), its HP bar and name plate fading in after it. A jump or a step back places everyone at once (no .in).
   The minions' intents, bars and plates take the fight lineup's sizes (they are the lineup's small members). Reduced motion: no animation, they just stand there. */
.ewin .encstage .lineup.ew-join{left:2%;right:2%}
.ewin .encstage .lineup.ew-join .lm-gap{flex:2 1 0;min-width:4%;max-width:var(--gapmax,clamp(2.5rem,9cqw,6rem));height:0}
.ewin .encstage .lm.ew-min[hidden],.ewin .encstage .lm-gap[hidden]{display:none}
.ewin .encstage .lm.ew-min{--ico:min(2.2rem,7cqh);max-width:calc(86%/var(--n,1))}
.ewin .encstage .lm.ew-min .lm-int{width:max-content;max-width:calc(96cqw/var(--n,1));flex-wrap:wrap;justify-content:center;bottom:calc(100% - var(--vt,0px) + 6px)}
.ewin .encstage .lm.ew-min.in{animation:ewminin .62s cubic-bezier(.16,1,.3,1) both}
.ewin .encstage .lm-gap.ew-min-gap.in{animation:ewgapin .62s cubic-bezier(.16,1,.3,1) both}
.ewin .encstage .lm.ew-min.in .lm-img{animation:ewminpop .5s .22s cubic-bezier(.16,1,.3,1) both}
.ewin .encstage .lm.ew-min.in :is(.lm-hp,.lm-name,.lm-pows){animation:ewminfade .35s .45s ease-out both}
@keyframes ewminin{from{width:0;opacity:0}30%{opacity:1}}
@keyframes ewgapin{from{min-width:0;max-width:0}}
@keyframes ewminpop{from{opacity:0;transform:translateY(12%) scale(.55)}}
@keyframes ewminfade{from{opacity:0}}
@media (max-width:640px){
  .ewin .encstage .lm.ew-min{--ico:min(1.7rem,6cqh)}
}

/* ---------- widths ---------- */
@media (max-width:1180px){
  .ewin{--cg:20px}
}
/* stacked: by the HERO's width, never the window's. The rail folds away near 1000 px, so a 968 px window has a 920 px hero (room for both columns) while a
   1040 px window has a 727 px one; a window test stacked the wide one and kept the narrow one side by side (Bean: "doesnt switch the full width clearly") */
@container ehero (max-width:899px){
  /* stacked: the head, the enemy's box, the strip right under it (it stays put while the reader steps), the text, the fact boxes. The Ascension control goes
     back beside the title */
  .ewin,.ewin.noturns{grid-template-columns:minmax(0,1fr);grid-template-areas:"head" "box" "strip" "facts" "cast";grid-template-rows:none;gap:12px}
  .ewin>.ew-left{display:contents}
  .ehero .ew-head .asc-ctl,.ehero .ew-head .asc-none{flex-basis:auto;margin:0 0 0 auto;justify-content:flex-end}
  .ehero .ew-head .asc-ctl .asc-note{text-align:right}
  .ehero .ew-head .asc-ctl button{width:5.4rem}
  .ehero .ew-head .asc-ctl .asc-l{display:inline}
  .ewin .enc-hero{aspect-ratio:3/2;max-height:22rem}   /* (wave 5: lower, like the two-column frame) */
  .ewin-fight .enc-hero{aspect-ratio:16/10;max-height:30rem;--rowcap:78cqw}   /* --rowcap (wave 5): the stacked frame's row stops at 78 % of its width (86 % left a pair of Nibbits from edge to edge here too); the phone's 5:4 frame below keeps 86 %, its intents need the width */
  /* the stub still hangs from the frame (it stays put while the reader steps): one row of tokens that scrolls sideways */
  .ewin .ew-strip .ew-pass{--twmin:2.5rem}
}
@media (max-width:760px){
  .ew-part{flex-wrap:wrap;gap:8px 12px}
  .ew-part-go{margin-left:auto}
}
@media (max-width:640px){
  /* the control on its own line under the title, the flame and the three buttons in ONE row (its word goes: "A9+" used to wrap onto a row of its own) */
  .ehero .ew-head .asc-ctl,.ehero .ew-head .asc-none{flex-basis:100%;margin:2px 0 0;justify-content:flex-start}
  .ehero .ew-head .asc-ctl .asc-note{text-align:left}
  .ehero .ew-head .asc-ctl .asc-l{display:none}
  .ehero .ew-head .asc-ctl button{width:min(5.4rem,calc((100cqw - 3.6rem)/3))}
  /* a square box */
  .ewin .enc-hero{aspect-ratio:5/4;max-height:20rem;--ico:min(2.1rem,8cqh);--top:calc(var(--ico) + 30px);--feet:calc(4.5rem + 8px)}
  .ewin .ew-step{width:2.5rem;height:2.5rem}
  .ewin .ew-box>.ew-pick{right:7px;bottom:7px}
  .ewin :is(.ew-pick,.asc-pick) select{padding:6px 27px 4px 10px;font-size:.92rem}
  .ew-facts{gap:8px}
  .ew-fact{flex-basis:8.5rem;padding:8px 11px 10px}
  .ew-fact.wide{flex-basis:100%}
  .ew-fact-i{width:2.3rem;height:2.3rem}.ew-fact-i .mi{width:2.15rem;height:2.15rem}
  /* the fight's box on a phone: square, the intents small, the lineup using the full width */
  /* a fight's frame on a phone is 5:4, not the solo page's square: a lineup is as wide as the frame, so a square only added room over its heads */
  .ewin-fight .enc-hero{aspect-ratio:5/4;max-height:26rem;--ico:min(1.7rem,6cqh);--top:calc(var(--ico) + 40px);--feet:calc(4.1rem + 8px);--rowcap:86cqw}
  .ewin-fight .encstage .lineup,.ewin .encstage .lineup.ew-grp{left:1%;right:1%}
  /* a lineup whose names are long on a phone (.ew-long, ewLineupHtml) keeps the extra line of feet room it always had: the creatures keep their sizes (Bean, 23 Sep
     2026: "Revert the character sizes"); the names themselves now show on hover only, as in the game */
  .ewin-fight .enc-hero:has(.lineup.ew-long:not([hidden])),.ewin .enc-hero:has(.lineup.ew-grp.ew-long:not([hidden])){--feet:calc(4.1rem + 8px + .9rem)}
  .ewin-fight .lm-qimg{width:min(100%,4.5rem)}
  .ew-cm{flex:1 1 calc(50% - 5px)}
}
@media (prefers-reduced-motion:reduce){
  .ewin .ew-pass.in{animation:none}
  .ewin .encstage .lm.ew-min.in,.ewin .encstage .lm-gap.ew-min-gap.in,.ewin .encstage .lm.ew-min.in .lm-img,.ewin .encstage .lm.ew-min.in :is(.lm-hp,.lm-name,.lm-pows){animation:none}
  .ehero .intent.pop>.pi,.ewin-fight .lm-qimg{animation:none}
  .ewin .ew-tok,.ewin .ew-step{transition:none}
}
/* TOUCH TARGETS (wave 6 QoL, 23 Sep 2026: "touch targets under 40 px"), the site's touch rule (buttons.css .btn.sm, character.css .chow-c): on a touch screen a
   control is at least 40 px. The turn tokens (2.5 rem, 37.5 px on a phone) and the step arrows keep their look and size and reach a little further: an invisible
   ring, 3 px round a token (inside the scroller's 6 px padding and half its 6 px gaps, so no two rings meet) and 2 px round an arrow. The frame's pickers grow
   to 40 px. (A fact box's text links stay 19 to 21 px high: factbox.css clips the value with overflow:hidden, which also clips any taller tap band; a shared
   fix, listed in docs/wave6/qol-enemies.md.) */
@media (hover:none) and (pointer:coarse){
  .ewin .ew-tok::after{content:"";position:absolute;inset:-3px;border-radius:50%}
  .ewin .ew-step{position:relative}
  .ewin .ew-step::after{content:"";position:absolute;inset:-2px;border-radius:50%}
  .ewin :is(.ew-pick,.asc-pick) select{min-height:40px}
}
/* NOTHING IN THE FRAME'S LAYOUT TRANSITIONS (wave 6 QoL, 23 Sep 2026). The site's reduced-motion rule gives EVERY property of every element a 1 ms transition
   (*{transition-duration:.001s!important}, transition-property defaults to all), so a size read right after a change still saw the old one: etUiFit took the
   Fogmog's bar for inside the frame after a Gas Bomb came in and left it 12 px out, etMinFit measured members at their old widths. These boxes never animate
   their layout, so they transition nothing (the power row keeps its opacity fade, the names theirs) */
.ewin .encstage :is(.lineup,.lm,.lm-gap,.lm-hp){transition-property:none}
/* the same rule moved a fight page's turn buttons after load: the stepper sets the stub's column count (--nvj) right after the row is first styled, and the row's
   columns (grid-template-columns can transition) slid from seven to twelve across one frame, a layout shift of .0069 on 37 fight pages at 760 px */
.ewin :is(.ew-toks,.ew-pass){transition-property:none}
/* A WIDE FACT NEVER WIDENS A PHONE'S PAGE (wave 6 QoL, 23 Sep 2026). factbox.css keeps a box at least as wide as its one-line value (min-width:fit-content), so a
   long value pushed the page sideways: "Random picks: 3 × one of Axe Raider / Assassin Raider / ..." by 262 px, the Battleworn Dummy's pick by 110, a fight's Map rule
   by 40 to 53. On a phone a wide box has the row to itself (flex-basis 100% above), so there it stops at the row and its value takes the ellipsis; the whole list is
   the box's hover where it is long */
@media (max-width:640px){.ewin .ew-facts>.ew-fact.wide{min-width:0!important}}

/* --inx (etIntSpace, pages_enemyturns.js): an intent set beside a neighbour's or kept inside the frame moves sideways by that much, whichever side it hangs from;
   no transition (the reduced-motion rule's 1 ms one would hand the measure its old place) */
.ewin .encstage .lm>.lm-int{margin-left:var(--inx,0px);margin-right:calc(-1*var(--inx,0px));transition-property:none}

/* THE KAISER CRAB AS THE GAME SHOWS IT (Bean, 24 Sep 2026: "kaiser crab isnt being shown like he is in game, which is the claws coming in from either side of the edges, and the crab body is looming at the top of the screen barely visible. Look for references").
   The crab is the room's (pages_enemyturns.js EW_CRAB: its picture on the room pictures' grid, .ew-crabf over the room's .encroom), so both pictures share one
   geometry: --kh their height, --kw their width, --kl / --kt their left and top. The frame shows about the game's own width, so the claws come in from both edges:
   never wider than the game's screen (67.5 % of the picture's width: --kh at most 67.5cqw), never narrower than the frame; a wide frame shows the picture from 17 %
   of its height down (the body looms at the top, the face just in) to the left claw's bottom on the feet line (the right one stands a little higher: Bean
   moved it up and left), a tall one from the picture's top; never shorter than the
   frame. Each claw's member box IS its hitbox (--kx0 ... --ky1, fractions of the picture), its middle kept in from the frame's sides by half its HP bar (--kbw, the
   bar's game width) + 4 px, the left side 18 u more for the Block shield, and never under 34 u + 8 px, so its bar, powers and intent stay in; the intent's middle at the game's IntentPos (--kiy) when there is room over it, the HP bar, powers and name under the hitbox as in the game; no still of
   its own, no floor shadow (the room has them), no idle clip (the old centred still had one). A phone's 5:4 frame is 3:2 here: 5:4 has no room for the claws. */
.ewin .encstage.ew-crab{--kh:max(clamp(46.875cqw,calc((100cqh - var(--feet))/.4627),67.5cqw),100cqh);--kw:calc(var(--kh)*2.13333);--kl:calc(50cqw - .4917*var(--kw));--kt:min(0px,calc(100cqh - var(--feet) - .6327*var(--kh)))}
.ewin .encstage.ew-crab .encroom{left:var(--kl);top:var(--kt);width:var(--kw);height:var(--kh);max-width:none;translate:none}
.ewin .encstage.ew-crab .lineup{top:0;right:0;bottom:0;left:0;height:auto;display:block}
.ewin .encstage.ew-crab .lineup::before,.ewin .encstage.ew-crab .lineup::after,.ewin .encstage.ew-crab .lm.lm-claw::after{content:none}
.ewin .encstage.ew-crab .lm.lm-claw{position:absolute;flex:none;aspect-ratio:auto;max-width:none;min-width:0;--kcw:calc((var(--kx1) - var(--kx0))*var(--kw));
  --kbw:calc((var(--hbw,276) - 24)*var(--kh)/1296 + 24*var(--u));
  --kcx:clamp(max(calc(34*var(--u) + 8px),calc(var(--kbw)/2 + 18*var(--u) + 4px)),calc(var(--kl) + (var(--kx0) + var(--kx1))*.5*var(--kw)),calc(100cqw - max(calc(34*var(--u) + 8px),calc(var(--kbw)/2 + 4px))));left:calc(var(--kcx) - var(--kcw)/2);
  top:calc(var(--kt) + var(--ky0)*var(--kh));width:var(--kcw);height:calc((var(--ky1) - var(--ky0))*var(--kh));--uw:calc(var(--kh)/1296);
  --kd:max(0px,min(calc((var(--ky0) - var(--kiy))*var(--kh) - 32*var(--u)),calc(var(--kt) + var(--ky0)*var(--kh) - 64*var(--u) - 6px)))}
.ewin .encstage.ew-crab .lm.lm-claw .lm-int{top:auto;left:50%;right:auto;bottom:calc(100% + var(--kd));translate:-50% 0;min-width:0;animation-name:intentbob}
@media (max-width:640px){.ewin .enc-hero.ew-crab{aspect-ratio:3/2}}

/* ===== app/events.css ===== */
/* ===== events: the game's event screen (app/pages_events.js; docs/wave3/events.md; restarted 18 Sep 2026) =====
   Scoped under .evpage (a detail page) and .evhub (the index). Two parts:
   THE SCREEN (.evgame > .evstage) is default_event_layout.tscn: the painting fills the stage, centred and cropped like the game crops its 2560x1200
   portrait to the window; the column sits on the painting's dark right half (the game: x 922-1722 of 1920) and holds the title (Spectral bold
   EFC851, shadow 3,2 at 50 %), the description (Kreon FFF6E2, centred) and, UNDER THE TEXT IN THE SAME COLUMN, the option plates. The stage is
   2:1 and grows when the column needs more; every page of the event is stacked in one grid cell so turning a page never moves the layout.
   A PLATE (.evopt) is event_option_button.tscn and nothing but the sprite: three layers (left cap, stretched middle, right cap) inside .evo-plate,
   a size container, so the caps follow the plate's real height in cqh and a plate whose text wraps never gaps or doubles (the old --ph guess did).
   No border, no background, no clip-path on the button itself. Hover: outline sprite in StsColors.blueGlow (78FFFE at .75), v .9 -> 1.2, scale
   1.01 in .05 s, back over .5 s Expo-out; press .99; chosen: BlueFlash; the others: GrayOut (.75 over .3 s); locked: h .48 s .2 v .65, red title,
   label at 70 %; would kill: the ring stays red. Plates enter like AnimateIn (fast mode): from 30 px left, Back-out, .1 s apart.
   THE LIST (.evouts): one roomy card per choice, the choice on the left, what it does on the right; the game's reply is a quote on a gold rule.
   Every motion is off with reduced motion. */
.evpage{--evgold:#EFC851;--evcream:#FFF6E2;--evblue:#87CEEB}

/* ---------- the screen ---------- */
.evgame{margin:4px 0 0;container-type:inline-size}
.evstage{position:relative;display:grid;grid-template-columns:minmax(0,46fr) minmax(0,54fr);aspect-ratio:2/1;overflow:clip;border-radius:14px;border:2px solid var(--line);background:#05080a;box-shadow:0 6px 0 rgba(0,0,0,.45)}
.evstage img.evbg{position:absolute;inset:0;display:block;width:100%;height:100%;max-width:none;max-height:none;object-fit:cover;object-position:50% 50%;border-radius:0;background:none;pointer-events:none;user-select:none}
.evcolumn{grid-column:2;position:relative;z-index:2;display:flex;flex-direction:column;justify-content:center;min-width:0;padding:clamp(20px,4.2cqw,52px) clamp(18px,5.2cqw,68px) clamp(22px,4.4cqw,56px) clamp(4px,1cqw,12px)}
h1.evtitle{font-family:var(--font-d);font-weight:700;font-size:clamp(1.55rem,3.3cqw,2.5rem);color:var(--evgold);text-shadow:3px 2px 0 rgba(0,0,0,.5);line-height:1.1;margin:0 0 clamp(.5rem,1.4cqw,1rem);text-align:center;text-wrap:balance}
.evpages{display:grid;min-width:0}
.evp{grid-area:1/1;display:flex;flex-direction:column;min-width:0}
.evp:not(.on){visibility:hidden;pointer-events:none}
.evtext{display:grid;align-content:center;min-height:clamp(5.5rem,13cqw,10rem);margin:0 0 clamp(.9rem,2.2cqw,1.5rem);text-align:center;font-family:var(--font-b);font-size:clamp(.98rem,1.72cqw,1.26rem);line-height:1.42;color:var(--evcream);text-shadow:2px 2px 0 rgba(0,0,0,.5);text-wrap:pretty}
.evtext-i{min-width:0}
.evtext:empty{min-height:0;margin:0}
.evbtns{display:flex;flex-direction:column;gap:clamp(.4rem,.9cqw,.7rem)}
.evstamp{display:block;font-family:var(--font-d);font-weight:700;font-size:1.15em;letter-spacing:.03em;color:var(--evgold)}
.evfightcard{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:10px 22px;text-align:left}
/* the game's text colours ([gold] [blue] [red] [green] [purple] [orange] [aqua]) wherever its words are quoted */
.evtext .kw,.evo-d .kw,.evsay-p .kw,.evrow-d .kw,.evrow-lock .kw{color:var(--evgold);font-weight:400}
.evtext .num,.evo-d .num,.evsay-p .num,.evrow-d .num,.evrow-lock .num{color:var(--evblue);font-weight:600}
.evtext .green,.evo-d .green,.evsay-p .green,.evrow-d .green{color:var(--green)}.evtext .red,.evo-d .red,.evsay-p .red,.evrow-d .red{color:var(--red)}
.evtext .purple,.evo-d .purple,.evsay-p .purple,.evrow-d .purple{color:var(--purple)}.evtext .orange,.evo-d .orange,.evsay-p .orange,.evrow-d .orange{color:var(--orange)}
.evtext .blue,.evo-d .blue,.evsay-p .blue,.evrow-d .blue{color:var(--evblue)}.evtext .gold,.evo-d .gold,.evsay-p .gold,.evrow-d .gold{color:var(--evgold)}.evtext .aqua,.evsay-p .aqua,.evrow-d .aqua{color:var(--teal)}
.evtext .dim{color:var(--dim);text-shadow:none}
.evcut{color:var(--muted);font-family:var(--font-t);letter-spacing:.1em;padding:0 .15em;cursor:help}
.evvar{font-style:normal}
/* combat_event_layout.tscn: the act's room with the enemy where the game stands it (right), the text and the plates on the left */
.evstage.combat{grid-template-columns:minmax(0,52fr) minmax(0,48fr)}
.evstage.combat .encstage{position:absolute;inset:0}
.evstage.combat .encstage .lineup{left:54%;right:5%}
.evstage.combat .evrug{position:absolute;left:76%;bottom:6%;width:min(40%,20rem);translate:-50% 0;opacity:.9;z-index:1;pointer-events:none}
.evstage.combat::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(to right,rgba(5,8,10,.86),rgba(5,8,10,.62) 40%,transparent 64%)}
.evstage.combat .evcolumn{grid-column:1;padding-left:clamp(18px,5.2cqw,68px);padding-right:clamp(4px,1cqw,12px)}
/* no painting and no fight in the files: the column alone on the dark stage */
.evstage.noart{grid-template-columns:minmax(0,1fr);aspect-ratio:auto;background:radial-gradient(60% 70% at 50% 40%,rgba(63,216,207,.1),transparent 70%),linear-gradient(#17282f,#0c161b)}
.evstage.noart .evcolumn{grid-column:1;max-width:44rem;width:100%;margin:0 auto;padding-left:clamp(18px,5.2cqw,68px)}
/* THE CO-OP TAG (pages_events.js evCoopTag; Bean, 22 Sep 2026: "'co-op choice' / 'Individual choice' tags / illustrations with text in the bottom left of each event recreation
   screen itself ... Make this look cool and fit within the event screen"): the game's plate language in small (the event plate's dark teal, a lit top edge, an 8 px corner),
   the game's icon at the left (the Team Player handshake for a vote, the player icon for an individual choice), the fact in two short lines. Pinned to the stage's bottom-left
   corner, over the painting's dark foot, never over the column (the column keeps its left padding, the tag is under the painting's side). On the narrow stage (the painting on
   top, the column under it) it sits on the painting's bottom-left; on an ancient's band it takes the bottom-right, the caption owns the left. */
.evcoop{position:absolute;left:12px;bottom:12px;z-index:3;display:inline-flex;max-width:calc(100% - 24px);pointer-events:auto}
.evcoop-x{display:inline-flex;align-items:center;gap:.55rem;padding:.35rem .8rem .4rem .5rem;border-radius:8px;background:linear-gradient(rgba(24,53,64,.92),rgba(12,30,38,.94));border:1px solid rgba(120,255,254,.28);box-shadow:0 2px 0 rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.12);color:var(--evcream);font-family:var(--font-t);text-shadow:1px 1px 0 rgba(0,0,0,.5);backdrop-filter:blur(3px)}
.evcoop.vote .evcoop-x{border-color:rgba(239,200,81,.5)}
.evcoop-i{flex:none;width:1.75rem;height:1.75rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.evcoop.solo .evcoop-i{width:1.5rem;height:1.5rem;margin:0 .1rem}
.evcoop-t{display:flex;flex-direction:column;gap:1px;min-width:0;line-height:1.15}
.evcoop-t b{font-size:.86rem;font-weight:700;letter-spacing:.02em;color:var(--evgold);white-space:nowrap}
.evcoop.solo .evcoop-t b{color:#bfe9ff}
.evcoop-t small{font-size:.72rem;color:rgba(255,246,226,.82);white-space:nowrap}
.evstage.combat .evcolumn{padding-bottom:max(clamp(22px,4.4cqw,56px),3.6rem)}   /* the combat layout puts the column on the left, over the tag's corner: the column keeps room for it under its plates */
.evstage.noart .evcoop{position:static;justify-self:center;margin:0 auto clamp(14px,2cqw,20px)}
.evband .evcoop{left:auto;right:14px;bottom:14px}

/* ---------- the plate ---------- */
.evopt{appearance:none;-webkit-appearance:none;border:0;border-radius:0;background:none;box-shadow:none;outline:0;margin:0;position:relative;isolation:isolate;display:flex;align-items:center;width:100%;min-height:clamp(3.5rem,6.2cqw,4.6rem);padding:.5rem clamp(1.5rem,3.2cqw,2.4rem) .55rem clamp(1.4rem,3cqw,2.2rem);text-align:left;color:var(--evcream);font-family:var(--font-t);font-size:clamp(.95rem,1.6cqw,1.15rem);line-height:1.22;text-shadow:3px 2px 0 rgba(0,0,0,.25);cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;--v:.9;--tint:none;--ring:#78fffe;transition:scale .5s cubic-bezier(.16,1,.3,1),filter .3s ease-out}
.evo-plate{position:absolute;inset:0;z-index:-1;container-type:size;pointer-events:none}
.evo-plate>i{position:absolute;display:block;pointer-events:none;background-repeat:no-repeat;background-position:left center,right center,center}
/* the sprite (284x110, caps 56 px = 50.9 % of its height): caps sized by height, the middle strip between them with 1 px of overlap each side */
.evo-s{inset:0;opacity:.9;background-size:auto 100%,auto 100%,calc(100% - 2*(50.9cqh - 1px)) 100%;background-image:url(/img/packed/common_ui/event_button_l.webp),url(/img/packed/common_ui/event_button_r.webp),url(/img/packed/common_ui/event_button_m.webp);filter:var(--tint) brightness(var(--v)) drop-shadow(0 3px 2px rgba(0,0,0,.5));transition:filter .5s cubic-bezier(.16,1,.3,1)}
/* the outline sprite (284x112, white on alpha) as a mask filled with the ring colour, 2 px outside the plate so the band sits on the edge */
.evo-r,.evo-f{inset:-2px;background:var(--ring);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:left center,right center,center;mask-position:left center,right center,center;-webkit-mask-size:auto 100%,auto 100%,calc(100% - 2*((100cqh + 4px)*.5 - 1px)) 100%;mask-size:auto 100%,auto 100%,calc(100% - 2*((100cqh + 4px)*.5 - 1px)) 100%;-webkit-mask-image:url(/img/packed/common_ui/event_button_outline_l.webp),url(/img/packed/common_ui/event_button_outline_r.webp),url(/img/packed/common_ui/event_button_outline_m.webp);mask-image:url(/img/packed/common_ui/event_button_outline_l.webp),url(/img/packed/common_ui/event_button_outline_r.webp),url(/img/packed/common_ui/event_button_outline_m.webp);opacity:0}
.evo-r{transition:opacity .3s ease-out}
.evo-f{background:#9acdd6;mix-blend-mode:screen;z-index:1}
.evo-x{display:block;min-width:0;flex:1}
.evo-t{display:block;font-weight:700;color:var(--evgold)}
.evo-d{display:block;margin-top:.12rem}
.evopt:hover,.evopt:focus-visible{scale:1.01;--v:1.2;transition-duration:.05s,.3s}
.evopt:hover .evo-s,.evopt:focus-visible .evo-s{transition-duration:.05s}
.evopt:hover .evo-r,.evopt:focus-visible .evo-r{opacity:.75;transition-duration:.05s}
.evopt:active{scale:.99;transition-duration:.12s,.3s}
/* FlashConfirmation: alpha to .8 while scaling 1.03 x 1.1, back, then out over .3 s */
.evopt.flash .evo-f{animation:evflash .8s ease-out}
@keyframes evflash{0%{opacity:0;scale:1 1}30%{opacity:.85;scale:1.03 1.1}60%{opacity:.7;scale:1 1}100%{opacity:0}}
/* GrayOut */
.evopt.gray{filter:brightness(.75);pointer-events:none}
/* SetVisuallyLocked: the teal plate goes to a dull dark red, the title reads in red, the label at 70 % */
.evopt.locked{--tint:hue-rotate(173deg) saturate(.25) brightness(.7);--v:1;--ring:transparent;cursor:default}
.evopt.locked:hover,.evopt.locked:active,.evopt.locked:focus-visible{scale:1;--v:1}
.evopt.locked:focus-visible{--ring:#ff6b6b}   /* a keyboard stop on a locked plate shows its ring in the lock's red (wave 6 QoL: the transparent ring left the focus invisible); a pointer still gets nothing */
.evopt.locked .evo-t{color:#ff6b6b}
.evopt.locked .evo-d{opacity:.7}
/* ShowPersistentKillGlow / PulseKillGlow */
.evopt.warn{--ring:#ff5555}
.evopt.warn .evo-r{opacity:.55}
.evopt.warn:hover .evo-r,.evopt.warn:focus-visible .evo-r{opacity:.9;animation:evkill 1.1s ease-in-out infinite}
@keyframes evkill{50%{opacity:.4}}
/* the screen opens like the game (AnimateIn, fast mode): the title and the text fade in, the plates slide in from the left .1 s apart */
.evgame .evtitle{animation:evfade .5s ease-out backwards}
.evp.in .evtext{animation:evfade .6s ease-out .1s backwards}
.evp.in .evopt{animation:evin .3s cubic-bezier(.34,1.4,.64,1) backwards;animation-delay:calc(.22s + var(--i,0)*.1s)}
@keyframes evfade{from{opacity:0}}
@keyframes evin{from{opacity:0;translate:-30px 0}}

/* ---------- what each choice does ---------- */
.evouts{margin:var(--stack) 0 0;container-type:inline-size}
.evouts-h{display:flex;align-items:center;gap:.55rem;margin:0 0 .6rem;font-size:1.35rem;line-height:1.15}
.evouts-h img{flex:none;width:28px;height:28px;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.evrows{display:flex;flex-direction:column;gap:10px}
.evrow{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,8fr);border-radius:12px;border:2px solid var(--line);background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));box-shadow:0 5px 0 rgba(0,0,0,.4),inset 0 1px 0 rgba(255,255,255,.06);scroll-margin-top:calc(var(--tb-h) + 16px)}
.evrow.solo{grid-template-columns:minmax(0,1fr)}
.evrow-a{min-width:0;padding:14px 18px;border-radius:10px 0 0 10px;background:rgba(0,0,0,.24);border-right:1px solid rgba(255,255,255,.07)}
.evrow.solo>.evrow-a{border-right:0;border-radius:10px}
/* a choice that opens a further screen: the choice is a band across the top, what follows gets the whole width (no tall empty cell beside a long column) */
.evrow.deep{grid-template-columns:minmax(0,1fr)}
.evrow.deep>.evrow-a{display:flex;flex-wrap:wrap;align-items:baseline;gap:.25rem 1.1rem;padding:12px 18px;border-right:0;border-bottom:1px solid rgba(255,255,255,.07);border-radius:10px 10px 0 0}
.evrow.deep>.evrow-a>.evrow-d,.evrow.deep>.evrow-a>.evrow-lock,.evrow.deep>.evrow-a>.evrow-k{margin:0}
.evrow-b{min-width:0;padding:14px 18px;display:flex;flex-direction:column;justify-content:center;gap:12px}
.evrow-t{margin:0;font-family:var(--font-t);font-weight:700;font-size:1.16rem;line-height:1.2;color:var(--evgold);text-shadow:2px 2px 0 rgba(0,0,0,.4)}
.evrow.locked>.evrow-a>.evrow-t{color:#ff6b6b}
.evrow-d{margin:.3rem 0 0;font-family:var(--font-b);font-size:1rem;line-height:1.4;color:var(--evcream)}
.evrow-lock{display:flex;align-items:center;gap:.45rem;margin:.5rem 0 0;font-family:var(--font-t);font-size:.92rem;line-height:1.25;color:#ff9a94}
.evrow-lock .evf-i{width:1.15rem;height:1.15rem}
.evrow-lock .kw,.evrow-lock a{color:#ffc4be}
.evrow-k{margin:.5rem 0 0;font-family:var(--font-t);font-size:.8rem;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
.evrow.warn>.evrow-a>.evrow-k{color:#ff8a80}
.evrow-alts{margin:.5rem 0 0;font-family:var(--font-t);font-size:.98rem;line-height:1.4;color:var(--muted)}
.evrow.deep>.evrow-a>.evrow-alts{margin:0;flex-basis:100%}
/* one way the choice can go: its odds, what it gives or takes, then what the game says */
.evres-g{display:flex;flex-direction:column;gap:10px;min-width:0}
.evres-g+.evres-g{padding-top:12px;border-top:1px dashed rgba(255,255,255,.12)}
.evodds{margin:0;font-style:normal;font-family:var(--font-t);font-size:.8rem;letter-spacing:.08em;text-transform:uppercase;color:#f0b8f0}
.evres-f{display:flex;flex-wrap:wrap;align-items:center;gap:8px 18px}
/* THE CHIP (wave 5; Bean, 22 Sep 2026: "we need icons for each 'what you get'. If it's gold, put a gold icon, if its a potion put a 3d potion icon, if it's a fight show the enemy
   they will be fighting as an icon"): the kind in small caps over the value, the site's 3D icon (pages_acts.js factIco3d, icons3d.css) at the left in the fact box's own cell
   size (2.7rem), a named relic / potion / card with its own art, a fight with the enemy's still. A price reads red, a gain green. */
.evf{display:inline-flex;align-items:center;gap:9px;font-family:var(--font-t);font-size:1rem;line-height:1.2;color:var(--text)}
.evf-t{display:flex;flex-direction:column;gap:2px;min-width:0}
.evf-t small{font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);line-height:1.1}
.evf-v{display:block;min-width:0;font-weight:600}
.evf-t a{color:var(--gold)}
.evf.pos .evf-v{color:#bfffa0}.evf.neg .evf-v{color:#ff9a94}
.evf.pos .evf-v a,.evf.neg .evf-v a{color:var(--gold)}
.evf-i{flex:none;width:1.9rem;height:1.9rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.evf-i3{flex:none;display:grid;place-items:center;width:2.7rem;height:2.7rem}
.evf-i3>.ew-fact-3d{width:100%;height:100%;cursor:default;--lift:6px;--hov-scale:1.1}
.evf-i3>.ew-fact-3d>.evf-i{width:92%;height:92%}
.evf-i3>.ew-fact-3d :is(.shd,.rim,.sheen){inset:4%}
.evf-i3>.relic:not(.ew-fact-3d),.evf-i3>.potion,.evf-i3>.iconlink>.relic,.evf-i3>.iconlink>.potion{width:2.7rem;height:2.7rem}
.evf .relic{width:2.7rem;height:2.7rem}
.evf-mc{display:inline-block;line-height:0}   /* the mini card's wrapper (was .evf-card, the same name as a card chip's kind class: wave 6 QoL) */
.evf-mc .card{--cw:4.1rem}
.evf-cardf>.evf-i3{display:block;width:auto;height:auto;line-height:0}   /* a card is its own size, never the icon cell's */
.evf-i3.evf-still{width:auto;min-width:2.7rem;max-width:5rem;height:3.2rem;align-items:end}
.evf-c{flex:none;height:3.2rem;width:auto;max-width:5rem;object-fit:contain;object-position:50% 100%;filter:drop-shadow(0 4px 4px rgba(0,0,0,.6))}
i.evf-hp{font-style:normal;font-size:.88rem;font-weight:400;color:var(--muted)}   /* the note after a value ("42 HP", "for the win"): i only (wave 6 QoL): an HP-loss chip wears the kind class .evf-hp too and shrank to 88 % beside its neighbours */
/* TWO SIMPLE ROWS TO A LINE (pages_events.js evRowsHtml; Bean, 22 Sep 2026: "If ... there is minimal info and it's simple, stack 2 per row so we don't have empty space spanning out
   to the left side for no reason"): the pair is a two-column grid, each simple row inside it stacks its header over its chips. Single column under 720 px of list width. */
.evpair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-items:stretch}
.evpair>.evrow{grid-template-columns:minmax(0,1fr);align-content:start}
.evpair>.evrow>.evrow-a{border-right:0;border-bottom:1px solid rgba(255,255,255,.07);border-radius:10px 10px 0 0}
.evpair>.evrow.solo>.evrow-a{border-bottom:0;border-radius:10px}
.evpair>.evrow>.evrow-b{justify-content:flex-start}
/* the game's reply, quoted */
.evsay{margin:0;padding:2px 0 2px 18px;border-left:3px solid rgba(239,200,81,.5);scroll-margin-top:calc(var(--tb-h) + 16px)}
.evsay-l{margin:0 0 .4rem;font-family:var(--font-t);font-size:.95rem;color:var(--gold)}
.evsay-p{font-family:var(--font-b);font-size:1.06rem;line-height:1.55;color:var(--evcream);max-width:46rem;text-wrap:pretty}
.evbr{display:block;height:.7em}
p.evstamp{margin:0;font-size:1.15rem;text-shadow:2px 2px 0 rgba(0,0,0,.45)}
.evthen,.evsame{margin:0;font-family:var(--font-t);font-size:.98rem;color:var(--muted)}
.evsame b,.evthen b{font-weight:600;color:var(--evgold)}
.evgo{display:inline-flex;align-items:center;gap:.35rem;color:var(--gold);font-family:var(--font-t)}
.evgo span{color:var(--dim)}
.evsay.lit,.evnext.lit,.evrow.lit{animation:evlit 1.6s ease-out}
@keyframes evlit{0%{box-shadow:0 0 0 2px rgba(120,255,254,.9),0 0 18px rgba(120,255,254,.5)}100%{box-shadow:0 0 0 2px rgba(120,255,254,0)}}
/* the next screen: what the game says there, then the choices it offers, as lighter cards of their own */
.evnext{display:flex;flex-direction:column;gap:10px;min-width:0;scroll-margin-top:calc(var(--tb-h) + 16px)}
.evnext-cap{display:flex;flex-wrap:wrap;align-items:baseline;gap:.3rem .8rem;margin:0;font-family:var(--font-t)}
.evnext-cap b{font-size:1.12rem;color:var(--gold-x)}
.evsubs{display:flex;flex-direction:column;gap:8px}
.evrow.sub{border:1px solid rgba(255,255,255,.1);background:rgba(0,0,0,.26);box-shadow:none}
.evrow.sub>.evrow-a{padding:10px 14px;background:rgba(0,0,0,.2)}
.evrow.sub>.evrow-b{padding:10px 14px;gap:10px}
.evrow.sub .evrow-t{font-size:1.04rem}
.evrow.sub .evrow-d{font-size:.98rem;margin-top:.2rem}
.evchain{display:flex;flex-direction:column;gap:10px;min-width:0}
.evchain-h{margin:0;font-family:var(--font-t);font-size:1rem;line-height:1.45;color:var(--muted);max-width:60rem}
.evchain-h b{color:var(--evgold);font-weight:600}
.evchain-n{color:var(--text)}
.evchain-s{display:flex;flex-direction:column;gap:6px}
.evchain-at{margin:4px 0 0;font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
/* the screens of a chain in the order the same choice turns them up: numbered tiles, side by side where the width allows */
.evchain-l{list-style:none;counter-reset:evc;margin:4px 0 0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,17rem),1fr));gap:12px}
.evchain-l>li.evnext{counter-increment:evc;position:relative;padding:14px 16px 16px 3.2rem;border-radius:10px;background:rgba(0,0,0,.26);border:1px solid rgba(255,255,255,.08);gap:12px}
.evchain-l>li.evnext::before{content:counter(evc);position:absolute;left:.85rem;top:.85rem;width:1.7rem;height:1.7rem;border-radius:50%;background:rgba(239,200,81,.16);box-shadow:inset 0 0 0 1px rgba(239,200,81,.45);color:var(--evgold);font:700 .88rem/1.7rem var(--font-t);text-align:center}
.evchain-l>li.evnext>.evsay{border-left:0;padding-left:0}
.evchain-l>li.evnext .evsay-p{font-size:1.02rem;line-height:1.45}
/* a tile that carries its own choices needs the room of a full row */
.evchain-l>li.evnext:has(.evsubs){grid-column:1/-1}
/* A LOOP'S STEPS (Bean, 20 Sep 2026: Abyssal Baths "scales and so on until you cant take it or you'll die"): the chain's numbered tile in small, one per
   press of the repeated choice, holding the plate's title (or the dish) and what the plate reads at that press; the dashed last tile says how it goes on.
   Many small tiles to a row (5 to 6 on a desktop, 2 on a phone), so ten steps are two rows, never a row per screen. */
.evsteps{list-style:none;counter-reset:evs;margin:2px 0 4px;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,9.4rem),1fr));gap:8px}
.evstep{counter-increment:evs;position:relative;display:flex;flex-direction:column;gap:2px;min-width:0;padding:9px 10px 10px 2.6rem;border-radius:9px;background:rgba(0,0,0,.26);border:1px solid rgba(255,255,255,.08)}
.evstep::before{content:counter(evs);position:absolute;left:.6rem;top:.62rem;width:1.5rem;height:1.5rem;border-radius:50%;background:rgba(239,200,81,.16);box-shadow:inset 0 0 0 1px rgba(239,200,81,.45);color:var(--evgold);font:700 .8rem/1.5rem var(--font-t);text-align:center}
.evstep-t{font-family:var(--font-t);font-size:.7rem;font-weight:600;line-height:1.25;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);overflow-wrap:anywhere}
.evstep-d{font-family:var(--font-b);font-size:1rem;line-height:1.3;color:var(--evcream);overflow-wrap:anywhere}
.evstep-s{font-family:var(--font-t);font-size:.8rem;line-height:1.3;color:var(--muted)}
.evstep-d .kw{color:var(--evgold);font-weight:400}.evstep-d .num{color:var(--evblue);font-weight:600}.evstep-d .green{color:var(--green)}.evstep-d .red{color:var(--red)}
.evstep.more{counter-increment:none;justify-content:center;padding-left:10px;border-style:dashed;background:none}
.evstep.more::before{content:none}
.evstep.more .evstep-d{font-family:var(--font-t);font-size:.9rem;color:var(--muted)}
.evafter,.evlater{margin:12px 0 0;display:flex;flex-direction:column;gap:10px}
.evafter{padding:14px 18px;border-radius:12px;border:2px solid var(--line);background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96))}
.evafter-h,.evlater-h{margin:0;font-family:var(--font-t);font-size:1.2rem;color:var(--gold-x)}
.evloose{display:flex;flex-direction:column;gap:14px}

/* ---------- an ancient's visit: the scene band, then the relics it offers ---------- */
.evband{position:relative;aspect-ratio:21/9;overflow:clip;border-radius:14px;border:2px solid var(--line);background:#06090c;box-shadow:0 6px 0 rgba(0,0,0,.45)}
.evband img.evbg{position:absolute;inset:0;display:block;width:100%;height:100%;max-width:none;max-height:none;object-fit:cover;border-radius:0}
.evband::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(to top,rgba(6,10,12,.88),rgba(6,10,12,.4) 32%,transparent 58%)}
.evband.combat .encstage{position:absolute;inset:0}
.evband.combat .evrug{position:absolute;left:50%;bottom:7%;width:min(58%,26rem);translate:-50% 0;z-index:1;pointer-events:none;filter:drop-shadow(0 6px 8px rgba(0,0,0,.6))}
.evband.dark{background:radial-gradient(60% 70% at 50% 60%,rgba(63,216,207,.14),transparent 70%),linear-gradient(#17282f,#0c161b)}
.evband-cap{position:absolute;left:0;right:0;bottom:0;z-index:2;padding:14px 22px 16px}
.evband-cap h1.evtitle{text-align:left;margin:0 0 .15rem;animation:none}
.evsub{margin:0;color:var(--evblue);font-family:var(--font-i);font-style:italic;font-size:1.05rem;text-shadow:2px 2px 0 rgba(0,0,0,.5)}
.evoffers{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:16px 0 0}
.evoffer{display:flex;align-items:center;gap:.85rem;min-height:5.2rem;padding:.75rem 1.1rem .8rem .8rem;border-radius:10px;background:rgba(0,0,0,.4);border:1px solid rgba(255,255,255,.08);box-shadow:0 3px 2px rgba(0,0,0,.35);color:var(--evcream);font-family:var(--font-t);font-size:1rem;line-height:1.3;text-decoration:none;transition:background-color .15s}
a.evoffer:hover,a.evoffer:focus-visible{text-decoration:none;background:rgba(255,246,226,.09);outline:0}
.evoffer.locked{opacity:.75}.evoffer.locked .evo-t{color:#ff6b6b}
.evoffer-i{flex:none;width:3.4rem;height:3.4rem;display:grid;place-items:center}
.evoffer-i .relic{width:3.4rem;height:3.4rem}
.evoffers-say{display:flex;flex-direction:column;gap:16px;margin:20px 0 0}
@container (max-width:1000px){.evoffers{grid-template-columns:repeat(2,minmax(0,1fr))}}
@container (max-width:600px){.evoffers{grid-template-columns:minmax(0,1fr)}}

/* ---------- where it appears: one strip of facts ---------- */
/* ---------- the fold and the guide (Bean, 18 Sep 2026: "information overload with not enough breaking it up ... dont like how much space they take up") ----------
   .evtold is ONE closed line per choice or screen holding the game's replies (the screen above already plays them); the list keeps open only what is
   scanned for. .evguide sets the two guide chapters side by side, each a list of one-sentence points (.evpts) with the choice's name as lead-in. */
.evtold{min-width:0}
.evtold>summary{display:inline-flex;align-items:center;gap:.5rem;list-style:none;cursor:pointer;user-select:none;padding:.28rem .75rem .28rem .6rem;border-radius:8px;border:1px solid rgba(255,255,255,.12);background:rgba(0,0,0,.25);font-family:var(--font-t);font-size:.9rem;line-height:1.2;color:var(--muted)}
.evtold>summary::-webkit-details-marker{display:none}
.evtold>summary::before{content:"";flex:none;width:.42rem;height:.42rem;margin:0 .15rem 0 .1rem;border-right:2px solid currentColor;border-bottom:2px solid currentColor;rotate:-45deg;transition:rotate .15s}
.evtold[open]>summary::before{rotate:45deg}
.evtold>summary:hover{color:#fff;border-color:rgba(255,255,255,.4)}
.evtold>summary:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
.evtold-n{font-size:.74rem;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
.evtold-b{display:flex;flex-direction:column;gap:14px;margin:12px 0 2px}
.evguide{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:var(--gap);margin:var(--stack) 0 0}
.evguide.n1{grid-template-columns:minmax(0,1fr)}
.evguide>.chap{margin:0}
.evguide .chap-b{max-width:none;padding-bottom:14px}
.evpts{list-style:none;margin:2px 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.chap-b ul.evpts{padding-left:0}
.evpts>li{position:relative;margin:0;padding-left:1.15rem;font-size:1rem;line-height:1.45;color:var(--text);text-wrap:pretty}
.evpts>li::before{content:"";position:absolute;left:.15rem;top:.52em;width:.38rem;height:.38rem;rotate:45deg;background:var(--acc,var(--gold));opacity:.85}
.evpt-k{font-weight:700;color:var(--evgold,#EFC851)}
.evpt-k a{color:inherit}
.evpts-s{list-style:none;margin:.35rem 0 .1rem;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,14rem),1fr));gap:.3rem 1.1rem}
.chap-b ul.evpts-s{padding-left:0}
.evpts-s>li{position:relative;margin:0;padding-left:.85rem;font-size:.96rem;line-height:1.4;color:var(--text)}
.evpts-s>li::before{content:"";position:absolute;left:0;top:.62em;width:.4rem;height:2px;background:var(--dim)}
@media (max-width:1180px){.evguide{grid-template-columns:minmax(0,1fr)}}
/* WHICH OPTION TO TAKE, ILLUSTRATED (pages_events.js evPickHtml; Bean, 22 Sep 2026: "it needs to be improved not just a data dump. Should be explanatory but esy to look at with
   illustrations or icons"): under the site's section banner (banner.css .secban, the ? emote), the rule of thumb in one short paragraph, then one plate per choice: the name,
   the chips of what it yields (the rows' own chips), the guide's sentences about it as short points. The pick wears the game's thumbs-up emote and a gold edge. Two plates to a
   line on a wide page, one under 720 px of list width. It sits with the choices (inside .evouts), so the container is the list's. */
.evouts .evpick,.evpage>.evpick{margin:12px 0 0}
.evpage>.evpick{margin-top:var(--stack)}
.evpick-lede{margin:0 0 12px;font-family:var(--font-b);font-size:1.04rem;line-height:1.5;color:var(--evcream);max-width:60rem;text-wrap:pretty}
.evpick-lede+.evpick-g{margin-top:2px}
.evpick-g{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-items:stretch}
.evpick-g.n1{grid-template-columns:minmax(0,1fr)}
.evpick-p{position:relative;display:flex;flex-direction:column;gap:10px;min-width:0;padding:12px 16px 14px;border-radius:10px;border:1px solid rgba(255,255,255,.1);background:rgba(0,0,0,.26);box-shadow:inset 0 1px 0 rgba(255,255,255,.05)}
.evpick-p.best{border-color:rgba(239,200,81,.55);background:linear-gradient(rgba(239,200,81,.09),rgba(0,0,0,.28) 45%);box-shadow:0 0 0 1px rgba(239,200,81,.18),inset 0 1px 0 rgba(255,255,255,.08)}
.evpick-h{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.35rem .9rem}
.evpick-t{margin:0;font-family:var(--font-t);font-weight:700;font-size:1.1rem;line-height:1.2;color:var(--evgold);text-shadow:2px 2px 0 rgba(0,0,0,.4)}
.evpick-at{display:inline-block;margin-left:.35rem;font-size:.74rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);vertical-align:middle}
.evpick-m{display:inline-flex;align-items:center;gap:.35rem;padding:.2rem .65rem .22rem .35rem;border-radius:999px;background:rgba(239,200,81,.16);box-shadow:inset 0 0 0 1px rgba(239,200,81,.5);font-family:var(--font-t);font-size:.78rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--evgold);white-space:nowrap}
.evpick-mi{width:1.3rem;height:1.3rem;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.evpick-y{display:flex;flex-wrap:wrap;align-items:center;gap:8px 18px}
.evpick-y:empty{display:none}
.evpick-r{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4rem}
.evpick-r>li{position:relative;margin:0;padding-left:1.05rem;font-family:var(--font-b);font-size:1rem;line-height:1.45;color:var(--text);text-wrap:pretty}
.evpick-r>li::before{content:"";position:absolute;left:.1rem;top:.55em;width:.36rem;height:.36rem;rotate:45deg;background:var(--evgold);opacity:.85}
.evpick-p.quiet .evpick-y{opacity:.9}
@container (max-width:720px){.evpick-g{grid-template-columns:minmax(0,1fr)}}
@media (max-width:720px){.evpage>.evpick .evpick-g{grid-template-columns:minmax(0,1fr)}}

/* ---------- Where it appears: the game's act banner (scenes/ui/act_banner.tscn) over the act's room, first on the page ---------- */
/* WHAT YOU CAN OBTAIN (pages_events.js evGetsHtml): the enemy page's fact boxes (.ew-facts > .ew-fact, enemyturns.css), one per card, relic or potion,
   right under the event screen. The boxes share the whole row, as the enemy page's do (no hole at the row's end); a card stands in its box at a
   mini size */
/* ...and since wave 5 every kind of gain (upgrade, transform, enchant, removal, duplicate, gold, heal, Max HP; Bean, 22 Sep 2026: "you should include all 3 on one line, there is
   plenty space"): the boxes are compact (a 9.5rem floor, the enemy page's) so five or six share one line at 1345 and wrap only when they must */
.evget{margin:var(--stack) 0 0;container-type:inline-size}
.evget .ew-facts{margin:0}
/* THE OBTAIN ROW'S LINES (22 Sep 2026). The boxes' flex basis follows their count (the row carries n1..n12) so the lines come out even and the last line is never one
   stretched box (six boxes drew five and a full-width sixth). No width cap: core keeps a value on one line (min-width fit-content, factbox.css), so a wordy box takes
   what it needs and its neighbours grow to fill the line, rather than leaving the line half empty. The row is its own container: about 1010px wide at 1345, about 700
   at 1000 and 760, 365 at 390.  Wide (900+): 2 to 5 boxes share one line; 6 = 3 + 3; 7 and 8 = 4 per line; 9 and 10 = 5 per line; 11 and 12 = 4 per line.
   Middle (640 to 899): 2 to 4 share one line; 5, 6 and 9 = 3 per line; 7, 8, 10, 11, 12 = 4 per line.   Narrow: 2 per line, a wordy box alone on its line. */
.evget .ew-fact{flex:1 1 10rem;min-width:0}
@container (min-width:900px){
  .evget.n5 .ew-fact,.evget.n9 .ew-fact,.evget.n10 .ew-fact{flex-basis:calc(20% - 8px)}
  .evget.n6 .ew-fact{flex-basis:calc(33.333% - 7px)}
  .evget.n7 .ew-fact,.evget.n8 .ew-fact,.evget.n11 .ew-fact,.evget.n12 .ew-fact{flex-basis:calc(25% - 8px)}}
@container (min-width:640px) and (max-width:899px){
  .evget.n5 .ew-fact,.evget.n6 .ew-fact,.evget.n9 .ew-fact{flex-basis:calc(33.333% - 7px)}
  .evget.n7 .ew-fact,.evget.n8 .ew-fact,.evget.n10 .ew-fact,.evget.n11 .ew-fact,.evget.n12 .ew-fact{flex-basis:calc(25% - 8px)}}
@container (max-width:639px){.evget .ew-fact{flex-basis:calc(50% - 5px)}}
.evget .ew-fact-row{align-items:center;gap:10px}
.evget .evget-card:not(.loose) .ew-fact-i,.evget .evget-curse:not(.loose) .ew-fact-i{width:auto;height:auto}
.evget .evget-c{display:block;line-height:0}
.evget .evget-c .card{--cw:3.5rem}
.evget .ew-fact-t small{margin-top:2px}
.evget-n{color:var(--dim);font-family:var(--font-t);font-size:.82em;letter-spacing:.02em}   /* the count after a named item: "Foul Potion x3" */
.evwhere{margin:var(--stack) 0 0}
.evwhere-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:0 0 8px}
.evwhere-h h2{margin:0;font-family:var(--font-t);font-weight:700;font-size:.78rem;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
.evwhere-any{font-family:var(--font-t);font-size:1rem;color:var(--evcream)}
.evwhere-g{margin-left:auto;font-family:var(--font-t);font-size:.88rem;color:var(--muted);white-space:nowrap}
.evwhere-g:hover{color:var(--gold-x)}
/* TOUCH TARGETS (wave 6 QoL, 23 Sep 2026): on a touch screen the small text controls of these pages take at least 40 px of height to tap. Padding with the same
   negative margin: the layout does not move. The "What the game says" line grows to 40 px */
@media (hover:none) and (pointer:coarse){
  .evwhere-g{display:inline-block;padding:11px 0;margin-block:-11px}
  .evf-v a{display:inline-block;padding:11px 6px;margin:-11px -6px}   /* a chip's name link (a creature, a curse, a relic). NOT the fact boxes' links: their one-line text clips (overflow hidden), the padding would be cut off and could scroll the line */
  .evgo{padding-block:10px;margin-block:-10px}
  .evtold>summary{min-height:40px}}
.evwhere-acts{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:10px}
.evwact{position:relative;display:grid;place-items:center;min-height:clamp(7rem,12vw,9.5rem);overflow:clip;border-radius:12px;border:2px solid var(--line);background:#05080a;box-shadow:0 5px 0 rgba(0,0,0,.45);color:var(--text);text-decoration:none;container-type:inline-size;isolation:isolate}
.evwact:hover,.evwact:focus-visible{text-decoration:none}
.evwact-art{position:absolute;inset:0;z-index:0;background:#0f1c22 50% 32%/cover no-repeat;filter:brightness(1.35) saturate(1.1)}
.a-overgrowth>.evwact-art{background-image:url(/img/rooms/lethal/overgrowth/0.webp)}.a-underdocks>.evwact-art{background-image:url(/img/rooms/lethal/underdocks/0.webp)}
.a-hive>.evwact-art{background-image:url(/img/rooms/lethal/hive/0.webp)}.a-glory>.evwact-art{background-image:url(/img/rooms/lethal/glory/0.webp)}
/* Banner: the ColorRect across the screen, black at .25; a touch deeper here because the type is far smaller than the game's 120 px */
.evwact-band{position:absolute;left:0;right:0;top:50%;z-index:1;height:70%;translate:0 -50%;background:rgba(0,0,0,.34);animation:evwband .5s .5s backwards}
.evwact-t{position:relative;z-index:2;display:flex;flex-direction:column;align-items:center;gap:.1em;padding:.4rem .35rem;text-align:center;line-height:1}   /* side padding .35rem (was .8rem, wave 6 QoL): at 1000 px the four-act row is 166 px a banner and "Underdocks" + .8rem a side ran 5 px past its clip */
.evwact-n{font-family:var(--font-t);font-size:clamp(.95rem,2.6cqw,1.5rem);color:#87CEEB;text-shadow:2px 2px 0 rgba(0,0,0,.45);animation:evwnum 1.25s calc(.5s + var(--i,0)*.12s) cubic-bezier(.25,.46,.45,.94) backwards}
.evwact-name{font-family:var(--font-d);font-weight:700;font-size:clamp(1.7rem,8.5cqw,3.6rem);line-height:1.05;color:#EFC851;text-shadow:3px 3px 0 rgba(0,0,0,.5);animation:evwname 1s calc(.25s + var(--i,0)*.12s) backwards}
/* hover: the plate's light, as everywhere on these pages: a blueGlow ring and a little light, by opacity alone */
.evwact::after{content:"";position:absolute;inset:0;z-index:3;pointer-events:none;border-radius:10px;box-shadow:inset 0 0 0 2px rgba(120,255,254,.75),inset 0 0 26px rgba(120,255,254,.16);background:rgba(255,255,255,.05);opacity:0;transition:opacity .25s}
a.evwact:hover::after,a.evwact:focus-visible::after{opacity:1;transition-duration:.05s}
a.evwact:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
@keyframes evwband{from{opacity:0}}
@keyframes evwname{from{opacity:0}}
@keyframes evwnum{from{opacity:0;translate:0 10px}}
/* the facts under the banners (pages_events.js evFactsHtml): the enemy page's fact boxes (.ew-facts > .ew-fact, enemyturns.css), the same component as What you can obtain
   above. Bean, 21 Sep 2026, the design law of wave 4: info boxes are "like ... the info boxes "Health" on the enemy dedicated page". It was one flat slab of chips. */
.evwhere-f.ew-facts{margin:10px 0 0}
.evwhere-f .ew-fact{flex:1 1 13.5rem}
.evwhere-f .ew-fact.wide{flex:2 1 22rem}
.evwhere-f .ew-fact-row{flex:1;gap:12px}
.evwhere-f .ew-fact-i{width:3rem;height:3rem}
.evwhere-f .ew-fact-t b a{color:var(--gold-x)}.evwhere-f .ew-fact-t b a:hover{color:#fff}
/* four acts share the row: shorter banners; on a phone two by two, and a lone act keeps its full height */
.evwhere.n4 .evwact,.evwhere.n3 .evwact{min-height:clamp(5.5rem,9vw,7.5rem)}
/* the act's map colours (MapColors.background / untraveled) as the card's tint */
.a-overgrowth{--ac:#877256}.a-underdocks{--ac:#534A62}.a-hive{--ac:#6E7750}.a-glory{--ac:#60717C}.a-any{--ac:#8a6cc9}

/* ---------- act badges (the index) ---------- */
.evact{display:inline-flex;align-items:center;gap:.35rem;padding:2px 9px 2px 3px;border-radius:999px;background:rgba(10,18,22,.78);border:1px solid var(--ac,rgba(255,255,255,.18));color:#f3ead9;font-family:var(--font-t);font-size:.8rem;line-height:1.2;letter-spacing:.02em;text-decoration:none;backdrop-filter:blur(2px)}
a.evact:hover{border-color:var(--gold);text-decoration:none}
.evact-art{display:block;width:1.25rem;height:1.25rem;border-radius:50%;background:#0f1c22 center/cover no-repeat;box-shadow:inset 0 0 0 1px rgba(255,255,255,.2)}
.evact-art.ico{background-size:contain;box-shadow:none}

/* ---------- the index: the act chips (app/filters.css language), then every event as the Enemies directory's card ----------
   Bean, 20 Sep 2026: "Can you display the Events boxes on the events directory like we display the enemies?". The card is acts.css .arena (the grid is
   style.css .arenas.mtgrid): the painting over the name plate, the darkened foot under it. The painting is img.evtile-img, never .evart: art3d.js tilts
   .evart, which lifted the painting over its own title and lagged on 66 large images (Bean, 18 Sep 2026). Hover is the arena card's. */
.evhub{--evgold:#EFC851}
/* the filters are the whole kit since 21 Sep 2026 (text field, chip groups, count + tags + Sort: app/filters.css); .evfilt is only their data-lite="ok" wrapper */
/* the Act chip is the Enemies / Encounters one (acts.css .fgrp-encact: a gem in the act's map colour); "Any act" adds its own colour */
.fgrp-encact .fchip[data-v="any"]{--rc:#8a6cc9}
/* an act's picture on badges and act cards is its combat room, flattened (extract/rooms_compose.py -> src/img/rooms/lethal/<act>/0_sm.webp), lifted a little so a small circle reads */
.evact.a-overgrowth .evact-art{background-image:url(/img/rooms/lethal/overgrowth/0_sm.webp)}
.evact.a-underdocks .evact-art{background-image:url(/img/rooms/lethal/underdocks/0_sm.webp)}
.evact.a-hive .evact-art{background-image:url(/img/rooms/lethal/hive/0_sm.webp)}
.evact.a-glory .evact-art{background-image:url(/img/rooms/lethal/glory/0_sm.webp)}
.evact-art:not(.ico){background-position:50% 35%;filter:brightness(1.7) saturate(1.15)}
.evgal[data-act="Overgrowth"] .evtile:not([data-acts~="Overgrowth"]),.evgal[data-act="Underdocks"] .evtile:not([data-acts~="Underdocks"]),.evgal[data-act="Hive"] .evtile:not([data-acts~="Hive"]),.evgal[data-act="Glory"] .evtile:not([data-acts~="Glory"]),.evgal[data-act="any"] .evtile:not([data-any]){display:none}
/* the picture: the card's 3:2 (the arena stage's); a painting is 2.13:1 with its subject in the left half, so it is cut from the left */
.evc-stage{position:relative;display:block;aspect-ratio:1.5/1;overflow:hidden;background:#05080a}
.evc-stage::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(transparent 58%,rgba(0,0,0,.5));box-shadow:inset 0 2px 12px rgba(0,0,0,.45)}
.evc img.evtile-img{position:absolute;inset:0;display:block;width:100%;height:100%;max-width:none;max-height:none;object-fit:cover;object-position:12% 50%;border-radius:0;background:none;pointer-events:none}
.evc .arena-a:focus-visible .evc-stage{box-shadow:inset 0 0 0 3px var(--teal)}
.evc .arena-name{white-space:normal;width:max-content;max-width:88%;text-align:center;text-wrap:balance}
/* the foot is ONE LINE at every width (Bean, 20 Sep 2026: "We cant have double lines here because it ruins the spacing for the whole page"): the "?" and the
   choices where an enemy has its heart and HP, Fight at its right end. The act chips sit in the picture's top right corner, one under the other */
.evc .arena-f{flex-wrap:nowrap;min-height:2.95rem}
.evc .arena-hp{flex:none;white-space:nowrap}
.evc-acts{position:absolute;right:8px;top:8px;z-index:4;display:flex;flex-direction:column;align-items:flex-end;gap:4px;pointer-events:none}
.evc-acts .evq-act{background:rgba(0,0,0,.68);box-shadow:0 2px 0 rgba(0,0,0,.4)}
.evc-n b{color:var(--gold-x)}
.evc-n .mi{width:1.35rem;height:1.35rem}
.evc.anc .evc-n{flex:0 1 auto;min-width:0;font-family:var(--font-t);font-size:.92rem;color:var(--muted)}
.evc .mt-tags{flex:none;display:inline-flex;align-items:center;gap:6px;margin-left:auto}
.evc-n:empty{display:none}.evc-n:empty+.mt-tags{margin-left:0;justify-content:flex-start}   /* nothing to count (The Merchant??? is a shop): the chips start the foot, no hole at its left */
.evq-act{--rc:#7d8b91;border-color:var(--rc);color:#f3ead9}
.evq-act::before{content:"";flex:none;width:.5rem;height:.5rem;margin:0 .45em 0 .05em;rotate:45deg;border-radius:1px;background:var(--rc);box-shadow:0 0 0 1px rgba(0,0,0,.5)}
.evq-act.a-overgrowth{--rc:#A78A67}.evq-act.a-underdocks{--rc:#9F95A5}.evq-act.a-hive{--rc:#9B9562}.evq-act.a-glory{--rc:#819A97}.evq-act.a-any{--rc:#8a6cc9}
/* an event without a painting: the act's room with the enemy the event stages (or the event's own prop); an ancient: its map node on the ancients' violet */
.evtile-still{position:absolute;inset:0;display:block;background:#0c161b center/cover no-repeat}
.evtile-still.a-overgrowth{background-image:url(/img/rooms/lethal/overgrowth/0_sm.webp)}.evtile-still.a-underdocks{background-image:url(/img/rooms/lethal/underdocks/0_sm.webp)}.evtile-still.a-hive{background-image:url(/img/rooms/lethal/hive/0_sm.webp)}.evtile-still.a-glory{background-image:url(/img/rooms/lethal/glory/0_sm.webp)}
.evtile-still::after{content:"";position:absolute;inset:0;background:rgba(5,8,10,.3)}
.evtile-still .creature{position:absolute;z-index:1;left:50%;bottom:24%;translate:-50% 0;max-height:62%;max-width:60%;width:auto;height:auto;object-fit:contain;filter:drop-shadow(0 6px 6px rgba(0,0,0,.6))}
.evtile-still .creature.prop{max-height:44%;max-width:56%}
.evc.anc .evtile-still{background:radial-gradient(46% 62% at 50% 42%,rgba(238,130,238,.22),transparent 72%),linear-gradient(#1c1a2e,#0c161b)}
.evc.anc .evtile-still::after{display:none}
.evtile-still img.node{position:absolute;left:50%;top:42%;translate:-50% -50%;width:auto;height:64%;max-width:60%;aspect-ratio:1;object-fit:contain;filter:drop-shadow(0 6px 8px rgba(0,0,0,.7))}
.evancs .chap-b{padding-bottom:var(--pad)}
.evancs[hidden]{display:none}

/* ---------- narrow stages, phones, reduced motion ---------- */
/* under 760 px of stage the column cannot share the painting: the painting on top (its subject side), the column under it on the dark stage */
@container (max-width:760px){
  .evstage,.evstage.combat{display:block;aspect-ratio:auto}
  .evstage img.evbg{position:relative;inset:auto;height:auto;aspect-ratio:16/9;object-position:12% 50%}
  .evstage.combat .encstage{position:relative;inset:auto;aspect-ratio:16/9}
  .evstage.combat .encstage .lineup{left:3%;right:3%}
  .evstage.combat .evrug{left:50%}
  .evstage.combat::after{display:none}
  .evcolumn,.evstage.combat .evcolumn{padding:18px 16px 20px}
  .evtext{min-height:0;font-size:1.04rem}
  .evopt{min-height:4rem;font-size:1rem;padding:.5rem 1.7rem .55rem 1.6rem}
  .evband{aspect-ratio:16/9}
  /* the tag stays on the painting (16:9 of the stage's width, on top): its bottom-left corner, never under the plates */
  .evcoop,.evstage.combat .evcoop{left:10px;right:auto;bottom:auto;top:calc(56.25cqw - 10px);translate:0 -100%}
  .evstage.noart .evcoop{top:auto;translate:none}
  .evband .evcoop{top:10px;left:auto;right:10px;bottom:auto;translate:none}   /* the narrow band's caption needs its whole width: the tag takes the top-right corner */
  .evcoop-x{padding:.3rem .65rem .35rem .45rem}
  .evcoop-t b{font-size:.8rem}.evcoop-t small{font-size:.68rem}
}
@container (max-width:720px){
  .evpair{grid-template-columns:minmax(0,1fr)}
  .evrow{grid-template-columns:minmax(0,1fr)}
  .evrow-a,.evrow.deep>.evrow-a{padding:18px 18px;border-right:0;border-bottom:1px solid rgba(255,255,255,.07);border-radius:10px 10px 0 0}
  .evrow.solo>.evrow-a{border-bottom:0;border-radius:10px}
  .evrow-b{padding:18px 18px 20px}
  .evrow.sub>.evrow-a,.evrow.sub>.evrow-b{padding:14px 14px}
}
@media (max-width:760px){
  .evwhere-acts{grid-auto-flow:row;grid-template-columns:repeat(2,minmax(0,1fr))}
  .evwhere.n1 .evwhere-acts{grid-template-columns:minmax(0,1fr)}
  .evwhere.n3 .evwact:first-child{grid-column:1/-1}
  .evwhere.n3 .evwact:first-child .evwact-name{font-size:clamp(1.7rem,8.5cqw,2.4rem)}   /* the full-width first banner: its name grew to 54 px in a 93 px banner and ran 6 px past the clip (wave 6 QoL); 36 px keeps it a step over its two neighbours */
}
@media (max-width:640px){.evc-stage{aspect-ratio:1.7/1}}
@media (prefers-reduced-motion:reduce){.evopt,.evopt:hover,.evopt:active,.evopt:focus-visible{scale:1;transition:none}.evopt.flash .evo-f,.evopt.warn:hover .evo-r,.evsay.lit,.evnext.lit,.evrow.lit,.evgame .evtitle,.evp.in .evtext,.evp.in .evopt{animation:none}.evwact-band,.evwact-n,.evwact-name{animation:none}.evwact::after{transition:none}}
/* ---------- the type tags (pages_events.js evTypes): every event says what it offers, in the Fight pill's own language. Words at every width a card can take;
   the four-tag cards (Battleworn Dummy, Crystal Sphere, Endless Conveyor, The Trial) give up the word "choices" first, then swap the words for the game's icons,
   so THE FOOT IS ONE LINE AT EVERY WIDTH. Each card is a container, so the step follows the card's own width, never the window's. The steps are in rem
   because the root size grows with the window (15.65px at 1345, 16.9px at 1640): measured, a four-tag foot needs 22.5rem with the word and 19.3rem without it. ---------- */
.evgal .evtile[hidden]{display:none}
.evc{container-type:inline-size}
.evc .mt-tags{gap:5px;flex-wrap:nowrap}
.evt{white-space:nowrap}
.evt .evt-i{display:none;width:1.3rem;height:1.3rem;margin:-3px -2px -2px;object-fit:contain;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
.evt-relic{color:#ffb877;border-color:rgba(255,184,119,.45)}
.evt-cards{color:#9fcbff;border-color:rgba(159,203,255,.42)}
.evt-potion{color:#86e3a6;border-color:rgba(134,227,166,.42)}
.evt-gold{color:#ffe68a;border-color:rgba(255,230,138,.45)}
.evt-health{color:#ff9aa6;border-color:rgba(255,154,166,.45)}
@container (max-width:22.8rem){.evc .arena-f:has(.mt-tags[data-n="4"]) .evc-w{display:none}}
@container (max-width:19.6rem){.evc .mt-tags[data-n="4"] .evt-w{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.evc .mt-tags[data-n="4"] .evt-i{display:block}.evc .mt-tags[data-n="4"] .evt{padding:2px 5px}}
@container (max-width:18.4rem){.evc .arena-f:has(.mt-tags[data-n="3"]) .evc-w{display:none}}
/* an Ancient's foot carries its byname, not a count: the longest (Neow's) keeps its every letter on the narrowest card by taking the tag's icon for its word */
@container (max-width:17.6rem){.evc.anc .evt-w{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.evc.anc .evt-i{display:block}.evc.anc .evt{padding:2px 5px}}
/* the Offers chips: the same six, each with the game's icon, beside the Act chips */
/* a pressed chip and its removable tag take the chip's own colour (filters.css --fc from --rc; Bean, 21 Sep 2026: selected filters "should be relevant to their color"): each
   Offers chip wears the colour of its type tag on the cards (Fight gold as .mq-fight, the rest as .evt-* above) */
.fgrp-evtype .fchip[data-v="fight"]{--rc:#EFC851}.fgrp-evtype .fchip[data-v="relic"]{--rc:#ffb877}.fgrp-evtype .fchip[data-v="cards"]{--rc:#9fcbff}.fgrp-evtype .fchip[data-v="potion"]{--rc:#86e3a6}.fgrp-evtype .fchip[data-v="gold"]{--rc:#ffe68a}.fgrp-evtype .fchip[data-v="health"]{--rc:#ff9aa6}
.fgrp-evtype .fchip{padding-left:7px}
.fgrp-evtype .evt-ci{width:1.35rem;height:1.35rem;object-fit:contain;filter:saturate(.35) brightness(.8);transition:filter .12s}
.fgrp-evtype .fchip:hover .evt-ci,.fgrp-evtype .fchip.on .evt-ci{filter:none}

/* ===== app/factbox.css ===== */
/* ===== fact boxes: ONE line, ONE icon size (wave 5, 22 Sep 2026; CORE stream; docs/wave5/core.md 1c) =====
   The component is pages_acts.js factBox / factRow (the look is enemyturns.css .ew-fact; this file sorts AFTER it, so what stands here wins at equal specificity).
   Bean, 22 Sep 2026: "We cant have multi line info text on supporting info/icon boxes. As an example, Charon's Ashes has "Kill 15 Bosses with the ironclad" which adds
   a second line of space to all the boxes. We can't do that anywhere on the site, these boxes need to be the same height if they are next to each other, no unnecessary
   height added to cope for another box though." and on potions: "remove supporting explanatory text from main info boxes ... hover over the trophies text, which is
   already a re-direct should show the basic info above it on hover in a cool way." and on the icons: "these icons seem bigger there, then they do on the dedicated enemy
   page for the same styled info. We need this icon sizing to match the other pages. It should all be the same".
   So: the small line is in the page but not on screen (it is the hover, core.js factTipHtml, drawn by tipbox.css); a value never wraps (an ellipsis cuts a value that
   is too long for its box: that is the page's fault, listed in docs/wave5/core.md section 5); the 3D icon cell is 2.7rem everywhere (enemyturns.css' 2.45rem inside
   .ewin and the 3rem / 3.3rem of ancients.css, events.css, achievements.css are neutralised below); boxes in a row share the row's height by flex stretch and, with one
   line each, that height is the same on every row. */

/* the sub line: kept for crawlers and screen readers, off screen for everyone else (never display:none: a search engine would drop it) */
.ew-fact-t .ew-fact-s{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
/* the value: one line, cut with an ellipsis, never a second row */
.ew-fact .ew-fact-row .ew-fact-t{position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow-wrap:normal;min-width:0;flex:1 1 auto}
.ew-fact .ew-fact-row .ew-fact-t>b,.ew-fact .ew-fact-row .ew-fact-t .dp-ud{white-space:nowrap}
/* a value with a hover: the help cursor only. No "i" after the text (Bean, 25 Sep 2026: "None of the boxes like this require i icons across the site, the user
   can just hover on the name or icon"); the value and the row's icon both open the box's plate (data-tip="fact:", pages_acts.js factRow / factIco3d) */
.ew-fact-t.has-s{cursor:help}
/* the boxes of a row share one height and the row inside stands in the middle of what is left under the label; nothing grows for a neighbour because nothing has a second line */
.ew-facts{align-items:stretch}
/* a box in a FLEX row is at least as wide as its one-line value: the row drops it to the next line instead of cutting it (Axebot's "10 to 20 gold" at 1000 px
   was cut to "10 to 20..." next to a wide "Found in" box). A value longer than the whole row still pushes its box past the row by the excess (min-width beats
   max-width; those values are the page's to shorten, docs/wave5/core.md section 5). The GRID containers are left out: a grid track is fixed, so there the
   value keeps its ellipsis; a new grid-based .ew-facts must be added to this list */
.ew-facts:not(.gd-glance):not(.mapfacts):not(.pt-facts):not(.ep-facts):not(.achstats):not(.climb-mods):not(.md-plates):not(.chb-facts)>.ew-fact:not(.full){min-width:fit-content}
.ew-fact:not(.full)>.ew-fact-row{flex:1 1 auto;align-items:center}
.ew-fact.full>.ew-fact-row{align-items:center}
/* ONE icon size on the whole site: the design law's 2.7rem cell (docs/wave4/detail.md section 1). The :has() selectors out-rank every page override */
.ew-fact .ew-fact-row .ew-fact-i:has(>.ew-fact-3d),.ew-fact .ew-fact-row .ew-fact-i:has(>.relic),.ew-fact .ew-fact-row .ew-fact-i:has(>.potion),.ew-fact .ew-fact-row .ew-fact-i:has(>.power),.ew-fact .ew-fact-row .ew-fact-i:has(>.iconlink),.ew-fact .ew-fact-row .ew-fact-i:has(>img.mi){width:2.7rem;height:2.7rem}
.ew-fact .ew-fact-row .ew-fact-i>:is(.relic,.potion,.power),.ew-fact .ew-fact-row .ew-fact-i>.iconlink>:is(.relic,.potion,.power){width:2.7rem;height:2.7rem}
.ew-fact .ew-fact-row .ew-fact-i>img.mi{width:2.5rem;height:2.5rem}
.ew-fact .ew-fact-row .ew-fact-i>.ew-fact-3d{width:100%;height:100%}
/* a phone keeps the size too (enemyturns.css shrank the cell to 2.3rem under 640 px); the boxes are two to a row there and the cell fits */
@media (max-width:640px){.ew-fact .ew-fact-row .ew-fact-i:has(>.ew-fact-3d){width:2.7rem;height:2.7rem}}

/* ===== app/filters.css ===== */
/* ===== list filters: the tier system (build/app/filters.js; docs/wave3/filters.md; Bean's notes, 17 Sep 2026) =====
   Cards and Relics. The old look (one .room box holding .pillrow pills, .filters with native selects and a default grey input)
   is gone; nothing here restyles .pill / .filters / .sel for other pages, every rule is scoped under the new classes:
   Tier 1 .fpick   floating on the page: the game's character-select portraits (char_select_<id>, the same mask / outline sprites as the
                   Card of the day practice picker) and, after a divider, the quiet secondary pools with the card library's own filter icons.
                   At rest a portrait is desaturated and slightly small, the chosen one is full colour, larger and ringed in its pool colour
                   (NCardPoolFilter: s .3 / v .55 and scale .95 off, 1.1 on; hover x1.2 is toned down to 1.08 here).
   Tier 2 .fstrip  one slim boxed strip: .fsearch is the top bar's search field (style.css .search: same plate, magnifier, radius, focus ring,
                   placeholder colour) plus a clear button; the Base / Upgraded plates are .upg-toggle.game from buttons.css, only made a
                   little smaller. Sticky under the top bar on tall, wide viewports.
   Tier 3 .ffine   light chip groups, no box: type icons (card_library/type_sort_*), rarity gems in the rarity colours, cost on the energy
                   orb of the chosen character. Behind the .fmore button on phones.
   .fhead          results header: count, removable .ftag per set filter, Clear all, Sort (.fsort: the one native select left, plated).
   Every sprite is addressed from data-c / data-v so the markup carries no image urls. Colour is never the only signal: a pressed control
   also changes its border weight, fill and size, and carries aria-pressed. */

/* ---------- Tier 1: the pool picker ---------- */
.fpick.pillrow{display:flex;flex-wrap:wrap;align-items:stretch;gap:12px 0;margin:calc(var(--stack) + 2px) 0 calc(var(--stack) + 2px);padding:2px 0 0}
/* the row spans the content's whole width (Bean, 17 Sep 2026: "make the char and card type options span the whole width of the page safe space"): the portraits
   grow a little and spread out, the secondary pools sit at the right end */
.fpick-main{display:flex;flex:1 1 auto;flex-wrap:nowrap;justify-content:space-between;gap:clamp(6px,1.6vw,30px);min-width:0;padding:0 4px}
.fpk{--c:var(--gold);position:relative;display:flex;flex-direction:column;align-items:center;gap:13px;margin:0;padding:0;border:0;border-radius:8px;background:none;color:var(--dim);font-family:var(--font-t);font-size:.84rem;line-height:1;text-decoration:none;cursor:pointer;-webkit-tap-highlight-color:transparent;user-select:none;-webkit-user-select:none}
/* the label sits clear of the picked outline (Bean, 23 Sep 2026: "Text here is getting intruded on in all filter sections by the outline of the character"): the outline
   reaches about 11 px under the portrait at 1.04 (the ::before's margin plus the pick's scale), so the gap is 13 px, not 6; a .quiet button keeps its own 8 px */
.fpk:hover{text-decoration:none}
.fpk[data-c="ironclad"]{--c:var(--ironclad)}.fpk[data-c="silent"]{--c:var(--silent)}.fpk[data-c="defect"]{--c:var(--defect)}.fpk[data-c="necrobinder"]{--c:var(--necrobinder)}.fpk[data-c="regent"]{--c:var(--regent)}
.fpk[data-c="colorless"]{--c:var(--colorless)}.fpk[data-c="curse"]{--c:#a877e0}.fpk[data-c="status"]{--c:#aab4b8}.fpk[data-c="shared"]{--c:var(--teal)}
/* the portraits grow WIDER with the row, never taller (Bean: "make the character calling cards wider to make up for the empty space", then "they are way too big
   now, I meant add to the width of each one, the height was fine"): the plate keeps its 7.1rem height (the old 4.8rem x 130/88) and stretches to 6.4rem wide */
.fpick-main .fpk{flex:1 1 0;width:auto;max-width:6.4rem;min-width:0;transition:transform .5s cubic-bezier(.16,1,.3,1)}
.fpick-main .fpk-p{aspect-ratio:auto;height:7.1rem}
.fpick-main .fpk:hover,.fpick-main .fpk:focus-visible{transform:scale(1.08);transition-duration:0s;z-index:2}
.fpick-main .fpk:active{transform:scale(1.01)}
.fpk:focus-visible{outline:2px solid var(--teal);outline-offset:3px}
.fpk-p{position:relative;isolation:isolate;display:block;width:100%;aspect-ratio:88/130;scale:.94;transition:scale .3s cubic-bezier(.16,1,.3,1)}
/* the ring: the game's outline sprite as a mask over the pool colour, a little larger than the portrait; the soft offset shadow under it. ONE BAND ALL ROUND
   (Bean, 23 Sep 2026: "the outline should be the same width on the sides and top, please make the outline on top the same heights as the width on the sides"):
   the sprite (144 x 207, opaque 137 x 200) stretched by a share of the width at the sides but only 3.5% of the height at the top showed a band half as thick
   on top. The sides keep their band t = 7.17% of the portrait's width (the old 8.5% inset); top and bottom now take the same t, set in margins, whose
   percentages are of the width on every side: inset .42% of the height (the sprite's own top margin against the portrait mask's) plus a margin of
   1.035 x t (207/200) = 7.42% of the width. */
.fpk-p::before{content:"";position:absolute;inset:-.42% 0;margin:-7.42% -8.5%;z-index:-1;opacity:0;background:var(--c);-webkit-mask:url(/img/packed/character_select/char_select_outline.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_outline.webp) center/100% 100% no-repeat;transition:opacity .2s}
.fpk-p::after{content:"";position:absolute;inset:0;z-index:-2;translate:7% 6%;background:#000;opacity:.3;-webkit-mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat}
.fpk-art{display:block;width:100%;height:100%;background:#22343c center/cover no-repeat;-webkit-mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;filter:saturate(.25) brightness(.72);transition:filter .5s cubic-bezier(.16,1,.3,1)}
.fpk[data-c="ironclad"] .fpk-art{background-image:url(/img/packed/character_select/char_select_ironclad.webp)}
.fpk[data-c="silent"] .fpk-art{background-image:url(/img/packed/character_select/char_select_silent.webp)}
.fpk[data-c="defect"] .fpk-art{background-image:url(/img/packed/character_select/char_select_defect.webp)}
.fpk[data-c="necrobinder"] .fpk-art{background-image:url(/img/packed/character_select/char_select_necrobinder.webp)}
.fpk[data-c="regent"] .fpk-art{background-image:url(/img/packed/character_select/char_select_regent.webp)}
/* All: the compendium's own menu art for that list (Card Library / Relic Collection), cropped to the portrait */
.fpk[data-c="all"] .fpk-art{background-image:url(/img/ui/main_menu/submenu_card_library.webp);background-size:auto 116%}
.fpick[data-art="relics"] .fpk[data-c="all"] .fpk-art{background-image:url(/img/ui/main_menu/submenu_relic_collection.webp);background-position:42% center}
.fpk:hover .fpk-art,.fpk:focus-visible .fpk-art,.fpk.on .fpk-art{filter:none;transition-duration:.05s}
.fpk.on .fpk-p{scale:1.04;transition:scale .2s cubic-bezier(.34,1.56,.64,1)}
.fpk.on .fpk-p::before{opacity:.95}
.fpk-n{white-space:nowrap;letter-spacing:.01em;padding:0 1px 3px;border-bottom:2px solid transparent;transition:color .15s}
.fpk:hover .fpk-n{color:#fff6e2}
.fpk.on{color:#fff6e2;cursor:default}
.fpk.on .fpk-n{font-weight:700;border-bottom-color:var(--c)}
/* the secondary pools: quiet, small, a column beside the portraits */
.fpick-more{display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;gap:1px;margin-left:clamp(12px,1.6vw,24px);padding:0 0 1.2rem clamp(10px,1.4vw,20px);border-left:2px solid rgba(255,255,255,.09)}
.fpk.quiet{flex-direction:row;gap:8px;padding:4px 12px 4px 6px;border:1px solid transparent;border-radius:9px;font-size:.9rem;transition:color .15s,background-color .15s,border-color .15s}
.fpk-i{display:block;flex:none;width:1.4rem;height:1.4rem;background:center/contain no-repeat;filter:saturate(.2) brightness(.8);transition:filter .3s}
.fpk[data-c="colorless"] .fpk-i{background-image:url(/img/ui/card/energy_colorless.webp)}
.fpk[data-c="curse"] .fpk-i{background-image:url(/img/packed/card_library/pool_filter_other.webp)}
.fpk[data-c="status"] .fpk-i{background-image:url(/img/packed/card_library/type_sort_other.webp)}
.fpk[data-c="shared"] .fpk-i{background-image:url(/img/ui/map/icons/map_chest.webp);background-size:135%}
.fpk.quiet .fpk-n{padding:0;border:0}
.fpk.quiet:hover{background:rgba(255,255,255,.05)}
.fpk.quiet:hover .fpk-i,.fpk.quiet:focus-visible .fpk-i,.fpk.quiet.on .fpk-i{filter:none}
.fpk.quiet.on{background:rgba(0,0,0,.42);border-color:var(--c);box-shadow:inset 0 0 0 1px var(--c)}

/* ---------- Tier 2: the strip ---------- */
.fstrip.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px var(--gap);margin:0 0 var(--stack);padding:8px 10px;border:2px solid var(--line);border-radius:12px;background:linear-gradient(#17282f,#111e24);box-shadow:0 5px 0 rgba(0,0,0,.42),inset 0 1px 0 rgba(255,255,255,.06)}
.fsearch{position:relative;flex:1 1 15rem;min-width:0}   /* the whole strip (Bean: "the search bar should just span the whole page") */
.fstrip .fsearch input[type=search]{display:block;width:100%;min-width:0;margin:0;padding:9px 42px 8px 40px;border-radius:9px;border:2px solid #0a1216;background:#0f1c22 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a9aa1' stroke-width='2.4'%3E%3Ccircle cx='10.5' cy='10.5' r='6.5'/%3E%3Cpath d='M15.5 15.5 21 21'/%3E%3C/svg%3E") 12px center/18px no-repeat;color:#fff;font-family:var(--font-b);font-size:1rem;line-height:1.3;box-shadow:inset 0 3px 0 rgba(0,0,0,.4);-webkit-appearance:none;appearance:none}
.fstrip .fsearch input[type=search]::placeholder{color:var(--dim);opacity:1}
.fstrip .fsearch input[type=search]:focus{border-color:var(--teal);outline:0;box-shadow:inset 0 3px 0 rgba(0,0,0,.4),0 0 0 3px rgba(63,216,207,.2)}
.fsearch input::-webkit-search-cancel-button,.fsearch input::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}
/* a strip that holds the field alone (Relics) does not stretch across a wide page */
.fstrip.solo{max-width:none}
.fsearch-x{position:absolute;right:6px;top:50%;translate:0 -50%;width:30px;height:30px;margin:0;padding:0;border:0;border-radius:50%;background:rgba(255,255,255,.08) url(/img/compressed/back_button_x.webp) center/13px no-repeat;cursor:pointer;opacity:.8}
.fsearch-x:hover{opacity:1;background-color:rgba(255,255,255,.16)}
.fsearch-x:focus-visible{outline:2px solid var(--teal);outline-offset:1px;opacity:1}
.fsearch-x[hidden],.fbadge[hidden]{display:none}
/* the card page's plates, a size down so the strip stays slim */
.fstrip .upg-toggle.game,.ffine-b>.upg-toggle.game{flex:none;margin-left:auto;padding:0 2px 3px;gap:8px}
.fstrip .upg-toggle.game button,.ffine-b>.upg-toggle.game button{width:6.1rem;font-size:.9rem}
/* sticky: tucked a few px under the top bar's torn edge so nothing scrolls through a gap between the two; below the bar (60) and the phone drawer (55), above a hovered card (6) */
@media (min-width:761px) and (min-height:700px){.fstrip.toolbar{position:sticky;top:calc(var(--tb-h) - 5px);z-index:20}
  /* keyboard: a card or icon scrolled into view by focus stops below the stuck strip, not under it */
  .fstrip~.results .card,.fstrip~.results .relic{scroll-margin-top:calc(var(--tb-h) + 5.5rem)}}

/* ---------- Tier 3: the chip groups ---------- */
.ffine.toolbar{display:block;margin:0 0 var(--stack)}
.fmore{display:none}
.ffine-b{display:flex;align-items:center;gap:10px 16px}   /* the chip rows to the Base / Upgraded plates: 16 px, so Type + Version + Mode share the first row at 1345 (Bean, 23 Sep 2026) */
.fgroups{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;gap:10px clamp(16px,2.4vw,36px);min-width:0}
.fgrp{display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}
/* VERSION AND MODE PINNED RIGHT (Bean, 23 Sep 2026, the card directory's chip rows with Version and Mode circled: "pin these to the right now on the card
   directory please"): the first of them takes the row's free space, so Type stays left and they end at the row's right edge. Where Type, Version and Mode no
   longer share a row (the railed 1000 px window, 760), Version holds row 1's right end and Mode row 2's, after Rarity, never a stray Mode leading row 2.
   Every directory's Version group is pinned the same way (one note, every page with that part). The width is the chip block's own (the rail changes it at one
   window size), in px: the root font is 15 px in the railed 1000 px window. Phones keep the stacked panel. */
@media (min-width:641px){
  .fgroups{container:fgroups/inline-size}
  .fgroups>.fgrp-ver,.fgroups:not(:has(>.fgrp-ver))>.fgrp-mp{margin-left:auto}
  .fgroups>.fgrp-cost{margin-left:auto}   /* the Cost orbs end the Rarity row (Bean, 23 Sep 2026: "mana can be moved here in card directory") */
  @container fgroups (max-width:799px){.fgroups:has(>.fgrp-mp)>.fgrp-rar{order:1}.fgroups:has(>.fgrp-mp)>.fgrp-mp{order:2;margin-left:auto}.fgroups:has(>.fgrp-mp)>.fgrp-cost{order:3}}   /* narrow: Version, Mode and Cost end rows 1 to 3 */
  @container fgroups (max-width:669.5px){.fgroups:has(>.fgrp-mp)>.fgrp-cost{margin-left:0}}   /* narrower still, Rarity fills row 2 and Mode + Cost share row 3: one auto margin, so they end the row together */
}
.fgrp-l{min-width:3.4rem;margin-right:2px;font-family:var(--font-t);font-size:.74rem;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
.fchip{display:inline-flex;align-items:center;gap:6px;min-height:2.05rem;margin:0;padding:4px 11px 3px 9px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:rgba(0,0,0,.3);color:var(--muted);font-family:var(--font-t);font-size:.92rem;line-height:1;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:border-color .12s,color .12s,background-color .12s}
.fchip:hover{border-color:rgba(255,255,255,.55);color:#fff}
/* THE TINT IS A LAYER UNDER THE WORD, NEVER ON IT (wave 5; Bean, 22 Sep 2026: "When selecting a filter such as :uncommon" the color coordinating of the outline and bg
   color of the filter is good, I just dont like how it covers the text with the background color too, keep the text above the color coded bg color, do this fix for all
   directories where its an issue please"). What he saw: the selected chip's WORD was tinted with the same colour as its wash (color-mix of --fc into the cream), so the
   word sank into the background. Now the wash is its own layer (::before, z-index -1 inside the chip's own stacking context) between the dark plate and the content,
   and the word stays the plain cream every chip uses, with a hair of dark under it. Every chip group in every directory gets it from this one rule (the enemies'
   Kind chips, the potions' new Buff / Debuff chips and the cards' Multiplayer chip included); the cost orb has no wash (its number already stands on the orb) and the
   removable tags get the same cream word below. Scoped to .fgrp: the Powers page's Buff / Debuff plates carry .fchip too but are buttons.css plate sprites. */
.fgrp .fchip{position:relative;isolation:isolate}
.fgrp .fchip::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;background:color-mix(in srgb,var(--fc) 15%,transparent);opacity:0;pointer-events:none;transition:opacity .12s}
.fgrp .fchip.on::before{opacity:1}
.fgrp-cost .fchip::before{display:none}
.fchip:focus-visible,.fmore:focus-visible,.ftag:focus-visible,.fclear:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
/* A SELECTED CONTROL TAKES THE COLOUR OF WHAT IT MEANS (Bean, 21 Sep 2026: "Both the created x outable filters and the original filter selectors, when selected should
   be relevant to their color. So right now the background for all of them is yellow with a more solid yellow outline. Take that same philosophy but make it the
   color of the rarity, eg uncommon do the uncommon blue, rare do the rare gold etc."; Relics: "Same rules ... apply here (and everywhere else there may be rarity
   filters)"; Enemies: "Color the filter outline and light background according to their diamond color"). The recipe is the old one (a light wash, a solid 2 px
   outline, the word tinted), the colour is --fc. A chip's --fc is its gem colour --rc wherever a module gives it one (rarity here and in potions.css, the act
   gems in acts.css / events.css, the achievement tiers), so a new chip group with a gem is coloured for free; a picker button's is its pool colour --c; anything
   else gets the neutral --fc-n (the steel of the card library's type icons). filters.js copies a control's computed --fc onto its removable tag. */
.fchip,.fpk,.ftag{--fc-n:#b9cbd0}
.fchip{--fc:var(--rc,var(--fc-n))}
.fpk{--fc:var(--c)}
.fchip.on{border-color:var(--fc);box-shadow:inset 0 0 0 1px var(--fc);background:transparent;color:#fff6e2;text-shadow:0 1px 0 rgba(0,0,0,.4)}   /* the wash is the ::before layer above (the same 15 % it was); the word stays cream (22 Sep 2026) */
.fchip-i{display:block;flex:none;width:.92rem;height:1.09rem;background:center/contain no-repeat;opacity:.7}
.fchip:hover .fchip-i,.fchip.on .fchip-i{opacity:1}
.fgrp-type .fchip[data-v="attack"] .fchip-i{background-image:url(/img/packed/card_library/type_sort_attack.webp)}
.fgrp-type .fchip[data-v="skill"] .fchip-i{background-image:url(/img/packed/card_library/type_sort_skill.webp)}
.fgrp-type .fchip[data-v="power"] .fchip-i{background-image:url(/img/packed/card_library/type_sort_power.webp)}
.fgrp-plain .fchip{padding-left:11px}.fgrp-plain .fchip-i{display:none}
/* the Enemies list's Kind chips have no gem; Bosses and Elites take the colour their tile tag already has (style.css .mq-boss / .mq-elite) */
#fkind .fchip[data-v="Boss"],.fgrp-encpool .fchip[data-v="boss"]{--rc:#c4382e}#fkind .fchip[data-v="Elite"],.fgrp-encpool .fchip[data-v="elite"]{--rc:#b04ac0}
/* THE KIND CHIPS CARRY AN ICON (wave 5 hook; Bean, 22 Sep 2026, on the Enemies directory: "The way we have icons for filters like "ironclad", rarities, etc. we
   need for "bosses", "elites", "monsters" and the rest. They should look clean and be in game icons displayed small like we do for the character filters.").
   fChips(...,'kind') gives the group .fgrp-kind; each chip reads its picture from --ki (and --ki-size) and its colour from --rc, so the ENEMIES stream sets both
   per value in its own stylesheet with the id: `#fkind .fchip[data-v="Boss"]{--rc:#c4382e;--ki:url(/img/...)}` (an id selector wins over these defaults in any
   bundle order; the removable tag and filterIconHtml('kind',v) follow through the same variables). The defaults below are the Encounters' Room icons, the game's
   summon intent for Minions and its heart emote for Pets, until the ENEMIES stream picks. */
.fgrp-kind .fchip{padding-left:8px}
.fgrp-kind .fchip-i,.fico[data-k="kind"]{width:1.35em;height:1.35em;background-image:var(--ki,none);background-size:var(--ki-size,contain);opacity:.85;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.fgrp-kind .fchip-i{margin:-3px 0 -2px -2px}
:is(.fgrp-kind .fchip,.fico[data-k="kind"])[data-v="Boss"]{--rc:#c4382e;--ki:url(/img/ui/map/icons/map_chest_boss.webp);--ki-size:135%}
:is(.fgrp-kind .fchip,.fico[data-k="kind"])[data-v="Elite"]{--rc:#b04ac0;--ki:url(/img/ui/run_history/elite.webp)}
:is(.fgrp-kind .fchip,.fico[data-k="kind"])[data-v="Monster"]{--ki:url(/img/ui/run_history/monster.webp)}
:is(.fgrp-kind .fchip,.fico[data-k="kind"])[data-v="Minion"]{--ki:url(/img/intents/full/intent_summon.webp)}
:is(.fgrp-kind .fchip,.fico[data-k="kind"])[data-v="Pet"]{--ki:url(/img/ui/emote/heart.webp)}
/* BUFF / DEBUFF (wave 5; Bean, 22 Sep 2026, Potions: "Add "buff" and "debug filters please, with icons of course to the left like we are doing all filters"): the
   game's own intent signs, the blue up arrow for a buff and the red down arrow for a debuff (src/img/intents/full). fChips(...,'ptk') on Potions; the same two
   pictures serve filterIconHtml('ptk'|'ptype', 'buff'|'debuff') (a power's kind on a dedicated page). Colours: the housing's buff green and the site's red. */
.fgrp-ptk .fchip{padding-left:8px}
.fgrp-ptk .fchip-i,.fico[data-k="ptk"],.fico[data-k="ptype"]{width:1.25em;height:1.25em;opacity:.9;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.fgrp-ptk .fchip-i{margin:-2px 0 -2px -1px}
:is(.fgrp-ptk .fchip,.fico[data-k="ptk"],.fico[data-k="ptype"])[data-v="buff"]{--rc:#8fd96b}
:is(.fgrp-ptk .fchip,.fico[data-k="ptk"],.fico[data-k="ptype"])[data-v="debuff"]{--rc:var(--red)}
:is(.fgrp-ptk .fchip[data-v="buff"] .fchip-i,.fico[data-k="ptk"][data-v="buff"],.fico[data-k="ptype"][data-v="buff"]){background-image:url(/img/intents/full/intent_buff.webp)}
:is(.fgrp-ptk .fchip[data-v="debuff"] .fchip-i,.fico[data-k="ptk"][data-v="debuff"],.fico[data-k="ptype"][data-v="debuff"]){background-image:url(/img/intents/full/intent_debuff.webp)}
/* MULTIPLAYER (wave 5; Bean, 22 Sep 2026: the cards directory "where we need to add a filter for "Multiplayer" that shows only multiplayer cards"): one chip,
   fChips(...,'mp'), value "multi"; the picture is the game's Team Player run badge (ui/game_over_screen/badge_team_player, the co-op handshake), the colour its teal */
.fgrp-mp .fchip{padding-left:8px}
.fgrp-mp .fchip-i,.fico[data-k="mp"]{width:1.3em;height:1.3em;opacity:.9;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.fgrp-mp .fchip-i{margin:-3px 0 -2px -2px}
:is(.fgrp-mp .fchip,.fico[data-k="mp"])[data-v="multi"]{--rc:#6fd3c9}
:is(.fgrp-mp .fchip[data-v="multi"] .fchip-i,.fico[data-k="mp"][data-v="multi"]){background-image:url(/img/ui/game_over_screen/badge_team_player.webp)}
/* THE ICON HOOK FOR OTHER PAGES (wave 5; Bean, 22 Sep 2026: "The way we show filter tags on the directory pages when clicked with the character icon or relevant
   rarity diamond and more should be brought over to all the dedicated pages, the tags look better with the cool icon next to it."). filters.js filterIconHtml(kind,
   value) returns `<i class="fico" data-k="kind" data-v="value">`; these rules draw it with no chip around it, in the same pictures the chips use. It sizes in em so it
   follows the chip or tag it stands in; a caller sets --fc from filterLook(kind,value).fc for the colour. Kinds: char, rar, type, ver, cost (data-c = the character
   whose orb), use, kind, ptk / ptype, mp, act, pool, q. */
.fico{display:inline-block;flex:none;vertical-align:-.2em;width:1.1em;height:1.1em;background:center/contain no-repeat}
.fico[data-k="char"]{width:1.4em;height:1.4em}
.fico[data-k="char"][data-v="ironclad"]{background-image:url(/img/ui/top_panel/character_icon_ironclad.webp)}.fico[data-k="char"][data-v="silent"]{background-image:url(/img/ui/top_panel/character_icon_silent.webp)}.fico[data-k="char"][data-v="defect"]{background-image:url(/img/ui/top_panel/character_icon_defect.webp)}.fico[data-k="char"][data-v="necrobinder"]{background-image:url(/img/ui/top_panel/character_icon_necrobinder.webp)}.fico[data-k="char"][data-v="regent"]{background-image:url(/img/ui/top_panel/character_icon_regent.webp)}
.fico[data-k="char"]:is([data-v="any"],[data-v="random"]){background-image:url(/img/ui/top_panel/character_icon_random_character.webp)}
.fico[data-k="char"]:is([data-v="all"],[data-v="shared"],[data-v="everyone"]){background-image:url(/img/packed/character_select/char_select_player_icon.webp)}
.fico[data-k="char"][data-v="colorless"]{background-image:url(/img/ui/card/energy_colorless.webp)}.fico[data-k="char"][data-v="curse"]{background-image:url(/img/packed/card_library/pool_filter_other.webp)}.fico[data-k="char"][data-v="status"]{background-image:url(/img/packed/card_library/type_sort_other.webp)}.fico[data-k="char"][data-v="enemy"]{background-image:url(/img/ui/run_history/monster.webp)}
.fico[data-k="rar"]{width:.62em;height:.62em;margin:0 .22em;rotate:45deg;border-radius:1px;background:var(--rc,#7d8b91);box-shadow:0 0 0 1px rgba(0,0,0,.5)}
.fico[data-k="rar"]:is([data-v="basic"],[data-v="starter"]){--rc:var(--r-basic)}.fico[data-k="rar"][data-v="common"]{--rc:var(--r-common)}.fico[data-k="rar"][data-v="uncommon"]{--rc:var(--r-uncommon)}.fico[data-k="rar"][data-v="rare"]{--rc:var(--r-rare)}.fico[data-k="rar"][data-v="ancient"]{--rc:var(--r-ancient)}.fico[data-k="rar"][data-v="shop"]{--rc:var(--gold-d)}.fico[data-k="rar"][data-v="event"]{--rc:var(--green-d)}.fico[data-k="rar"]:is([data-v="special"],[data-v="token"]){--rc:#ee82ee}.fico[data-k="rar"][data-v="curse"]{--rc:#a877e0}.fico[data-k="rar"]:is([data-v="status"],[data-v="quest"]){--rc:#aab4b8}
.fico[data-k="type"]{width:.92em;height:1.09em;opacity:.9}
.fico[data-k="type"][data-v="attack"]{background-image:url(/img/packed/card_library/type_sort_attack.webp)}.fico[data-k="type"][data-v="skill"]{background-image:url(/img/packed/card_library/type_sort_skill.webp)}.fico[data-k="type"][data-v="power"]{background-image:url(/img/packed/card_library/type_sort_power.webp)}.fico[data-k="type"]:is([data-v="curse"],[data-v="status"],[data-v="other"]){background-image:url(/img/packed/card_library/type_sort_other.webp)}
.fico[data-k="ver"]{width:1.2em;height:1.08em;filter:drop-shadow(0 1px 0 rgba(0,0,0,.55))}
.fico[data-k="ver"][data-v="live"]{background-image:var(--live-mark)}.fico[data-k="ver"][data-v="playtest"]{background-image:var(--pt-mark)}
.fico[data-k="cost"]{display:inline-grid;place-items:center;width:1.5em;height:1.5em;padding-bottom:.06em;background-image:url(/img/ui/card/energy_colorless.webp);background-size:100% 100%;color:#fff6e2;font-family:var(--font-t);font-size:.9em;font-weight:700;font-style:normal;line-height:1;text-shadow:1px 0 0 #1a1208,-1px 0 0 #1a1208,0 1px 0 #1a1208,0 -1px 0 #1a1208,1px 1px 0 #1a1208,-1px -1px 0 #1a1208,1px -1px 0 #1a1208,-1px 1px 0 #1a1208}
.fico[data-k="cost"][data-c="ironclad"]{background-image:url(/img/ui/card/energy_ironclad.webp)}.fico[data-k="cost"][data-c="silent"]{background-image:url(/img/ui/card/energy_silent.webp)}.fico[data-k="cost"][data-c="defect"]{background-image:url(/img/ui/card/energy_defect.webp)}.fico[data-k="cost"][data-c="necrobinder"]{background-image:url(/img/ui/card/energy_necrobinder.webp)}.fico[data-k="cost"][data-c="regent"]{background-image:url(/img/ui/card/energy_regent.webp)}
.fico[data-k="use"]{width:1.15em;height:1.15em}
.fico[data-k="use"][data-v="drink"]{background-image:url(/img/ui/game_over_screen/discovery_potion.webp)}.fico[data-k="use"][data-v="throw"]{background-image:url(/img/ui/combat/targeting_arrow_head.webp);rotate:-90deg}
.fico[data-k="act"]{width:.62em;height:.62em;margin:0 .22em;rotate:45deg;border-radius:1px;background:var(--rc,#7d8b91);box-shadow:0 0 0 1px rgba(0,0,0,.5)}
.fico[data-k="act"][data-v="Overgrowth"]{--rc:#A78A67}.fico[data-k="act"][data-v="Underdocks"]{--rc:#9F95A5}.fico[data-k="act"][data-v="Hive"]{--rc:#9B9562}.fico[data-k="act"][data-v="Glory"]{--rc:#819A97}.fico[data-k="act"][data-v="event"]{--rc:#8a9aa1}.fico[data-k="act"][data-v="any"]{--rc:#8a6cc9}
.fico[data-k="pool"]{width:1.4em;height:1.4em;opacity:.9;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.fico[data-k="pool"]:is([data-v="weak"],[data-v="normal"]){background-image:url(/img/ui/run_history/monster.webp)}.fico[data-k="pool"][data-v="elite"]{background-image:url(/img/ui/run_history/elite.webp);--rc:#b04ac0}.fico[data-k="pool"][data-v="boss"]{background-image:url(/img/ui/map/icons/map_chest_boss.webp);background-size:135%;--rc:#c4382e}.fico[data-k="pool"][data-v="event"]{background-image:url(/img/ui/run_history/event.webp)}
.fico[data-k="q"]{width:.9em;height:.9em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfdcdf' stroke-width='3'%3E%3Ccircle cx='10.5' cy='10.5' r='6.5'/%3E%3Cpath d='M15.5 15.5 21 21'/%3E%3C/svg%3E")}
/* a chip that names a character (the Timeline's "Play as", the Achievements' Character group, any later one) takes that character's colour, like the picker does */
.fchip[data-v="ironclad"]{--rc:var(--ironclad)}.fchip[data-v="silent"]{--rc:var(--silent)}.fchip[data-v="defect"]{--rc:var(--defect)}.fchip[data-v="necrobinder"]{--rc:var(--necrobinder)}.fchip[data-v="regent"]{--rc:var(--regent)}
/* Version (filters.js ptChips, kind "ver"): both chips carry a sticker. Playtest is the sign on the cards (--pt-mark), a size down in the chip (Bean, 21 Sep 2026:
   "make the playtest icon a little smaller": 1.4em -> 1.2em); Live game is a green round seal with a check drawn in the same language (--live-mark,
   docs/wave4/live-sign.py: "give live game an icon as well that is similar"). Their colours are the signs' own. */
.fgrp-ver .fchip{padding-left:8px}
.fgrp-ver .fchip-i{width:1.2em;height:1.08em;opacity:.85;filter:drop-shadow(0 1px 0 rgba(0,0,0,.55))}
.fgrp-ver .fchip[data-v="live"]{--rc:#5fc152}.fgrp-ver .fchip[data-v="live"] .fchip-i{background-image:var(--live-mark)}
.fgrp-ver .fchip[data-v="playtest"]{--rc:#f5c518}.fgrp-ver .fchip[data-v="playtest"] .fchip-i{background-image:var(--pt-mark)}
/* Cards: Version has stood right of Type since 21 Sep 2026 ("move the version filters to the right of "type filters""), Mode beside it since 23 Sep ("move version and
   multiplayer to the right of type"); the count line holds the Cost orbs before Sort ("move the cost filter to the left of the sort filter"): .fhead>.fgrp-cost below */
/* rarity: a small gem in the rarity colour beside the word */
.fgrp-rar .fchip-i{width:.56rem;height:.56rem;margin:0 2px 1px;rotate:45deg;border-radius:1px;background:var(--rc,#7d8b91);box-shadow:0 0 0 1px rgba(0,0,0,.5)}
.fgrp-rar .fchip[data-v="basic"],.fgrp-rar .fchip[data-v="starter"]{--rc:var(--r-basic)}.fgrp-rar .fchip[data-v="common"]{--rc:var(--r-common)}.fgrp-rar .fchip[data-v="uncommon"]{--rc:var(--r-uncommon)}.fgrp-rar .fchip[data-v="rare"]{--rc:var(--r-rare)}.fgrp-rar .fchip[data-v="ancient"]{--rc:var(--r-ancient)}.fgrp-rar .fchip[data-v="shop"]{--rc:var(--gold-d)}.fgrp-rar .fchip[data-v="event"]{--rc:var(--green-d)}
/* cost: the number on the card's energy orb; the orb is the chosen character's (grey until one is picked) */
.fgrp-cost .fchip{justify-content:center;width:2.15rem;height:2.15rem;min-height:0;padding:0 0 1px;border:0;border-radius:50%;background:url(/img/ui/card/energy_colorless.webp) center/100% 100% no-repeat;color:#fff6e2;font-size:1rem;font-weight:700;letter-spacing:-.02em;text-shadow:1px 0 0 #1a1208,-1px 0 0 #1a1208,0 1px 0 #1a1208,0 -1px 0 #1a1208,1px 1px 0 #1a1208,-1px -1px 0 #1a1208,1px -1px 0 #1a1208,-1px 1px 0 #1a1208,0 2px 0 rgba(0,0,0,.5);filter:saturate(.3) brightness(.72);transition:filter .2s,scale .3s cubic-bezier(.16,1,.3,1)}
.fgrp-cost .fchip-i{display:none}.fgrp-cost .fgrp-l{min-width:0;margin-right:6px}
/* Version and Mode never lead a row, so their caps labels take no column width: "MODE" padded to 3.4rem stood off its chip (Bean, 23 Sep 2026: "\"mode\" and multiplayer are too far from each other compared to other filters in the same style") */
.fgrp-ver .fgrp-l,.fgrp-mp .fgrp-l{min-width:0;margin-right:4px}
.fgrp-cost .fchip:hover{filter:saturate(.8) brightness(1)}
/* the chosen orb: NO RING (Bean, 21 Sep 2026: "The cost filter having a gold outline is unnecessary. Add a small barely visible tight glow around the selected one for
   its respective color, for the silent green, ironclad orange etc."). --orb is sampled from each energy_<id> sprite (the bright quarter of its saturated pixels);
   the glow is a drop-shadow, so it hugs the sprite's own outline instead of drawing a circle around a hexagon */
.ffine,.fhead{--orb:#d3d3d3}:is(.ffine,.fhead)[data-c="ironclad"]{--orb:#f57928}:is(.ffine,.fhead)[data-c="silent"]{--orb:#2eb56d}:is(.ffine,.fhead)[data-c="defect"]{--orb:#6db4ec}:is(.ffine,.fhead)[data-c="necrobinder"]{--orb:#fa98c7}:is(.ffine,.fhead)[data-c="regent"]{--orb:#fabc2d}   /* .fhead too: the Cards count line holds the Cost orbs (23 Sep 2026) */
.fgrp-cost .fchip{--fc:var(--orb)}
.fgrp-cost .fchip.on{filter:drop-shadow(0 0 1.5px color-mix(in srgb,var(--orb) 70%,transparent)) drop-shadow(0 0 3.5px color-mix(in srgb,var(--orb) 34%,transparent));scale:1.12;box-shadow:none;background-color:transparent}
:is(.ffine,.fhead)[data-c="ironclad"] .fgrp-cost .fchip{background-image:url(/img/ui/card/energy_ironclad.webp)}
:is(.ffine,.fhead)[data-c="silent"] .fgrp-cost .fchip{background-image:url(/img/ui/card/energy_silent.webp)}
:is(.ffine,.fhead)[data-c="defect"] .fgrp-cost .fchip{background-image:url(/img/ui/card/energy_defect.webp)}
:is(.ffine,.fhead)[data-c="necrobinder"] .fgrp-cost .fchip{background-image:url(/img/ui/card/energy_necrobinder.webp)}
:is(.ffine,.fhead)[data-c="regent"] .fgrp-cost .fchip{background-image:url(/img/ui/card/energy_regent.webp)}

/* ---------- results header ---------- */
.fhead.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;min-height:2.6rem;margin:0 0 10px;padding:0 0 8px;border-bottom:1px solid rgba(255,255,255,.09)}
.fcount{flex:none;font-family:var(--font-t);font-size:1rem;color:var(--muted);white-space:nowrap}
.fcount b{font-size:1.3rem;color:#fff6e2;margin-right:1px}
.fcount-of{color:var(--dim)}
.factive{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1 1 0;min-width:0}
.factive:empty{display:none}
/* THE TAGS (Bean, 21 Sep 2026: "the text is not vertically centered within its housing its slightly too low, maybe 1x. The design of these isn't great either, they
   feel uninspired"). A tag is a small plate in the site's button language: an opaque dark plate washed with --fc, a solid --fc outline, a lit top edge and a hard
   2 px ledge; the control's own icon (copied by filters.js fTagLook), the word, then the x in its own darker cell behind a hairline, 1.75rem wide (28 px) and as
   tall as the plate. Hover lights the outline and the x cell, a press sinks the plate onto its ledge. The whole tag is the button.
   CENTRING (measured in Chrome at 100% and 125%): with line-height 1 Kreon's baseline lies .785 em under the line box's top, cap height .69, x-height .49 em, so the
   capitals' middle is .06 em above the box's middle and the lower-case band's .04 em below it: the LINE BOX is the word's optical middle. What pushed the old tag
   low was its box, not the font: 4 px over / 3 px under the word, and a line box centred on the taller x icon. Now the plate has a min-height, no vertical padding
   and align-items:center, so the line box sits on the plate's middle at any zoom; line-height 1.3 only keeps descenders out of the ellipsis clip. The word is then raised .035 em
   (padding-bottom .07em) toward the lower-case band, which is what a word like "Uncommon" is made of. Chrome snaps the word to a whole pixel, so on a screenshot
   the raise only shows where the fraction falls that way; measured at device pixel ratios 1, 1.25, 1.5 (Bean's display) and 1.875 the capitals' middle is .2 to
   1.1 px over the plate's middle and the lower-case band's .4 to 1.4 px under it, the plate's middle between the two at every ratio. Do not go past .1em: the
   next pixel step (tried) leaves the word visibly high. */
.ftag{--fc:var(--fc-n);display:inline-flex;align-items:center;gap:6px;min-height:1.8rem;max-width:100%;margin:0 0 2px;padding:0 0 0 9px;border:1px solid color-mix(in srgb,var(--fc) 70%,transparent);border-radius:8px;background:linear-gradient(color-mix(in srgb,var(--fc) 21%,#0f1c22),color-mix(in srgb,var(--fc) 11%,#0f1c22));box-shadow:0 2px 0 rgba(0,0,0,.5),inset 0 1px 0 color-mix(in srgb,var(--fc) 32%,transparent);color:#fff6e2;text-shadow:0 1px 0 rgba(0,0,0,.4);font-family:var(--font-t);font-size:.88rem;line-height:1;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:border-color .12s,translate .08s,box-shadow .08s}   /* the word is cream over the wash, never tinted into it (22 Sep 2026, the chip rule above) */
.ftag-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:14rem;line-height:1.3;padding-bottom:.07em}
.ftag-i{display:block;flex:none;background:center/contain no-repeat}
img.ftag-i{width:1.3rem;height:1.3rem;object-fit:contain}
.ftag-head{width:1.4rem;height:1.4rem;margin:0 -1px 0 -2px}
.ftag-head[data-c="ironclad"]{background-image:url(/img/ui/top_panel/character_icon_ironclad.webp)}.ftag-head[data-c="silent"]{background-image:url(/img/ui/top_panel/character_icon_silent.webp)}.ftag-head[data-c="defect"]{background-image:url(/img/ui/top_panel/character_icon_defect.webp)}.ftag-head[data-c="necrobinder"]{background-image:url(/img/ui/top_panel/character_icon_necrobinder.webp)}.ftag-head[data-c="regent"]{background-image:url(/img/ui/top_panel/character_icon_regent.webp)}
.ftag-orb{width:1.3rem;height:1.3rem;margin-left:-2px}
.ftag-q{width:.9rem;height:.9rem;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfdcdf' stroke-width='3'%3E%3Ccircle cx='10.5' cy='10.5' r='6.5'/%3E%3Cpath d='M15.5 15.5 21 21'/%3E%3C/svg%3E")}
.ftag-x{display:block;flex:none;align-self:stretch;width:1.75rem;margin-left:3px;border-left:1px solid color-mix(in srgb,var(--fc) 36%,transparent);border-radius:0 7px 7px 0;background:rgba(0,0,0,.3) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke-linecap='round'%3E%3Cpath d='M2.6 2.6l6.8 6.8M9.4 2.6l-6.8 6.8' stroke='%230a1216' stroke-width='4'/%3E%3Cpath d='M2.6 2.6l6.8 6.8M9.4 2.6l-6.8 6.8' stroke='%23fff6e2' stroke-width='2'/%3E%3C/svg%3E") center/.72rem no-repeat;opacity:.82;transition:background-color .12s,opacity .12s}
.ftag:hover{border-color:var(--fc)}
.ftag:hover .ftag-x,.ftag:focus-visible .ftag-x{background-color:color-mix(in srgb,var(--fc) 34%,rgba(0,0,0,.3));opacity:1}
.ftag:active{translate:0 2px;box-shadow:0 0 0 rgba(0,0,0,.5),inset 0 1px 0 color-mix(in srgb,var(--fc) 32%,transparent);transition-duration:0s}
.ftag.new{animation:ftag-in .2s cubic-bezier(.34,1.56,.64,1)}
@keyframes ftag-in{from{opacity:0;scale:.84}}
/* Clear all: the quiet sibling of the tags, an unpressed chip of the same height */
.fclear{display:inline-flex;align-items:center;min-height:1.8rem;margin:0 0 2px 2px;padding:0 10px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:rgba(0,0,0,.3);color:var(--muted);font-family:var(--font-t);font-size:.84rem;line-height:1;cursor:pointer;transition:border-color .12s,color .12s}
.fclear:hover{border-color:rgba(255,255,255,.55);color:#fff}
@media (prefers-reduced-motion:reduce){.ftag.new{animation:none}.ftag:active{translate:none}}
.fsort{flex:none;margin-left:auto}
/* the Version chips in the header (fHead's extra; since 21 Sep 2026 Powers alone, which has no chip rows: Cards, Relics and Potions carry them on the chip row): at the right end, Sort after them; on a phone the label and the "Live game" chip go, the Playtest chip alone stays beside the count */
.fhead>.fgrp{flex:none;margin-left:auto;flex-wrap:nowrap}
.fhead>.fgrp+.fsort{margin-left:4px}
.fhead>.fgrp+.fgrp{margin-left:0}   /* two groups on the count line: only the first takes the auto margin */
.fhead>.fgrp-cost .fchip{padding:0 0 1px}   /* the Cost orbs keep their own shape on the count line (Cards, 23 Sep 2026) */
.fhead>.fgrp .fchip{min-height:0;padding-top:5px;padding-bottom:4px}
/* the count line is one line (Bean, 22 Sep 2026: Version joined Mode there on Cards). Where it runs short of room (the railed window at 1000 px, the plain window
   under 760 px) the groups drop their caps labels; on a phone the chips keep their icons alone (Playtest, Multiplayer: the sign says it, the .ftag names it once set) */
.fhead.toolbar{container-type:inline-size}
@container (max-width:720px){.fhead>.fgrp .fgrp-l{display:none}}   /* px: the root font is 15 px in the railed 1000 px window, so a rem bound would slide with it */
@media (max-width:640px){.fhead>.fgrp .fgrp-l,.fhead>.fgrp .fchip[data-v="live"],.fhead>.fgrp:not(.fgrp-cost) .fchip>span{display:none}.fhead>.fgrp:not(.fgrp-cost) .fchip{gap:0;padding-left:9px;padding-right:9px}.fhead>.fgrp .fchip-i{margin:-2px 0}.fhead .fsort label{font-size:0;gap:0}
  /* the Cost orbs on a phone's count line (Cards): five of 1.7rem and a slimmer Sort, so "596 Cards", the orbs and Sort share the 358 px */
  .fhead>.fgrp-cost{gap:5px}.fhead>.fgrp-cost .fchip{width:1.7rem;height:1.7rem;font-size:.86rem}.fhead .fsort .sel select{padding-right:24px}}
.fsort label{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-t);font-size:.74rem;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
/* THE DROPDOWN (wave 5; Bean, 22 Sep 2026, on the Events list, "Relevant to all pages with a dropdown filter": "while hovering over it, the highlight shouldn't be
   faded in over .4s instead of an instant hover animation. Also when you click on the filter dropdown it has a blue outline, make that less bright. This blue
   outline also stays when you click on the dropdown and then click on the dropdown again closing it, the highlight doesn't need to remain when you close it by
   clicking on it again."). Read with what the select did: the hover border switched with no transition at all, so the .4 s fade is the one asked for, in and out.
   The ring is the site's teal at a third of its old strength (the border half way to the plate's dark, the halo 9 % instead of 20 %). A pointer that opens the
   menu and closes it with a second click leaves the select focused, which is why the ring stayed: filters.js (SORT DROPDOWN) blurs it on that second press and
   after a pointer pick, so the ring is only ever on while the menu is open or while a keyboard user holds the focus. */
.fsort .sel select{padding:6px 30px 5px 11px;border:2px solid #0a1216;border-radius:8px;background:#0f1c22;box-shadow:inset 0 2px 0 rgba(0,0,0,.35);color:#fff6e2;font-family:var(--font-t);font-size:.92rem;letter-spacing:0;text-transform:none;line-height:1.2;transition:border-color .4s ease,box-shadow .4s ease}
.fsort .sel select:hover{border-color:var(--line-l)}
.fsort .sel select:focus-visible{border-color:color-mix(in srgb,var(--teal) 42%,#0a1216);outline:0;box-shadow:inset 0 2px 0 rgba(0,0,0,.35),0 0 0 3px rgba(63,216,207,.09)}
.fsort .sel select option{background:#0f1c22;color:#fff6e2;font-family:var(--font-t)}
.fsort .sel::after{right:11px;width:7px;height:7px}

/* ---------- empty state ---------- */
.fempty{display:flex;flex-direction:column;align-items:center;gap:6px;padding:34px 16px 40px;color:var(--muted)}
.fempty-i{display:block;width:3.6rem;height:3.6rem;background:url(/img/stats/stats_questionmark.webp) center/contain no-repeat;opacity:.85}
.fempty p{margin:4px 0 10px;max-width:34rem}
.fempty p b{display:block;margin-bottom:2px;font-family:var(--font-t);font-size:1.2rem;color:#fff6e2}

/* ---------- phones: the portraits share the row, the secondary pools become a row of small buttons, Tier 3 folds behind "Filters" ---------- */
@media (max-width:640px){
  .fpick-main{width:100%;gap:5px;padding:0 2px}
  .fpick-main .fpk{flex:1 1 0;width:auto;font-size:.72rem;letter-spacing:-.01em}
  .fpick-more{flex-direction:row;flex-wrap:wrap;justify-content:flex-start;width:100%;margin:0;padding:0;border:0;gap:6px}
  .fpk.quiet{border-color:rgba(255,255,255,.12);background:rgba(0,0,0,.25)}
  .fstrip.toolbar{padding:8px}
  .fstrip .upg-toggle.game{margin:0 auto}
  .ffine-b>.upg-toggle.game{margin:4px auto 0}
  .fgroups{flex-direction:column;align-items:flex-start;gap:12px;width:100%}
  .fmore{display:inline-flex;align-items:center;gap:8px;min-height:40px;margin:0;padding:6px 12px 5px 14px;border:2px solid #0a1216;border-radius:9px;background:#0f1c22;box-shadow:inset 0 2px 0 rgba(0,0,0,.35);color:#fff6e2;font-family:var(--font-t);font-size:.95rem;line-height:1;cursor:pointer}
  .fmore-i{display:block;width:8px;height:8px;margin:-4px 2px 0 4px;order:3;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);rotate:45deg;transition:rotate .2s}
  .ffine.open .fmore-i{rotate:225deg;margin-top:4px}
  .fbadge{display:inline-grid;place-items:center;min-width:1.25rem;height:1.25rem;padding:0 4px;border-radius:999px;background:var(--gold);color:#241600;font-size:.78rem;font-weight:700}
  .ffine-b{display:none;flex-direction:column;align-items:flex-start;gap:12px;margin-top:8px;padding:12px;border:1px solid rgba(255,255,255,.09);border-radius:10px;background:rgba(0,0,0,.28)}
  .ffine.open .ffine-b{display:flex}
  .fgrp-l{flex:0 0 100%;margin:0 0 1px}
  .fsort label{letter-spacing:.08em}
  /* the set filters take their own row above the count and Sort (focus order stays the visual order: tags, then Sort) */
  .factive{order:-1;flex:1 1 100%}
}
/* touch: every control reaches the 40 px target */
@media (hover:none) and (pointer:coarse){
  .fchip{min-height:40px;padding:0 14px 0 12px}
  .fgrp-cost .fchip{width:40px;height:40px}
  .fpk.quiet{min-height:40px}
  .ftag,.fclear{min-height:40px}
  .fsearch-x{width:40px;height:40px;right:2px}
  .fstrip .fsearch input[type=search]{padding:10px 46px 9px 40px}
  .fsort .sel select{min-height:40px}
  .fhead>.fgrp .fchip{min-width:40px;min-height:40px}   /* wave 6: the count line's chips (Powers' Version) stayed 37 x 22 on a phone: their own min-height:0 outranked the rule above */
}
@media (prefers-reduced-motion:reduce){.fpick-main .fpk,.fpick-main .fpk:hover,.fpick-main .fpk:focus-visible,.fpick-main .fpk:active{transform:none}.fpk-p,.fpk.on .fpk-p,.fgrp-cost .fchip.on{scale:1}}

/* ---------- PLAYTEST CONTENT (filters.js): the mark on a tile and on a page.
   THE MARK IS A STICKER WITH AN ICON, NOT A WORD (Bean, 20 Sep 2026: "Instead of putting "playtest" is there a good icon we could use for this that iindicates
   its a "beta" card" and attach it more like a sticker to the bottom right edge of the card"; it was a violet tab reading PLAYTEST on the card's bottom edge).
   THE ICON IS THE GAME'S OWN "UNDER CONSTRUCTION" SIGN (Bean, the same night: "The playtest card icon looks like a potion icon, is there another icon we could
   use that makes it look more like a "beta" card"). The first sticker was a violet seal with a drawn lab flask, which on a card game reads as "potion". The
   game ships its own sign for unfinished things: a yellow warning triangle with a wrench, hand-drawn like the rest of its UI (images/ancients/
   under_construction, 100 x 84). No seal behind it, a hard 2 px ledge and a soft shadow like the game's icons, tilted a little and overlapping the card's
   bottom right corner the way a sticker is put on.
   THE SIGN IS REDRAWN, NOT THE SPRITE (Bean, the same night: "can you make the triangle a perfect triangle moreson please, make it a little bigger, then
   give the wrench within it a bit of shadow so it stands out itself drom the yellow", then "make the black outline less thick to give more space for the
   wrench please"). The game's sprite is a squat, hand-wobbled triangle (100 x 84) with a thick black band and a flat wrench that melts into the yellow at
   sticker size. --pt-mark is an inline SVG after it, in the sprite's own colours: a true equilateral triangle (side 83 in a 100 x 90 box) with rounded
   corners, a 2 unit white rim, a 5 unit black band, and a larger wrench that carries a dark red outline and a soft shadow down and to the right on the
   yellow. Every box that shows it is 10:9. It is about a fifth bigger than the sprite was (30% of a card's width).
   THEN IT WAS DRAWN PROPERLY (Bean, 21 Sep 2026, on that first redraw: "Yeah the symbol looks bad, just make it look as good as possible please"). The
   first redraw was clip art: a circle with a slot on a stick (it read as a letter Y), flat fills, a hard offset copy for a shadow. The sign now follows the
   game's own composition and the game's way of shading an icon: the spanner is BIG, its head sits in the middle of the face and its handle runs under the
   band (the sprite does the same, that is why it reads at 44 px); the head is a real open-end jaw (flat tips, a hexagon seat, turned 15 degrees on its
   handle); a thick dark outline, a base red with a light edge up and to the left and a dark edge down and to the right (two clip paths of the same
   shape, moved), a soft amber cast shadow on the yellow; the face goes from a light yellow to amber with a lit inner edge; warm white rim, brown-black
   band. One path in <defs>, reused for every layer (about 2.1 KB). Generator: docs/wave3/playtest-sign.py. The same sign stands before the word in the "Playtest" filter chip and in a
   playtest page's chip, which is where a reader learns what it means. The sticker takes no room (a marked tile is exactly as big as its neighbours).
   IT STAYS ON TOP WHILE THE CARD IS HOVERED ("the icon should be overtop of the card on hover right now it goes underneath"): a hovered card is
   preserve-3d and its layers rise 6 to 17 px (style.css, cardancient3d.css, glossary.css), so a flat ::after fell behind them; the sticker rises to 20 px
   with the same timing (0 s while tilting, the .5 s settle on the way back) and so never crosses a layer ---------- */
:root{--pt-mark:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 90'%3E%3Cdefs%3E%3ClinearGradient id='y' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23ffe65a'/%3E%3Cstop offset='1' stop-color='%23f5b20c'/%3E%3C/linearGradient%3E%3ClinearGradient id='e' x1='0' y1='0' x2='.9' y2='1'%3E%3Cstop offset='0' stop-color='%23fffbd0'/%3E%3Cstop offset='.55' stop-color='%23fff2a0' stop-opacity='0'/%3E%3Cstop offset='1' stop-color='%23a86a00' stop-opacity='.55'/%3E%3C/linearGradient%3E%3Cpath id='w' d='M2.12 -12.16L4.38 -12.77A13.5 13.5 0 1 1 -10.18 -8.87L-7.92 -9.47L-4.87 1.93L0.93 3.48L5.18 -0.77zM4.3 9L5 60L-5 60L-4.3 9z' transform='translate(51.8 51) rotate(30) scale(1.06)'/%3E%3CclipPath id='c'%3E%3Cuse href='%23w'/%3E%3C/clipPath%3E%3CclipPath id='k'%3E%3Cuse href='%23w' transform='translate(-1.9 -1.9)'/%3E%3C/clipPath%3E%3CclipPath id='i'%3E%3Cpath d='M50 15.3 85.6 77 14.4 77z' stroke-width='3'/%3E%3Cpath d='M50 12.4 88.2 78.5 11.8 78.5z'/%3E%3C/clipPath%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='1'/%3E%3C/filter%3E%3C/defs%3E%3Cpath d='M50 8.5 91.5 80.4 8.5 80.4z' fill='%23fff7e6' stroke='%23fff7e6' stroke-width='14' stroke-linejoin='round'/%3E%3Cpath d='M50 8.5 91.5 80.4 8.5 80.4z' fill='%2317110d' stroke='%2317110d' stroke-width='10.4' stroke-linejoin='round'/%3E%3Cpath d='M50 15.3 85.6 77 14.4 77z' fill='url(%23y)' stroke='url(%23y)' stroke-width='3' stroke-linejoin='round'/%3E%3Cg clip-path='url(%23i)'%3E%3Cpath d='M50 14.2 86.9 78 13.1 78z' fill='none' stroke='url(%23e)' stroke-width='2.2' stroke-linejoin='round'/%3E%3Cuse href='%23w' transform='translate(2.4 2.8)' fill='%238a4a00' opacity='0.6' filter='url(%23b)'/%3E%3Cuse href='%23w' fill='%232a0b04' stroke='%232a0b04' stroke-width='4.6' stroke-linejoin='round'/%3E%3Cuse href='%23w' fill='%2396210d'/%3E%3Cg clip-path='url(%23c)'%3E%3Cuse href='%23w' transform='translate(-1.9 -1.9)' fill='%23ff9467'/%3E%3Cg clip-path='url(%23k)'%3E%3Cuse href='%23w' transform='translate(1.3 1.3)' fill='%23d93d1c'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}
:root{--live-mark:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 90'%3E%3Cdefs%3E%3ClinearGradient id='y' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%239be86a'/%3E%3Cstop offset='1' stop-color='%232c9a3e'/%3E%3C/linearGradient%3E%3ClinearGradient id='e' x1='0' y1='0' x2='.9' y2='1'%3E%3Cstop offset='0' stop-color='%23e9ffd0'/%3E%3Cstop offset='.55' stop-color='%23d6ffb0' stop-opacity='0'/%3E%3Cstop offset='1' stop-color='%230d5a1e' stop-opacity='.6'/%3E%3C/linearGradient%3E%3Cpath id='w' d='M24.08 50.92L43.72 70.56L77.13 33.7L67.87 25.3L43.28 52.44L32.92 42.08z' transform='translate(50 45) scale(1.04) translate(-50 -45)'/%3E%3CclipPath id='c'%3E%3Cuse href='%23w'/%3E%3C/clipPath%3E%3CclipPath id='k'%3E%3Cuse href='%23w' transform='translate(-1.7 -1.7)'/%3E%3C/clipPath%3E%3CclipPath id='i'%3E%3Ccircle cx='50' cy='45' r='36.19'/%3E%3C/clipPath%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='1'/%3E%3C/filter%3E%3C/defs%3E%3Ccircle cx='50' cy='45' r='44.2' fill='%23fff7e6'/%3E%3Ccircle cx='50' cy='45' r='42.02' fill='%2317110d'/%3E%3Ccircle cx='50' cy='45' r='36.19' fill='url(%23y)'/%3E%3Cg clip-path='url(%23i)'%3E%3Ccircle cx='50' cy='45' r='34.94' fill='none' stroke='url(%23e)' stroke-width='2.4'/%3E%3Cuse href='%23w' transform='translate(2.4 2.8)' fill='%230b4a1c' opacity='.6' filter='url(%23b)'/%3E%3Cuse href='%23w' fill='%230c2a12' stroke='%230c2a12' stroke-width='4.6' stroke-linejoin='round'/%3E%3Cuse href='%23w' fill='%23b9cf9c'/%3E%3Cg clip-path='url(%23c)'%3E%3Cuse href='%23w' transform='translate(-1.7 -1.7)' fill='%23ffffff'/%3E%3Cg clip-path='url(%23k)'%3E%3Cuse href='%23w' transform='translate(1.2 1.2)' fill='%23fff3d6'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}
/* 15% SMALLER (Bean, 21 Sep 2026, twice, for the directory and for the card pages: "Make the playtest icon on the cards 15% smaller please"): every measure of the
   sticker x .85 (a card: 30% x 27% of --cw at -6.5% / -5% -> 25.5% x 22.95% at -5.5% / -4.25%; a tile: 2.2 x 1.98rem -> 1.87 x 1.68rem, its bottom right corner kept where it was) */
.card.is-pt::after,.itemcell.is-pt::after{content:"";position:absolute;z-index:6;background:var(--pt-mark) center/contain no-repeat;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.6)) drop-shadow(0 3px 5px rgba(0,0,0,.5));rotate:-9deg;pointer-events:none}
.card.is-pt::after{right:calc(var(--cw)*-.0553);bottom:calc(var(--cw)*-.0425);width:calc(var(--cw)*.255);height:calc(var(--cw)*.2295)}
.card.is-pt.hov::after,.card.is-pt.settle::after{transition:transform .5s cubic-bezier(.16,1,.3,1)}
.card.is-pt.hov.tilt::after{transform:translateZ(20px);transition:transform 0s}
.itemcell.is-pt{position:relative}
.itemcell.is-pt::after{left:calc(50% + .93rem);top:2.55rem;width:1.87rem;height:1.68rem}
/* THE PAGE'S SHOWCASE WEARS IT TOO (Bean, 22 Sep 2026, on Neow's Sacrifice: "Why dont you include the playtest icon here on the dedicated relic page, but we keep it there on
   the cards page. Include it here as well please"): the relic and potion pages' big housing (detailpage.css .dp-bigslot, potions.css .pt-bigslot, a 12.6rem slot centred
   in the box) carries the sticker over its bottom right corner the way the card page's card does, scaled with the housing (3.4 x 3.06rem; 2.75 x 2.48rem on the phone's
   10.2rem slot); the 3D icon inside never reaches the corner, so the sticker needs no lift */
.dp-bigslot.is-pt,.pt-bigslot.is-pt{position:relative}
.dp-bigslot.is-pt::after,.pt-bigslot.is-pt::after{content:"";position:absolute;z-index:6;left:calc(50% + 4.3rem);top:calc(50% + 3.9rem);width:3.4rem;height:3.06rem;background:var(--pt-mark) center/contain no-repeat;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.6)) drop-shadow(0 3px 5px rgba(0,0,0,.5));rotate:-9deg;pointer-events:none}
@media (max-width:640px){.dp-bigslot.is-pt::after,.pt-bigslot.is-pt::after{left:calc(50% + 3.4rem);top:calc(50% + 3.1rem);width:2.75rem;height:2.48rem}}
/* DETAIL-PAGES, wave 4 (Bean, 21 Sep 2026: "shouldn't be full purple, keep it in line with the other tags "ancient", Skill and so on style wise"): the chip recipe of style.css (dark ground), violet only as the border and the text, like .chip.c-skill */
.chip.pt-chip{border-color:#8a6cc9;color:#cdb8ff}
.chip.pt-chip::before{content:"";display:inline-block;width:1.4em;height:1.26em;margin-right:.35em;vertical-align:-.26em;background:var(--pt-mark) center/contain no-repeat;filter:drop-shadow(0 1px 0 rgba(0,0,0,.55))}
/* as wide as its text, never the full column (Bean: "it should just wrap around the text width") */
.pt-note{width:fit-content;max-width:100%;box-sizing:border-box;margin:8px 0 0;padding:8px 12px;border-radius:8px;border:1px solid rgba(138,108,201,.55);background:rgba(138,108,201,.12);font-size:.95rem;line-height:1.35;color:var(--text)}
.pt-note b{color:#cdb8ff}

/* ===== app/fonts.css ===== */
/* Self-hosted fonts (the same latin and latin-ext woff2 subsets Google Fonts serves; SIL Open Font License, see src/fonts/*-OFL.txt).
   Paths are project-root relative like shell.html: build.js rewrites them to ../src/ for dev.html and ssr.js to /fonts/ for the export.
   Kreon is a variable font, one file covers weights 400 and 700; Bitter is declared for --font-i and only downloads if something uses it. */
@font-face{font-family:'Kreon';font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/kreon-var-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Kreon';font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/kreon-var-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Spectral';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/spectral-700-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Spectral';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/spectral-700-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Bitter';font-style:italic;font-weight:500;font-display:swap;src:url(/fonts/bitter-500i-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Bitter';font-style:italic;font-weight:500;font-display:swap;src:url(/fonts/bitter-500i-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}

/* ===== app/glossary.css ===== */
/* ---------- glossary pages: Card Properties (route /keywords), Enchantments, Afflictions, Orbs, Run modifiers (app/pages_glossary.js, docs/wave3/glossary.md, docs/wave5/glossary.md) ----------
   Compendium grids of game-styled tiles. Every plate, tab, ring and overlay below is one of the game's own sprites (paths under src/img, rewritten by
   build.js / ssr.js): the hover_tip nine-slice (style.css .tipbox) for the property name plates and the hover panels, card/card_enchant_s for the enchantment tab,
   the affliction overlay textures of scenes/cards/overlays/afflictions/*.tscn, orbs/empty_orb under the orb sprites, packed/modifiers/* tiles. Nothing 3D at rest.
   Sorts after factbox.css and filters.css and before tilehousing.css: a rule here that must win over tilehousing.css carries the page class. */

/* ----- shared ----- */
.glpage .gl-grid{display:grid;gap:14px}
.gl-sec{margin-top:calc(var(--stack) + 4px)}
.gl-sech{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 14px;margin:0 0 10px}
.gl-sech h2{margin:0;font-size:1.45rem}
.gl-sect{font-family:var(--font-t);font-size:.88rem;letter-spacing:.04em;color:var(--dim)}
.gl-sec[hidden]{display:none}
/* anchors (/enchantments#inky, /keywords#forge, a heading inside a fold) stop below the top bar */
.gl-ench,.gl-hw,.gl-affl,.gl-orb,.gl-mod,.cp-prop,.cp-term,.gl-more [id],.gl-sec h2[id],.gl-sec h3[id],.cp-other h2[id]{scroll-margin-top:calc(var(--tb-h,56px) + 10px)}
.gl-name{font-family:var(--font-t);font-size:1.32rem;line-height:1.15;color:var(--gold);margin:0 0 5px;text-shadow:3px 2px 0 rgba(0,0,0,.25)}
.gl-name a{color:inherit;text-decoration:none}
.gl-name a:hover,.gl-name a:focus-visible{color:#fff}
.gl-text{font-family:var(--font-b);font-size:1.03rem;line-height:1.4;color:var(--text)}
.gl-text .kw{color:var(--gold)}.gl-text .num{color:var(--blue)}.gl-text .green{color:var(--green)}.gl-text .red{color:var(--red)}.gl-text .purple{color:var(--purple)}
.gl-tile{padding:14px 16px;border-radius:12px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);box-shadow:inset 0 1px 0 rgba(255,255,255,.04)}
/* the inline tip: the game's hover box drawn in the page (style.css .tipbox draws the nine-slice; the fixed #tip caps its width, so it is set here) */
.gl-tip{max-width:none;font-size:1rem;line-height:1.38}
.gl-tip .tip-head{font-size:1.12rem}
.gl-tip .tip-head a{color:inherit}
.gl-tip .tip-foot .chip{font-family:var(--font-t);font-size:.8rem;padding:2px 8px;color:var(--muted)}
.gl-tip .tip-foot a.chip:hover{border-color:var(--gold);color:#fff;text-decoration:none}
/* sources: relic / potion / power icons with the site's hover, event and enemy links, cards as a mini fan */
.gl-src{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:10px 0 0}
.gl-src-l{font-family:var(--font-t);font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);white-space:nowrap}
.gl-src-icons{display:flex;flex-wrap:wrap;align-items:center;gap:4px}
.gl-src-icons .relic,.gl-src-icons .potion,.gl-src-icons .power{width:3.3rem;height:3.3rem}
.gl-src-links a img{width:26px;height:26px;border-radius:5px;object-fit:cover}
.gl-minis{display:flex;flex-wrap:wrap;gap:10px 8px;width:100%;padding:6px 0 2px}
.gl-minis .card{--cw:5.8rem}
/* THE APPLIED AMOUNT (wave 4, GL1; pages_glossary.js). .gl-srcamt: the sources of an enchantment whose number differs per source, every one a named link with the
   number the way the game writes it ("Sharp 3": the name purple, the number blue). .gl-amtline: the same for an affliction whose number is an enemy's power. */
.gl-amt{margin-left:.45em;font-family:var(--font-t);white-space:nowrap}
.gl-amt .purple{color:var(--purple)}.gl-amt .num{color:var(--blue);font-weight:700}
.gl-amtline{margin:10px 0 0;font-size:.97rem;line-height:1.45;color:var(--muted)}
.gl-amtline .gl-src-l{display:block;margin:0 0 3px}
.gl-amtline p{margin:0}.gl-amtline p+p{margin-top:4px}
.gl-amtline b.num{color:var(--blue)}
.gl-amtline a{color:var(--gold)}
/* NO DEAD BANDS (wave 4, GL3): the tiles of a row are one height (the grids stretch), the text column is a flex column and the fold (orbs, modifiers) or the Learn
   more plate (afflictions) stands on the tile's foot, so two neighbours end on one line whatever they hold; an odd last tile takes the whole row (the grids are
   two columns at most on the 70rem page column, one on a phone, where the span changes nothing). */
.gl-affl>.gl-body,.gl-orb>.gl-body,.gl-mod>.gl-body{align-self:stretch;display:flex;flex-direction:column}
.gl-body>.gl-more,.gl-body>.gl-foot{margin-top:auto;padding-top:12px}
.gl-affls>:last-child:nth-child(odd),.gl-orbs>:last-child:nth-child(odd),.gl-mods>:last-child:nth-child(odd){grid-column:1/-1}
.gl-more{margin-top:12px}
.gl-more>summary{font-size:.95rem}
.gl-more .chap{margin-top:12px}
.gl-more .chap-b{max-width:none}
/* THE SECTION BANNER, the fallback drawn while banner.js / banner.css are not in the bundle (the component is the CORE stream's secBanner, docs/wave5/core.md 1d; the
   markup shape is the same: section.secban > the icon socket, the title, the tagline). A solid slate plate as wide as the column, the top edge lit, cut corners like the
   tile housing, a gold stripe at the left, the icon in a dark socket. It replaces the bare heading Bean called "barely readable, its styled poorly with no background" */
.gl-banner{--acc:var(--gold);position:relative;margin:calc(var(--stack) + 6px) 0 14px;padding:0;isolation:isolate}
.gl-banner-in{position:relative;display:flex;align-items:center;gap:14px;min-height:3.6rem;padding:8px 18px 8px 14px;
  background:linear-gradient(180deg,#2a4650,#17292f 18%,#101d22 70%,#0c171b);border:1px solid rgba(255,255,255,.1);border-top-color:rgba(255,255,255,.22);box-shadow:0 6px 0 rgba(0,0,0,.35),inset 0 1px 0 rgba(255,255,255,.08);
  clip-path:polygon(12px 0,calc(100% - 12px) 0,100% 12px,100% calc(100% - 12px),calc(100% - 12px) 100%,12px 100%,0 calc(100% - 12px),0 12px)}
.gl-banner-in::before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;background:linear-gradient(180deg,color-mix(in srgb,var(--acc) 80%,#fff),var(--acc) 40%,color-mix(in srgb,var(--acc) 60%,#000))}
.gl-banner-i{flex:none;display:grid;place-items:center;width:2.9rem;height:2.9rem;border-radius:50%;background:radial-gradient(circle at 50% 40%,#1c333b,#0a1418 75%);box-shadow:0 0 0 2px rgba(0,0,0,.5),0 0 14px color-mix(in srgb,var(--acc) 40%,transparent),inset 0 1px 0 rgba(255,255,255,.12)}
.gl-banner-i .gl-bico{width:2rem;height:2rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.gl-banner-t{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;min-width:0}
.gl-banner-t h2{margin:0;font-size:1.5rem;line-height:1.1;color:var(--gold);text-shadow:3px 2px 0 rgba(0,0,0,.35)}
.gl-banner-tag{font-family:var(--font-t);font-size:.9rem;letter-spacing:.04em;color:var(--dim)}
.gl-banner-b{padding:12px 18px 0;color:var(--muted)}
/* a tag chip under a page title, the fallback for core.js tagChip: a small game icon and the word */
.gl-kchip{font-family:var(--font-t);font-size:.86rem;padding:3px 10px 3px 6px;gap:6px}
.gl-kchip .gl-chipico{width:1.25rem;height:1.25rem;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
a.gl-kchip:hover{border-color:var(--gold);color:#fff;text-decoration:none}
.gl-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 6px}
/* the game's text as the page's rules text (style.css .hero .gametext draws the gold rule and the dark slab) */
.gl-gametext .purple{color:var(--purple)}.gl-gametext .green{color:var(--green)}.gl-gametext .red{color:var(--red)}
.gl-gametext .tip-body{padding:0}
/* the Learn more plate: buttons.css .btn.sm, nothing else */
.gl-morebtn{flex:none}
/* housed source tiles on the pages (directories.js houseCell for relics, potions, powers; the same frame around a picture for events, ancients and enemies) */
.gl-tiles{padding:0 var(--pad) 16px}
.gl-tiles .itemcell.housed .sub .gl-amt{margin-left:0;font-size:.82rem}
.gl-pic{display:grid;place-items:center;width:4.2rem;height:4.2rem}
.gl-pic img{max-width:100%;max-height:100%;object-fit:contain;filter:drop-shadow(0 3px 3px rgba(0,0,0,.6))}
.gl-pic-ev img{width:4rem;height:4rem;object-fit:cover;border-radius:8px}
.gl-pic-mon img{max-height:4.6rem}
.gl-pic-anc img{width:4.4rem;height:4.4rem;object-fit:contain}
.gl-relchap .grid{padding-bottom:18px}

/* ----- Card Properties (route /keywords; pages_glossary.js glPair / glBadgeIco / glBadgePlate) ----- */
/* THE PAIR, one object (Bean, 19 Sep 2026: "make the card and icon 3d and be paired up together overlapping"), FLAT SINCE WAVE 5 (Bean, 22 Sep 2026: "Untilt the
   cards here fully, it's cool but messy at the end of the day"): no perspective, no pointer parallax, no lean. .cp-stage is the tile's box; the card is the site's
   card without its hover tilt (a small grow only, so the pair stays one thing); the badges ride its edges: .cp-bico, the game's sprite as one of the site's 3D icons
   (.relic[data-rimself], icons3d.css), hangs over the card's top right corner; .cp-plate, the name on the game's hover-tip plate (on the index it is the property's
   heading), straddles the bottom right corner. .cp-cast holds the shadows they throw, a layer INSIDE the card; .cp-floor is the ground shadow.
   Every length is a share of --cw (the card's width): '' the index tile, .cp-l the hero of a property's page. */
.cp-stage{--cw:10.5rem;position:relative;flex:none;width:calc(var(--cw) * 1.28);height:calc(var(--cw) * 1.66);margin:0 auto}
.cp-stage.cp-s{--cw:5.2rem}
.cp-stage.cp-l{--cw:13rem}
.cp-floor{position:absolute;left:4%;width:86%;bottom:calc(var(--cw) * -.02);height:calc(var(--cw) * .2);border-radius:50%;background:radial-gradient(ellipse at 50% 50%,rgba(0,0,0,.55),rgba(0,0,0,0) 70%);pointer-events:none}
/* ONE OBJECT ON HOVER (GLOSSARY2; Bean, 22 Sep 2026: "On the card properties page the property and the card should move together on hover not separate"): the pair
   lifts as a whole. The card is `still` (style.css: a .still card never scales and core.js never tilts it, so none of its layers move on their own) and the badge is a
   plain icon (no .relic, so core.js never grows or tilts it); the ONE transform is the scale on .cp-pair while the pointer is anywhere in the stage (the card, the
   badge, the plate, the air between them) or the card link holds keyboard focus. The stage keeps its size, so nothing reflows; the same 1.03 the card had, the
   card's own 220 ms ease. A touch device gets no lift (a stuck :hover would leave it lifted) */
.cp-pair{position:absolute;inset:0;transition:scale .22s cubic-bezier(.2,.7,.3,1)}
/* 3D (Bean, 22 Sep 2026: "the card and associated icons / properties arent 3d on hover"): the pair turns as one plate with the pointer (pages_glossary.js sets --tx / --ty on
   it as core's tiltTo does on a card), the badge and the plate standing 18 px off the card on Z; leaving eases back over the card's half second. The scale stays. */
.cp-pair{transform-style:preserve-3d;transform:perspective(800px) rotateX(0) rotateY(0);transition:scale .22s cubic-bezier(.2,.7,.3,1),transform .5s cubic-bezier(.16,1,.3,1)}
.cp-pair.tilt{transform:perspective(800px) rotateX(calc(var(--ty,0) * -10deg)) rotateY(calc(var(--tx,0) * 12deg));transition:scale .22s cubic-bezier(.2,.7,.3,1),transform .08s linear}
.cp-pair>.cp-badge{transform:translateZ(0);transition:transform .5s cubic-bezier(.16,1,.3,1)}
.cp-pair.tilt>.cp-badge{transform:translateZ(18px);transition:transform .08s linear}
@media (prefers-reduced-motion:reduce){.cp-pair,.cp-pair.tilt{transform:none;transition:none}.cp-pair>.cp-badge,.cp-pair.tilt>.cp-badge{transform:none}}
@media (hover:hover){.cp-stage:hover .cp-pair{scale:1.03}}
.cp-stage:focus-within .cp-pair{scale:1.03}
.cp-pair>.card{position:absolute;left:calc(var(--cw) * .06);top:calc(var(--cw) * .1);--tilt-x:0deg;--tilt-y:0deg}
.cp-pair>.card.still{cursor:pointer}   /* still, but a link to the card's page */
.cp-badge{position:absolute;z-index:8}
a.cp-badge:focus-visible,.cp-plate a:focus-visible{outline:2px solid var(--gold);outline-offset:3px;border-radius:12px}
/* the icon: over the top right corner, 44 % of it on the card. .cp-flat: the sprite as the site's icons look at rest (88 % of its box, the same drop shadow), no hover of its
   own. The --fit-enlarged icon is absolutely positioned and centred by auto margins in the badge's box (GLOSSARY2: as a grid item it grew the box's auto row past
   the box and the row sat at the top, so Exhaust's badge hung 7 px low; the same defect as the term boxes', see .cp-fico below) */
.cp-bico{right:0;top:0;width:calc(var(--cw) * .5);height:calc(var(--cw) * .5)}
.cp-ico.cp-flat{display:grid;place-items:center;flex:none}
.cp-ico.cp-flat>img:not(.cp-over){width:88%;height:88%;object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.cp-bico .cp-ico{position:absolute;left:50%;top:50%;translate:-50% -50%;width:calc(100% * var(--fit,1));height:calc(100% * var(--fit,1))}   /* --fit: a padded sprite is drawn larger (GL_KW_FILL). left/top 50 % + translate, not inset:0 + margin:auto: an absolute box wider than its parent gets margin-left 0, so auto margins centre it only vertically */
/* the unplayable bar over the energy gem: card.tscn UnplayableEnergyIcon is 48 of the gem's 64 px, centred */
.cp-ico .cp-over{position:absolute;left:50%;top:50%;width:66%;height:66%;translate:-50% -50%}
/* the name plate: the hover tip's own plate and title type (style.css .tipbox / .tip-head: Kreon bold, #EFC851, the 3,2 shadow), sized with the card.
   NEVER UNDERLINED (Bean, 22 Sep 2026: "When hovering over the "Exhaust" or card property text on a card here it currently gets an underline, remove that") */
.cp-plate{right:calc(var(--cw) * -.02);bottom:0;margin:0;font-size:calc(var(--cw) * .125);line-height:1.2;font-weight:700;filter:drop-shadow(0 .3rem .25rem rgba(0,0,0,.6))}
.cp-tipname{display:block;font-size:1em;line-height:1.2;border-width:calc(var(--cw) * .062);border-image-width:calc(var(--cw) * .062);text-decoration:none}
.cp-tipname .tip-head{display:block;font-size:1em;padding:0 .35em .05em;white-space:nowrap;text-shadow:.13em .09em 0 rgba(0,0,0,.25);transition:color .15s}
.cp-plate a,.cp-plate a:hover,.cp-plate a:focus-visible{text-decoration:none}
.cp-plate a:hover .tip-head,.cp-plate a:focus-visible .tip-head{color:#fff;text-decoration:none}
.card>.cp-cast{position:absolute;left:0;top:0;width:calc(300*var(--u));height:calc(422*var(--u));border-radius:calc(16*var(--u));overflow:hidden;z-index:7;pointer-events:none}
.card>.cp-cast::before,.card>.cp-cast::after{content:"";position:absolute;display:none;border-radius:50%}
.card>.cp-cast::before{left:calc(196*var(--u));top:calc(-48*var(--u));width:calc(210*var(--u));height:calc(210*var(--u));background:radial-gradient(circle at 50% 50%,rgba(0,0,0,.55),rgba(0,0,0,.25) 42%,rgba(0,0,0,0) 70%)}
.card>.cp-cast::after{left:calc(120*var(--u));top:calc(352*var(--u));width:calc(290*var(--u));height:calc(120*var(--u));background:radial-gradient(ellipse at 50% 50%,rgba(0,0,0,.55),rgba(0,0,0,.25) 45%,rgba(0,0,0,0) 72%)}
.cp-stage[data-icon] .cp-cast::before,.cp-stage[data-plate] .cp-cast::after{display:block}
/* THE HOVER PANEL (wave 5; Bean: "If hovering over the card provides an explanation that would be great, but only if that ranks the same to a google crawler for
   SEO"): the game's own hover-tip box with the game's exact text, rendered INTO the tile at build time (it is in the HTML a crawler reads, the same words a reader
   gets), hidden at rest and shown while the tile is hovered, holds keyboard focus (the card link, the icon or the plate), or was tapped (.open, the touch tap in
   pages_glossary.js). It rises over the lower part of the card; only opacity and translate change, so nothing on the page moves. Hidden with visibility, never
   display:none (a search engine drops display:none text less reliably, and the aria-describedby target must exist) */
.cp-panel{position:absolute;left:0;right:0;bottom:calc(var(--cw) * .06);z-index:9;margin:0;max-width:none;font-size:.95rem;line-height:1.35;
  opacity:0;visibility:hidden;translate:0 8px;transition:opacity .16s ease-out,translate .16s ease-out,visibility 0s linear .16s;pointer-events:none;filter:drop-shadow(0 8px 14px rgba(0,0,0,.65))}
/* the panel is the hover plate (Bean, 23 Sep 2026: "all tool tips need to be styled like the tooltips on power / card / potion hover across the whole site"): pages_glossary.js glPanel writes the term plate's markup, and these are tipbox.css .tip .tp-plate's rules, which only reach #tip */
.cp-panel.tp-plate{--rc:#7d8b91;border:0;border-image:none;border-radius:12px;padding:0 0 0 4px;overflow:hidden;color:#f3ead9;font-family:var(--font-b);
  background:linear-gradient(rgba(25,43,51,.985),rgba(14,25,31,.99));box-shadow:0 0 0 2px color-mix(in srgb,var(--rc) 48%,#243c46),0 5px 0 rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.09)}
.cp-panel.tp-plate::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(color-mix(in srgb,var(--rc) 80%,#fff),var(--rc) 40%,color-mix(in srgb,var(--rc) 70%,#000))}
.cp-panel.tp-plate{text-align:left}.cp-panel.tp-plate .tp-body{max-width:none}
/* the panel opens for the PLATE (the box that says the word), not for the whole tile (Bean, 22 Sep 2026: "The hover info on the card on the card properties page should only
   be shown if they hover on the box itself that says 'exhaust'. Well yes these are all connected and visually hover at the same time, where the user hovers matters");
   keyboard focus and a tap (.open) still open it; the panel ignores the pointer, so it never steals the plate's hover */
/* BESIDE THE CARD, NOT OVER IT (Bean, 23 Sep 2026: "when I hover over the work "exhaust" or any of the effects on the card properties page in the top section it covers
   the original thing. It should probably go off to the right instead of covering the card here"): with a mouse (or the keyboard) the plate opens the site's tooltip
   (#tip; core.js showTip "cpp:" + placeTip), right of the card at the plate's height, left of it when the right has no room. This in-tile panel stays in the HTML
   (crawlers, aria-describedby) and opens in place only on a touch tap (.open) */
@media (hover:none){.cp-prop.open .cp-panel{opacity:1;visibility:visible;translate:0 0;transition:opacity .16s ease-out,translate .16s ease-out,visibility 0s}}
/* an entry no card prints: the 3D icon alone */
.cp-solo{display:grid;place-items:center}
.cp-solo .cp-badge{position:relative;right:auto;top:auto;width:4.8rem;height:4.8rem}
.cp-solo.cp-l .cp-badge{width:8rem;height:8rem}
.cp-solo.cp-l .cp-ico{width:100%;height:100%}   /* the hero draws the sprite at its own size (128 px sources): no --fit blow-up */
/* the index: the properties as a centred row of pairs, one short line under each (the name is the pair's plate), the Learn more plate under it (no card count since
   GLOSSARY2: Bean, "remove the "23 cards" info here"; the count is on the property's page) */
/* sixteen tiles (seven properties, nine things a played card does): four per row, centred (three per row on a narrow column, two on a phone); the card's width follows the column (container units), capped at 10.5rem */
.cp-props{scroll-margin-top:calc(var(--tb-h,56px) + 10px);container:cprops / inline-size}
.cp-grid{display:flex;flex-wrap:wrap;justify-content:center;gap:26px 20px;margin:18px 0 6px}
.cp-prop{flex:0 0 calc(25% - 15px);min-width:0;display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center}
.cp-prop .cp-stage{--cw:min(10.5rem,18.6cqw - 12px)}
@container cprops (max-width:760px){.cp-prop{flex-basis:calc(33.333% - 14px)}.cp-prop .cp-stage{--cw:min(10.5rem,24.8cqw - 11px)}}
@container cprops (max-width:520px){.cp-grid{gap:22px 10px}.cp-prop{flex-basis:calc(50% - 5px)}.cp-prop .cp-stage{--cw:min(8.4rem,37.3cqw - 6px)}.cp-line{font-size:.92rem}.cp-panel{font-size:.86rem}
  .cp-act .btn.gl-morebtn{font-size:.8rem;padding-left:12px;padding-right:12px}}   /* a phone: the plate fits a half-width tile (only the label and the side padding shrink: the plate's height and --ph are buttons.css') */
.cp-cap{min-width:0;width:100%;display:flex;flex-direction:column;align-items:center;gap:10px}
.cp-cap .cp-name{font-family:var(--font-t);font-size:1.42rem;line-height:1.1;margin:0;text-shadow:3px 2px 0 rgba(0,0,0,.25)}
.cp-name a{color:var(--gold)}
.cp-line{margin:0;font-family:var(--font-b);font-size:1rem;line-height:1.3;color:var(--text);max-width:100%}
.cp-act{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 10px}
/* the other terms: lower on the page, opened by the section banner */
.cp-other{margin-top:calc(var(--stack) + 8px)}
.cp-other .gl-banner,.cp-other .secban{margin-top:0}
.cp-sec .gl-sech h3{margin:0;font-size:1.22rem;color:var(--gold)}
.cp-sec:first-of-type{margin-top:6px}
/* A TERM IS THE ENEMY PAGE'S FACT BOX (Bean, 21 Sep 2026: "change the game terms section to follow the enemy dedicated health / gold design as well. We should be
   consistent across the site with this design law"). pages_glossary.js glTermTile builds it with pages_acts.js factBox / factRow / factIco3d and the look is
   enemyturns.css .ew-fact + factbox.css, untouched: the term's name as the small caps label (it stays the tile's linked h4), the game's sprite as the 3D icon (the icon
   alone, never a card: Bean, 20 Sep 2026), the text as the value, the card count at its end. TWO LINES, NOT ONE (Bean, 22 Sep 2026: "Limit each box here to 2 lines in
   height, unnecessary things like "37 cards" can be moved to the same line as the other text"): the one-line rule of factbox.css is lifted for these boxes only (the value
   wraps, at most two lines by the words pages_glossary.js GL_TERM_TEXT gives it), nothing else of the box is restyled. The icon cell is the component's 2.7rem; --fit
   enlarges a padded sprite's 3D wrapper around the cell's centre, so a small glyph reads at the same size as the others and stays centred on the text's middle.
   THE ICON IS CENTRED ON THE TEXT, BY ITS VISIBLE PART (GLOSSARY2; Bean, 22 Sep 2026: "Icons in the game and run terms section are still drifting too low"). The cause,
   measured (docs/wave5/glossary2.md): the --fit wrapper used to be a grid item of the 2.7rem cell, so the cell's auto row grew to the wrapper's size (67 px for a
   1.73 fit) and, taller than the cell, the track sat at the cell's TOP: every enlarged icon hung 4 to 14 px low, exactly (fit - 1) x cell / 2. Now the wrapper is
   absolutely positioned at the link's centre (left / top 50 % and a -50 % translate: auto margins would centre an oversize absolute box only vertically) inside the
   link, which stays the cell's 2.7rem square: the wrapper's size never touches the row. Then --oy (pages_glossary.js GL_KW_VIS: the offset of the sprite's solid part
   from its file's middle, a fraction of the file's longer side) nudges the wrapper up so the glyph the eye sees, not the file's box, is on the text's middle (the
   image is 92 % of the wrapper, so 92 % of the fraction). */
.cp-terms{grid-template-columns:repeat(auto-fill,minmax(min(100%,19.5rem),1fr));gap:10px;align-items:stretch}
.cp-term{display:grid;min-width:0}
.cp-term>.ew-fact{min-width:0}
.cp-term .ew-fact-row{flex:1;align-items:center}
.cp-term h4.ew-fact-h{margin:0;text-shadow:none;text-wrap:nowrap}
.cp-term .ew-fact-h a{color:inherit;text-decoration:none}
.cp-term .ew-fact-h a:hover,.cp-term .ew-fact-h a:focus-visible{color:var(--gold)}
.cp-term .ew-fact-i{flex:none;width:2.7rem;height:2.7rem;display:grid;place-items:center;overflow:visible}
.cp-fico{position:relative;display:block;width:100%;height:100%}
.cp-term .ew-fact-i .ew-fact-3d{position:absolute;left:50%;top:50%;translate:-50% calc(-50% + var(--oy,0) * -92%);width:calc(100% * var(--fit,1));height:calc(100% * var(--fit,1));cursor:pointer;flex:none}
.cp-term .ew-fact .ew-fact-row .ew-fact-t{white-space:normal;overflow:visible;text-overflow:clip;display:block;line-height:1.3;font-size:.98rem}
.cp-term .cp-text{font:inherit;color:inherit;max-width:none;margin:0}
.cp-term .cp-text .kw{color:var(--gold)}.cp-term .cp-text .num{color:var(--blue)}.cp-term .cp-text .green{color:var(--green)}.cp-term .cp-text .red{color:var(--red)}
.cp-term .ew-fact-t a.cp-n{margin-left:.25em;font-family:var(--font-t);font-size:.82rem;color:var(--gold);white-space:nowrap}
.cp-term .ew-fact-t a.cp-n:hover{color:#fff;text-decoration:none}
/* A PROPERTY'S OR A TERM'S PAGE (wave 5): the item page's hero (style.css .hero / .showcase / .infocol / .gametext, the card and potion pages' own), the pair or the
   framed 3D icon as the showcase, the kind chip, the game's text as the rules text, the how box, then the one-line fact boxes (detailpage.js factGrid) */
.cp-detail .hero .showcase.cp-show{justify-content:center;align-self:stretch;min-width:min(100%,17rem)}
.cp-mainhero .cp-stage{margin:6px auto}
/* one column (760 px and under): the stage is as big as its card (style.css .hero .showcase .card, 15rem), so the card never spills out of it onto the H1 (audit 25 Sep 2026:
   at 390 the 10.5rem stage let the 15rem card cover the page title on every keyword page) */
@media (max-width:760px){.cp-mainhero .cp-stage.cp-l{--cw:15rem}}
.cp-thero .cp-bigslot{margin:10px auto}
.gl-hero2 .showcase.gl-show{justify-content:center;align-self:stretch;min-width:min(100%,17rem)}
/* A TERM'S SHOWCASE: the sprite as a 3D icon in the directory's eight sided frame (tilehousing.css .ih-slot + .ih-gem, markup from directories.js houseSlot; the potion
   page's showcase does the same, potions.css .pt-bigslot). Only sizes and the frame's own custom properties are set here. --ib is the icon's box in px, written by
   pages_glossary.js glTermShow from the file's size (never larger than the file allows at 1.5x); --fit enlarges a padded sprite inside it; --fs is the frame's
   side in px, about 1.8x the sprite's visible part (84 to 122 px), so a small glyph is not lost in a large frame. Hover changes colours only. */
.cp-bigslot{--rc:#7d8b91;--ib:64px;--fs:112px;flex:none;display:grid;place-items:center;margin:6px 6px 10px 4px}
.cp-bigslot .ih-slot{--cut:calc(var(--fs) * .18);width:var(--fs);height:var(--fs);place-content:center;box-shadow:0 16px 18px -24px rgba(0,0,0,.8)}   /* place-content: a padded sprite's box may be wider than the frame (its visible part never is); the track is centred, so the overflow is even on both sides */
.cp-bigslot .ih-slot::after{inset:4px;--cut:calc(var(--fs) * .18 - 2.3px)}
.cp-bigslot .ih-gem{bottom:-.45rem;width:.9rem;height:.9rem;border-radius:2px}
.cp-bigslot .ih-slot:has(.hov){--ih-top:#d2e8ef;--ih-mid:#4f7380;--ih-glow:54%}
.cp-showbox{display:grid;place-items:center;width:calc(var(--ib) * var(--fit,1));height:calc(var(--ib) * var(--fit,1))}
.cp-showbox .cp-showico{width:100%;height:100%;translate:0 calc(var(--oy,0) * -88%)}   /* --oy: the glyph's visible middle on the frame's middle (GL_KW_VIS; the image is 88 % of the icon) */
.gl-named{padding:0 var(--pad) 16px}.gl-underban .gl-named{padding-top:14px}
.gl-named .gl-src{margin:0}
.gl-cards{padding:0 var(--pad) 18px}
/* the related row: the other entries of the group as small housed tiles, the badge in the slot (absolutely centred in its 3.4rem box: GLOSSARY2, the auto-row defect
   above put the enlarged map icons 3 to 4 px low here too; --oy as on the term boxes) */
.cp-relbox{position:relative;display:block;width:3.4rem;height:3.4rem}
.cp-relbox .cp-ico{position:absolute;left:50%;top:50%;translate:-50% calc(-50% + var(--oy,0) * -88%);width:calc(100% * var(--fit,1));height:calc(100% * var(--fit,1));max-width:4.4rem;max-height:4.4rem}

/* ----- Enchantments ----- */
/* THE HUB BANNER (wave 5; Bean: "this top banner needs to feel more solid, creative, and be an authoritative header to the page"): a solid eight sided plate in the
   housing's metal (tilehousing.css: the rim lit from straight above, the well behind), Conflagration wearing the Glam tab on a pedestal glow at the left, the title
   in gold with a rule under it, exactly the words Bean gave. Nothing here is a card box or a flat panel */
.gl-ex{display:flex;flex-wrap:wrap;align-items:center;gap:12px 28px;margin:0 0 var(--stack);padding:14px 20px;border-radius:14px;background:radial-gradient(60% 90% at 20% 50%,rgba(63,216,207,.1),transparent 70%),rgba(0,0,0,.25);border:1px solid rgba(255,255,255,.08)}
/* THE LIGHT FROM THE TOP EDGE IS DIFFUSE (GLOSSARY2; Bean, 22 Sep 2026: "the top glow coming down should be diffused more"): the plate used to go from a bright #8fb0bb
   lip to the slate in 3 % of its height (a hard bright band). Now the lit edge is dimmer and falls off over the top third of the plate in five soft steps, and the
   hairline along the top is one px at a quarter strength: the same "lit from straight above" as the housing, spread over a plate this size */
.gl-exbanner{position:relative;isolation:isolate;border:0;border-radius:0;padding:18px 26px 18px 22px;gap:10px 34px;
  background:linear-gradient(180deg,#6b8a95 0,#42606c 1.5%,#2c4852 6%,#1f3840 15%,#172c33 30%,#111f25 60%,#0c171b);box-shadow:0 10px 0 rgba(0,0,0,.35),0 18px 30px -18px rgba(0,0,0,.8);
  clip-path:polygon(22px 0,calc(100% - 22px) 0,100% 22px,100% calc(100% - 22px),calc(100% - 22px) 100%,22px 100%,0 calc(100% - 22px),0 22px)}
.gl-exbanner::before{content:"";position:absolute;inset:4px;z-index:-1;background:radial-gradient(70% 90% at 18% 60%,rgba(63,216,207,.14),transparent 60%),radial-gradient(90% 70% at 50% 100%,rgba(0,0,0,.35),transparent 70%);
  clip-path:polygon(19px 0,calc(100% - 19px) 0,100% 19px,100% calc(100% - 19px),calc(100% - 19px) 100%,19px 100%,0 calc(100% - 19px),0 19px)}
.gl-exbanner::after{content:"";position:absolute;left:22px;right:22px;top:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.24) 30%,rgba(255,255,255,.24) 70%,transparent)}
.gl-excard{flex:none;display:flex;flex-direction:column;align-items:center;gap:8px;padding:10px 12px 4px 18px;position:relative}
.gl-excard::before{content:"";position:absolute;left:10%;right:0;bottom:22px;height:22px;border-radius:50%;background:radial-gradient(ellipse at 50% 50%,rgba(63,216,207,.28),transparent 70%);pointer-events:none}
.gl-excard .card{--cw:11rem;cursor:default}
.gl-excap{font-family:var(--font-t);font-size:.8rem;letter-spacing:.04em;color:var(--dim)}
.gl-exin{flex:1 1 22rem;min-width:0;max-width:60ch}
/* THE RULE UNDER THE TITLE IS ONE RULE (GLOSSARY2; Bean, 22 Sep 2026: "the underline just ends and gets skinnier randomly"): it was a 6rem gold bar over a faint 1 px
   hairline that stopped at the column's edge. Now one 2 px gold rule runs the full width of the text column and fades out over its last third: it ends on purpose */
.gl-exin h2{font-size:1.6rem;margin:0 0 10px;padding-bottom:8px;color:var(--gold);text-shadow:3px 2px 0 rgba(0,0,0,.35);position:relative}
.gl-exin h2::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:linear-gradient(90deg,var(--gold) 0,var(--gold) 58%,rgba(239,200,81,0) 100%)}
.gl-exin p{margin:0;font-size:1.08rem;line-height:1.5;color:var(--text)}
/* THE WIDE HOUSED TILE (wave 5; Bean: "the title of the enchantment, what it does eg "Gain 3 Block" and that's it. It should be within housing similar to the potions,
   not the same but similar. It will have to be different as there is text now."): the directory's housed tile (directories.js houseCell, tilehousing.css: the eight
   sided slot, the gem, the rim that lights when the tile is hovered) laid sideways: the slot with the enchantment tab at the left, the name and one line of effect text
   at its right, the whole tile the link. Three to a row on the page column, two on a narrow one, one on a phone; the rows stretch so neighbours end level */
.gl-enchs{grid-template-columns:repeat(auto-fill,minmax(min(100%,19.5rem),1fr));align-items:stretch}
.glpage .itemcell.housed.gl-hw{display:flex;flex-direction:row;align-items:center;gap:14px;padding:8px 14px 8px 8px;border-radius:12px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);text-align:left;width:auto;min-width:0}
.glpage .itemcell.housed.gl-hw:hover,.glpage .itemcell.housed.gl-hw:focus-visible{border-color:rgba(255,255,255,.18);background:rgba(0,0,0,.36);text-decoration:none}
.glpage .itemcell.housed.gl-hw .ih-slot{flex:none;width:5.6rem;height:5.6rem;padding:0;align-items:center}
.glpage .itemcell.housed.gl-hw .ih-slot::after{background:radial-gradient(62% 30% at 50% 92%,color-mix(in srgb,var(--rc) var(--ih-glow),transparent),transparent 72%),radial-gradient(90% 80% at 50% 38%,#1a2f38,#0b151a)}
.gl-hw .ih-gem{bottom:-.3rem}
.gl-hw-b{display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-width:0;flex:1 1 auto}
.glpage .itemcell.housed.gl-hw .nm{margin:0;max-width:none;font-family:var(--font-t);font-size:1.18rem;line-height:1.15;color:var(--gold);text-shadow:2px 2px 0 rgba(0,0,0,.3);white-space:normal}
.gl-hw-fx{font-family:var(--font-b);font-size:.97rem;line-height:1.35;color:var(--text)}
.gl-hw-fx .kw{color:var(--gold)}.gl-hw-fx .num{color:var(--blue)}.gl-hw-fx .green{color:var(--green)}.gl-hw-fx .red{color:var(--red)}.gl-hw-fx .purple{color:var(--purple)}
.gl-hw-fx .energy-ico{display:inline-block;width:1.05em;height:1.05em;vertical-align:-.15em;background:center/contain no-repeat}
.gl-hw-note{font-family:var(--font-t);font-size:.78rem;letter-spacing:.03em;color:var(--dim)}
/* the tab (card.tscn CardContainer/Enchantment): the card_enchant_s sprite under the hsv shader NCard.SetEnchantmentStatus sets for an enabled tab
   (h .25 s .4 v .6: a 90 degree hue turn, desaturated, darkened; the icon is not run through it), the icon 35x35 at (14,9) of the 72x54 tab.
   THE TAB IN THE HOUSING GOES 3D ON HOVER LIKE EVERY HOUSED ICON (GLOSSARY2; Bean, 22 Sep 2026: "On hover of each enchantment they need to go 3d like every other thing
   similar"): pages_glossary.js glTabHtml makes it a .relic (style.css: inline-grid, the first image 88 % of the box with the icons' drop shadow; icons3d.css + core.js:
   the 1.14 grow over 220 ms, the pointer tilt, the 9 px lift, the ground shadow, the rim from its own silhouette, the sheen, the 550 ms settle: the very rules a relic
   in its housing runs, nothing re-implemented here), standing directly in the slot so the housing is its hover unit. Sizes only: the box is 75 x 57 px so its 88 %
   image is the 66 x 50 tab (the blur rule: the tab file is 100 x 76, its icon 64 px drawn at 32 px); the enchantment's icon is the second image, absolute at the
   tab's icon position (19.4 % / 16.7 % / 48.6 % / 64.8 % of the tab = 23.1 / 20.7 / 42.8 / 57 % of the box), lifted a hair above the tab and under the sheen. The rim
   and the halo take the enchantment purple. Set with the page class so the housing's 4.2rem square does not win */
.glpage .itemcell.housed.gl-hw .ih-slot>.relic.gl-tab{width:min(8.2rem,75px);height:min(6.2rem,57px);--rim-c:#b58ee6}
.gl-tab .gl-tabbg{filter:hue-rotate(90deg) saturate(.4) brightness(.6) drop-shadow(0 3px 2px rgba(0,0,0,.5))}
.gl-tab .gl-tabfx{position:absolute;left:23.1%;top:20.7%;width:42.8%;height:57%;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.45))}
.gl-tab.hov.tilt .gl-tabfx{transform:translateZ(calc(var(--lift) + .5px))}
.gl-tab .halo{background:radial-gradient(circle,rgba(181,142,230,.5),transparent 65%)}
/* the tab on a card (glEnchCard): drawn flat as a layer of the card, the sprite as a pseudo element */
.gl-ctab::before{content:"";position:absolute;inset:0;background:var(--tab) center/100% 100% no-repeat;filter:hue-rotate(90deg) saturate(.4) brightness(.6) drop-shadow(0 3px 2px rgba(0,0,0,.5))}
.gl-ctab img{position:absolute;left:19.4%;top:16.7%;width:48.6%;height:64.8%;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.45))}
.card .gl-ctab{position:absolute;left:calc(-16*var(--u));top:calc(50*var(--u));width:calc(72*var(--u));height:calc(54*var(--u));z-index:6}
.card .gl-ctab.star{top:calc(95*var(--u))}
.card.hov .gl-ctab,.card.settle .gl-ctab{transition:transform .5s cubic-bezier(.16,1,.3,1)}
.card.hov.tilt .gl-ctab{transform:translateZ(14px);transition:transform 0s}
/* THE PAGE'S SHOWCASE: the tab on a card (pages_glossary.js glEnchShow), as big as the affliction page's card; the tab file (100 x 76) is drawn at 72u of a
   13rem card = 50 px, within the blur rule. No pedestal glow here: the hero's own backdrop is behind it */
.gl-enshowcase .gl-excard{padding:6px 12px 2px 18px}
.gl-enshowcase .gl-excard::before{display:none}
.gl-enshowcase .gl-excard .card{--cw:13rem}
/* the related row on an enchantment page: the same wide tiles, smaller */
.gl-relenchs{padding:0 var(--pad) 18px}
.gl-relenchs .itemcell.housed.gl-hw .ih-slot{width:4.4rem;height:4.4rem}
.glpage .gl-relenchs .itemcell.housed.gl-hw .ih-slot>.relic.gl-tab{width:min(6.6rem,59px);height:min(5rem,45px)}   /* the 88 % image = a 52 x 40 tab */
.glpage .gl-relenchs .itemcell.housed.gl-hw .nm{font-size:1.05rem}
.gl-relenchs .gl-hw-fx{font-size:.9rem}

/* ----- Afflictions ----- */
/* TWO TO A ROW (wave 5; Bean: "Show 2 per row, remove "in depth" and give them their own pages"): two columns down to the phone breakpoint, the Learn more plate on the
   tile's foot, the name a link to the page */
.gl-affls{grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch}
.gl-affl{--gl-gapx:20px;--gl-padr:16px;--gl-cardpad:12px;display:grid;grid-template-columns:auto 1fr;gap:6px var(--gl-gapx);align-items:start;padding:14px var(--gl-padr) 14px 14px;border-radius:12px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08)}
.gl-affl .gl-body{min-width:0}
/* THE LEARN MORE PLATE IS CENTRED BETWEEN THE CARD AND THE BOX'S EDGE (GLOSSARY2; Bean, 22 Sep 2026: "center the learn more box in the middle of the right side box edge
   and the card perfectly"): the foot row reaches out over the card column's right padding and the column gap at its left and over the box padding at its right, so its
   width IS the space from the card's right edge to the box's right edge, and the plate is centred in it; it stays the column's foot (margin-top:auto, below). Under
   640 px the card stands above the text and the row spans the box's padding box, so the plate is centred under the whole box. The three widths are the tile's own
   custom properties (the padding and the gap read the same ones), so the row and the layout never drift apart */
.gl-foot{display:flex;align-items:center;justify-content:center;gap:10px;margin-left:calc((var(--gl-gapx) + var(--gl-cardpad)) * -1);margin-right:calc(var(--gl-padr) * -1)}
.gl-afcard{display:flex;flex-direction:column;align-items:center;gap:8px;padding:14px var(--gl-cardpad,12px) 2px 14px}
.gl-afcard .card{--cw:11rem;cursor:default}
.gl-afcap{font-family:var(--font-t);font-size:.8rem;letter-spacing:.04em;color:var(--dim);text-align:center}
/* the page's showcase: the afflicted card, big, with its caption */
.gl-afshow .card{--cw:13rem;cursor:default}
.gl-afshow .gl-afcap{margin-top:-2px}
/* the related row on an affliction page: the other overlays on small cards */
.gl-afrels{padding:0 var(--pad) 18px}
.gl-afrel{display:flex;flex-direction:column;align-items:center}
.gl-afmini{display:block}
.gl-afmini .card{--cw:6.4rem;cursor:pointer}
.glpage .itemcell.housed.gl-afrel .nm{margin-top:6px}
/* the overlay (scenes/cards/overlays/afflictions/<id>.tscn -> vfx_ui_card_affliction_<id>.tscn): clipped to the game's card mask; a vignette square
   (ui_card_border_vignette, 422x422 centred on the 300x422 card) in the scene's colour, the rim glow (ui_card_border_glow over the card rect) and
   the scene's main layer, baked by build/extract/bake_afflictions.py from the scene's textures, shaders and colours (a 422 square, 1.2x for the
   chains and vines). Ringing adds its beast frame (horns across the top and down both edges at half alpha, a skull at each top corner at +-30
   degrees, the framed skull over the top at 77 %); Smog's smoke covers the whole card. All at rest: the shaders' motion is not reproduced.
   THE ENERGY COST STAYS ON TOP (GLOSSARY2; Bean, 22 Sep 2026: "The affliction filters over the cards are fine, but dont have them go over the energy, that should stay
   on top so its readable"): the overlay sits at the card's z-index 5, the layer of the title, the plaque and the text (it is later in the card, so it covers those, as
   the game's overlay does) and UNDER the energy gem at 6; while the card is tilted it lifts to 13.5 px, over the title's 13 and under the energy's 14 (style.css), so
   the gem is above the overlay in both states, on the hub tiles, the page's showcase and the related cards alike */
.card .gl-ov{position:absolute;left:0;top:0;width:calc(300*var(--u));height:calc(422*var(--u));z-index:5;pointer-events:none;overflow:hidden;
  -webkit-mask:url(/img/ui/card/afflictions/card_mask.webp) center/100% 100% no-repeat;mask:url(/img/ui/card/afflictions/card_mask.webp) center/100% 100% no-repeat}
.card.hov .gl-ov,.card.settle .gl-ov{transition:transform .5s cubic-bezier(.16,1,.3,1)}
.card.hov.tilt .gl-ov{transform:translateZ(13.5px);transition:transform 0s}
.gl-ov>i{position:absolute;display:block;background-repeat:no-repeat;background-position:center;background-size:100% 100%}
.gl-ov .vig{left:calc(-61*var(--u));top:0;width:calc(422*var(--u));height:100%;background:var(--vc);-webkit-mask:url(/img/ui/card/afflictions/border_vignette.webp) center/100% 100% no-repeat;mask:url(/img/ui/card/afflictions/border_vignette.webp) center/100% 100% no-repeat}
.gl-ov .glo{inset:0;background:var(--gc);-webkit-mask:url(/img/ui/card/afflictions/border_glow.webp) center/100% 100% no-repeat;mask:url(/img/ui/card/afflictions/border_glow.webp) center/100% 100% no-repeat;opacity:.9}
.gl-ov .art{left:50%;top:50%;width:calc(var(--as,422)*var(--u));height:calc(var(--as,422)*var(--u));translate:-50% -50%;background-image:var(--art)}
.gl-ov .p1,.gl-ov .p2,.gl-ov .p3,.gl-ov .p4,.gl-ov .p5,.gl-ov .p6{display:none}
.gl-ov[data-af="bound"]{--vc:rgba(38,153,80,.13);--gc:rgb(140,255,77);--art:url(/img/ui/card/afflictions/bound_main.webp);--as:506}
.gl-ov[data-af="entangled"]{--vc:rgba(51,18,0,.38);--gc:rgb(216,122,91);--art:url(/img/ui/card/afflictions/entangled_main.webp);--as:506}
.gl-ov[data-af="tainted"]{--vc:rgba(51,0,64,.6);--gc:rgb(179,51,217);--art:url(/img/ui/card/afflictions/tainted_main.webp);--as:506}
.gl-ov[data-af="galvanized"]{--vc:rgba(0,162,255,.25);--gc:rgb(128,223,255);--art:url(/img/ui/card/afflictions/galvanized_main.webp);--as:422}
.gl-ov[data-af="hexed"]{--vc:rgba(14,0,26,.5);--gc:rgb(165,121,219);--art:url(/img/ui/card/afflictions/hexed_main.webp);--as:422}
.gl-ov[data-af="smog"]{--vc:rgba(14,0,26,.25);--gc:rgb(202,122,202);--art:url(/img/ui/card/afflictions/smog_main.webp)}
.gl-ov[data-af="smog"] .art{left:0;top:0;width:100%;height:100%;translate:0 0;opacity:.7}   /* the smoke at rest is a solid wash; eased so the card under it stays readable */
.gl-ov[data-af="ringing"]{--vc:rgba(14,0,26,.5);--gc:rgb(174,252,255);--art:url(/img/ui/card/afflictions/ringing_ring.webp);--as:422}
.gl-ov[data-af="ringing"] .p1,.gl-ov[data-af="ringing"] .p2,.gl-ov[data-af="ringing"] .p3{display:block;left:calc(150*var(--u));top:calc(1*var(--u));width:calc(307*var(--u));height:calc(96*var(--u));translate:-50% -50%;background-image:url(/img/ui/card/afflictions/ringing_horns.webp);opacity:.5}
.gl-ov[data-af="ringing"] .p2,.gl-ov[data-af="ringing"] .p3{left:calc(5*var(--u));top:calc(211*var(--u));width:calc(384*var(--u));rotate:90deg}
.gl-ov[data-af="ringing"] .p3{left:calc(295*var(--u));rotate:-90deg}
.gl-ov[data-af="ringing"] .p4,.gl-ov[data-af="ringing"] .p5{display:block;left:calc(25*var(--u));top:calc(21*var(--u));width:calc(179*var(--u));height:calc(90*var(--u));translate:-50% -50%;rotate:-30deg;background-image:url(/img/ui/card/afflictions/ringing_skull.webp)}
.gl-ov[data-af="ringing"] .p5{left:calc(275*var(--u));rotate:30deg}
.gl-ov[data-af="ringing"] .p6{display:block;left:calc(150*var(--u));top:calc(7*var(--u));width:calc(205*var(--u));height:calc(102*var(--u));translate:-50% -50%;background-image:url(/img/ui/card/afflictions/ringing_frame.webp);opacity:.77}

/* ----- Orbs ----- */
/* the stage: the Defect's combat still with the five orbs on the arc NOrbManager lays out over the intent anchor (slot i at -(25 + 125 - i*125/(N-1)) degrees,
   position (-cos a, sin a) * r; --ox / --oy are set per slot by pages_glossary.js). A slot is orb.tscn: the empty_orb outline, the orb, the passive value in
   cream over the evoke value in cyan (Kreon bold 24, outline 12) at the orb's right */
.gl-orbstage{position:relative;height:30rem;margin:6px 0 var(--stack);border-radius:14px;overflow:hidden;background:radial-gradient(55% 60% at 50% 62%,rgba(63,216,207,.13),transparent 70%),linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.36));border:1px solid rgba(255,255,255,.08)}
.gl-defect{position:absolute;left:50%;bottom:0;height:17rem;width:auto;translate:-50% 0;filter:drop-shadow(0 10px 12px rgba(0,0,0,.6))}
.gl-arc{position:absolute;left:50%;top:0;width:0;height:0;--cy:15.2rem;--r:10.2rem;--od:min(5.6rem,66px)}   /* the orb files are 100 px: 66 px at most (the blur rule) */
.gl-slot{position:absolute;left:calc(var(--ox) * var(--r));top:calc(var(--cy) + var(--oy) * var(--r));width:var(--od);height:var(--od);translate:-50% -50%;margin:0;padding:0;border:0;background:none;cursor:pointer;-webkit-tap-highlight-color:transparent}
.gl-slot img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;pointer-events:none;filter:drop-shadow(0 3px 1px rgba(0,0,0,.5))}
.gl-slot .ring{opacity:.9}
.gl-slot .orb{inset:4%;width:92%;height:92%;transition:scale .5s cubic-bezier(.16,1,.3,1),opacity .25s}
.gl-slot:hover .orb,.gl-slot:focus-visible .orb{scale:1.12}
.gl-slot:focus-visible{outline:2px solid var(--gold);outline-offset:4px;border-radius:50%}
.gl-slot .lab{position:absolute;left:calc(100% - .35rem);top:50%;translate:0 -50%;display:flex;flex-direction:column;align-items:flex-start;gap:0;line-height:1;font-family:var(--font-t);font-weight:700;font-size:1.2rem;pointer-events:none;transition:opacity .2s}
.gl-slot .lab b{paint-order:stroke fill;-webkit-text-stroke:.28em rgba(51,51,51,.9);text-shadow:.12em .12em 0 rgba(0,0,0,.25)}
.gl-slot .lab .pv{color:#FFF6E2}
.gl-slot .lab .ev{color:#5EFFFF;-webkit-text-stroke:.28em rgba(20,54,82,.9)}
.gl-slot .flash{position:absolute;inset:-30%;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.85),rgba(255,255,255,0) 65%);opacity:0;pointer-events:none}
.gl-slot.ev .orb{animation:glEvoke .42s ease-out forwards}
.gl-slot.ev .flash{animation:glBurst .45s ease-out forwards}
.gl-slot.empty .orb,.gl-slot.empty .lab{opacity:0}
.gl-slot.in .orb{animation:glChannel .55s cubic-bezier(.34,1.56,.64,1) both}
@keyframes glEvoke{0%{scale:1;opacity:1;filter:brightness(1)}40%{scale:1.35;opacity:1;filter:brightness(2.2)}100%{scale:1.8;opacity:0;filter:brightness(2.5)}}
@keyframes glBurst{0%{opacity:0;scale:.4}30%{opacity:1}100%{opacity:0;scale:1.6}}
@keyframes glChannel{0%{scale:.2;opacity:0}100%{scale:1;opacity:1}}
.gl-orbstage{margin-bottom:8px}
.gl-stagenote{margin:0 0 var(--stack);text-align:center;font-family:var(--font-t);font-size:.9rem;color:var(--dim);padding:0 12px}
/* the facts of the arc (wave 5, WP45, audit OR1): four of the enemy page's boxes in one balanced row (detailpage.js factGrid / dpFact, pages_glossary.js glOrbFacts:
   Orb slots, Channel, Evoke, Focus); only their place on the page and the phone rule are set here. The single full-width Focus plate (.gl-focus) is gone. */
.gl-orbfacts{margin:0 0 var(--stack)}
.gl-orbfacts .ew-fact-i .iconlink{display:block;line-height:0}
.gl-orbfacts .ew-fact-t a{color:inherit;text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--gold) 55%,transparent);text-underline-offset:.16em}
.gl-orbfacts .ew-fact-t a:hover{color:var(--gold)}
@container dpf (max-width:26rem){.gl-orbfacts .dp-cell{grid-column:span 12}}   /* a phone: one box to a row, so "Uses up your rightmost Orb" is never cut */
.gl-orbs{grid-template-columns:repeat(auto-fill,minmax(30rem,1fr));align-items:stretch}
.gl-orb{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;gap:6px 18px;align-items:start;padding:14px 16px;border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--acc) 22%,transparent),transparent 45%),rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08)}
.gl-orb .gl-body{min-width:0}
/* the tile's foot (wave 5, WP45, audit OR2): the cards that name the orb, under BOTH columns, as the item page's small 3D card grid wrapping in rows (no shelf, no
   sideways scroll, nothing cut at the tile's edge), then the fold at the very bottom so the two tiles of a row end level */
.gl-orbfoot{grid-column:1/-1;align-self:stretch;min-width:0;display:flex;flex-direction:column}
.gl-orbfoot>.gl-more{margin-top:auto;padding-top:12px}
.gl-orbcards{margin-top:10px}
.gl-orbcards>.gl-src-l{display:block;margin:0 0 2px}
.grid.cards.syn-cards.gl-orbgrid{--cw:6.4rem;gap:12px 10px;padding:6px 0 2px}
@media (max-width:640px){.grid.cards.syn-cards.gl-orbgrid{--cw:6rem;gap:10px 8px}}
.gl-orbart{position:relative;width:min(7rem,66px);height:min(7rem,66px);margin-top:4px}   /* 100 px files: 66 px at most (the blur rule) */
.gl-orbart img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 4px 3px rgba(0,0,0,.55))}
.gl-orbart .orb{inset:5%;width:90%;height:90%;cursor:help}
.gl-orbshort{color:var(--muted);font-size:.98rem}
.gl-focusnote{margin:8px 0 0;font-family:var(--font-t);font-size:.92rem;color:var(--dim)}   /* what Focus changes: the one thing the game's tip above does not say (wave 4, GL4: the PASSIVE / EVOKE number strip repeated the tip and is gone) */
.gl-smart{max-width:34rem}
.gl-smart .tip-body{font-size:1rem}
.gl-notes{font-size:.9rem;margin:8px 0 0}

/* ----- Run modifiers ----- */
.gl-modsec[data-side="good"] .gl-banner-t h2,.gl-modsec[data-side="good"] .secban h2{color:var(--green)}
.gl-modsec[data-side="bad"] .gl-banner-t h2,.gl-modsec[data-side="bad"] .secban h2{color:var(--red)}
.gl-modsec[data-side="good"] .gl-banner{--acc:var(--green)}
.gl-modsec[data-side="bad"] .gl-banner{--acc:var(--red)}
.gl-modsec .gl-banner,.gl-modsec .secban{margin-top:0}
.gl-mods{grid-template-columns:repeat(auto-fill,minmax(27rem,1fr));align-items:stretch}
.gl-mod{display:grid;grid-template-columns:3.6rem 1fr;gap:6px 16px;align-items:start;padding:12px 16px 12px 12px;border-radius:12px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08)}
.gl-mod .gl-body{min-width:0}
.gl-modico{display:grid;place-items:center;padding-top:2px}
.gl-modico img{width:min(3.6rem,53px);height:min(3.6rem,53px);object-fit:contain;filter:drop-shadow(0 4px 3px rgba(0,0,0,.55))}   /* the modifier tiles are 80 px files: 53 px at most (the blur rule) */
/* the custom-run line: "[green]Title[/green]: description" (Kreon 24 cream, shadow 3,2 at 25 %) */
.gl-modline{font-family:var(--font-t);font-size:1.12rem;line-height:1.35;color:var(--text);text-shadow:3px 2px 0 rgba(0,0,0,.25)}
.gl-modline h2{display:inline;margin:0;font-size:inherit;font-weight:700;color:var(--blue);text-shadow:inherit}
.gl-mod[data-side="good"] .gl-modt{color:var(--green)}
.gl-mod[data-side="bad"] .gl-modt{color:var(--red)}
.gl-modsep{color:inherit}
.gl-modd .kw{color:var(--gold)}.gl-modd .num{color:var(--blue)}.gl-modd .red{color:var(--red)}
.gl-modx{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin:8px 0 0}
.gl-modx .chip{font-family:var(--font-t);font-size:.82rem;color:var(--muted)}
.gl-modx a.chip:hover{border-color:var(--gold);color:#fff;text-decoration:none}
/* "Never together with" as tag chips (wave 5, WP45, audit RM1; core.js tagChip kind `mod`, tags.css plate): the modifier's own tile in the icon cell, the good set's green */
.tagc-mod .tagc-i{width:1.2rem;height:1.2rem;margin:0 0 0 -2px}
.tagc-mod.gl-modchip-good{--fc:var(--green)}.tagc-mod.gl-modchip-bad{--fc:var(--red)}
@media (max-width:640px){.gl-modx .gl-src-l{flex-basis:100%}} /* on a phone the label takes its own line, so every tile's chips start at the same edge */
.gl-cclist{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:4px}
.gl-cclist li{display:flex;align-items:flex-start;gap:8px;font-family:var(--font-t);font-size:1rem;line-height:1.35}
.gl-cclist li img{flex:none;margin-top:2px}
.gl-cclist img{width:1.7rem;height:1.7rem;object-fit:contain}
.gl-cclist .gl-modd{color:var(--muted)}

/* ----- widths ----- */
@media (max-width:1000px){.gl-affls{grid-template-columns:1fr}.gl-affls>:last-child:nth-child(odd){grid-column:auto}}
@media (max-width:760px){
  .gl-orbstage{height:24rem}.gl-defect{height:12rem}.gl-arc{--cy:11.6rem;--r:7.2rem;--od:min(3.8rem,66px)}.gl-slot .lab{font-size:.9rem}.gl-stagenote{font-size:.78rem}
  .gl-affl{--gl-gapx:14px}.gl-orb{gap:6px 14px}.gl-afcard .card{--cw:9rem}.gl-orbart{width:min(5.6rem,66px);height:min(5.6rem,66px)}
  .gl-exbanner{padding:14px 18px}.gl-banner-in{min-height:3.2rem;padding:7px 14px 7px 12px}.gl-banner-t h2{font-size:1.3rem}
}
@media (max-width:640px){
  .gl-enchs,.gl-orbs,.gl-mods{grid-template-columns:1fr}
  .gl-hero,.gl-ex{padding:14px}.gl-tipbig{font-size:1.02rem}
  .gl-affl{grid-template-columns:1fr;--gl-gapx:14px;--gl-cardpad:0px}.gl-afcard{padding:10px 0 2px}   /* stacked: the foot row reaches over the 14 px left padding, so the plate is centred under the box */
  .gl-mod{grid-template-columns:3.4rem 1fr}.gl-modico img{width:min(3.4rem,53px);height:min(3.4rem,53px)}
  .cp-stage.cp-s{--cw:4.7rem}.cp-stage.cp-l{--cw:10.5rem}.cp-cap .cp-name{font-size:1.2rem}
  .gl-banner-i{width:2.4rem;height:2.4rem}.gl-banner-i .gl-bico{width:1.6rem;height:1.6rem}
}
@media (prefers-reduced-motion:reduce){
  .gl-slot.ev .orb,.gl-slot.ev .flash,.gl-slot.in .orb{animation:none}.gl-slot.ev .orb{opacity:0}
  .cp-panel{transition:none}
}

/* a chapter that a banner opens: its h2 stays in the page for the anchor and the outline, off screen (never display:none); the chapter has no top rule */
.glpage .gl-vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
.glpage .chap.gl-underban{margin-top:0}
.gl-underban .gl-cards,.gl-underban .gl-tiles{padding-top:14px}

/* the kind chip (core.js tagChip kind 'gl'): the icon is the game's own sprite handed in by glChip; the plate colour names the kind */
.glpage .tagc-gl{--fc:#c9b26a}.glpage .tagc-gl[data-v="enchantment"]{--fc:#b58ee6}.glpage .tagc-gl[data-v="affliction"]{--fc:#d96d6d}.glpage .tagc-gl[data-v="map-room"]{--fc:#8fc7d6}
.glpage .tagc-gl .tagc-i{width:1.15rem;height:1.15rem}
/* the number line under the tiles of an affliction page: inside the chapter's padding, a hairline above it */
.gl-amtwrap{max-width:none;padding-top:0}.gl-amtwrap .gl-amtline{margin:0;padding-top:10px;border-top:1px solid rgba(255,255,255,.07)}

/* the facts of an enchantment or affliction page on a phone: a value is often a NAME (Chains of Binding, Self-Help Book) that a half-width box would cut, so the
   boxes go one to a row there (detailpage.css: the grid is 12 columns inside the dpf container; .dp-cell spans --s2 under 35rem) */
@container dpf (max-width:26rem){.en-detail .dp-cell,.af-detail .dp-cell{grid-column:span 12}}

/* ===== QoL pass (wave 6, 23 Sep 2026; docs/wave6/qol-glossary.md). Bean: "do a quality of life pass on the entire page ... I want everything checked" ===== */
/* a game or run term box is ONE target: the name's link stretches over the whole box (the 13 px label and the icon were the only targets, under 40 px on a phone);
   the links inside the text (a keyword, the card count) and the icon keep their own click and hover above it */
.cp-term>.ew-fact{position:relative}
.cp-term .ew-fact-h a::after{content:"";position:absolute;inset:0;border-radius:inherit;z-index:1}
.cp-term .ew-fact-row{position:relative;z-index:2;pointer-events:none}
.cp-term .ew-fact-row a,.cp-term .ew-fact-row [data-tip],.cp-term .ew-fact-row .relic{pointer-events:auto}
.cp-term>.ew-fact:has(>.ew-fact-h a:hover){border-color:color-mix(in srgb,var(--gold) 45%,var(--line))}
.cp-term>.ew-fact:has(>.ew-fact-h a:focus-visible){outline:2px solid var(--gold);outline-offset:2px}
/* a touch screen: the name plate's tap area reaches 40 px (the plate itself is 34 px tall on a phone), the Learn more plate is 40 px tall
   (buttons.css' touch padding at the phone tile's smaller label: box = 1em + 28 px, --ph = box + 6) */
@media (hover:none) and (pointer:coarse){
  .cp-plate a.cp-tipname{position:relative}
  .cp-plate a.cp-tipname::after{content:"";position:absolute;inset:calc(var(--cw) * -.062 - 4px)} /* past the plate's own border (7 px on a phone; inset counts from the padding box) */
  @container cprops (max-width:520px){.cp-act .btn.gl-morebtn{padding-top:14px;padding-bottom:14px;--ph:calc(1em + 34px)}}}
/* a showcase icon that is no link wears no hand cursor (it looked clickable and did nothing) */
.cp-showbox .relic,.gl-show .relic:not(a .relic){cursor:default}
/* touch screens: the small links on the item and list pages get a tap area of at least 40 px without moving anything (an invisible pad around the link):
   a fact box's count or name link (19 px tall text; detailpage.js dpFact) takes its whole row, icon and value (the value cell clips its overflow for the
   one-line ellipsis, factbox.css, so the pad hangs on the row: the value cell fills the row, so its "i" mark keeps its place); an affliction's name under its
   card (25 px); a modifier's "Never together with" chips (29 px) */
@media (hover:none) and (pointer:coarse){
  .glpage .dp-facts .ew-fact-row:has(>.ew-fact-t a){position:relative}
  .glpage .dp-facts .ew-fact-row>.ew-fact-t:has(a){position:static}
  .glpage .dp-facts .ew-fact-t a::after{content:"";position:absolute;inset:-6px -4px}
  .gl-affl .gl-name a,.gl-modx a.tagc{position:relative}
  .gl-affl .gl-name a::after{content:"";position:absolute;inset:-8px -4px}
  .gl-modx a.tagc::after{content:"";position:absolute;inset:-6px 0}}

/* ===== app/guides.css ===== */
/* ---------- guides (app/guides.js; docs/wave3/guides.md) ----------
   The directory and the five guide pages. Everything here is .gd-*; the reused parts keep their own css (.arena in acts.css, .ew-fact in enemyturns.css,
   .chap in style.css, the relic / potion icons in style.css + icons3d.css). Housings follow the .room recipe (dark gradient, --line border); hover never
   reflows (transform / filter / outline only); every grid asks for a column count that leaves no part row. */
.gdpage,.gdhub{--gd-panel:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));--gd-asc:#ff8a3d;--mc-fight:#e0625a;--mc-treasure:#5c9bd6;--mc-shop:#3fae6a;--mc-event:#f2c230;--mc-elite:#b0489c}

/* ===== the scenes: one picture per guide, drawn in the directory card and in the guide's hero ===== */
.gd-scene{position:absolute;inset:0;display:block;overflow:hidden;container-type:size;background:#05080a}
.gd-scene .gd-bg{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;filter:brightness(.62)}
.gd-scene::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(transparent 60%,rgba(0,0,0,.5));box-shadow:inset 0 2px 14px rgba(0,0,0,.5)}
.gd-scene .gd-spr{position:absolute;width:auto;max-width:none;object-fit:contain;filter:drop-shadow(0 .8cqh .6cqh rgba(0,0,0,.6))}
/* the Merchant: his rug, the run summary's own drawing of him, the sale tag, the removal coin, two card icons */
.gd-sc-merchant .gd-bg{inset:-9% -8%;width:116%;height:118%;filter:brightness(.56) saturate(.9)}
/* none of the four small sprites is drawn past its own pixels on a 1.5x screen (wave 5, GD1: the merchant (312 px) and the sale tag (148 px) were x1.2 to x1.26 in the
   hub's featured card at 1345): 208, 98 and 85 CSS px are the file heights at 1.5x; the coin's file is 592 px tall and needs no cap. The A10 scene's 112 px rule, same idea */
.gd-sc-merchant .s-merchant{height:min(80cqh,208px);left:50%;bottom:3cqh;translate:-50% 0}
.gd-sc-merchant .s-sale{height:min(30cqh,98px);right:9cqw;top:9cqh;rotate:14deg}
.gd-sc-merchant .s-coin{height:34cqh;left:8cqw;bottom:8cqh;rotate:-8deg}
.gd-sc-merchant .s-card1{height:min(26cqh,85px);left:12cqw;top:10cqh;rotate:-12deg}
.gd-sc-merchant .s-card2{height:min(24cqh,85px);right:12cqw;bottom:12cqh;rotate:10deg}
/* Double Boss: the Queen's arena, two boss icons, the flame with its 10 */
.gd-sc-ascension-10-double-boss .gd-bg{filter:brightness(.78)}
/* the flame and the two boss icons are 2x copies of 88 px sprites (extract/guides_art.py): none is drawn over 112 px, sharp on a 1.5x screen, and the icons stand beside the
   flame (not at the scene's edges), so a wide hero keeps the three together (wave 4, WP6, audit GD2) */
.gd-sc-ascension-10-double-boss .s-boss1{height:min(36cqh,112px);right:calc(50% + min(28cqh,72px));top:54cqh;translate:0 -50%}
.gd-sc-ascension-10-double-boss .s-boss2{height:min(36cqh,112px);left:calc(50% + min(28cqh,72px));top:54cqh;translate:0 -50%}
.gd-sc-ascension-10-double-boss .s-flame{position:absolute;left:50%;top:48%;translate:-50% -50%;--fs:min(50cqh,112px)}   /* 112 px: the 2x flame (176 px, extract/guides_art.py) keeps its own pixels on a 1.5x screen */
.gd-sc-ascension-10-double-boss .s-flame img{filter:drop-shadow(0 0 3cqh rgba(255,120,30,.7)) drop-shadow(0 .8cqh .6cqh rgba(0,0,0,.6))}
/* the ? room: the main menu's own painting, the four things it can turn into in its corners */
.gd-sc-unknown-rooms .gd-bg{inset:-5% -4%;width:108%;height:110%;filter:none}
.gd-sc-unknown-rooms .gd-spr{height:24cqh}
.gd-sc-unknown-rooms .s-q1{left:6cqw;top:8cqh;rotate:-8deg}.gd-sc-unknown-rooms .s-q2{right:6cqw;top:8cqh;rotate:8deg}
.gd-sc-unknown-rooms .s-q3{left:6cqw;bottom:10cqh;rotate:6deg}.gd-sc-unknown-rooms .s-q4{right:6cqw;bottom:10cqh;rotate:-6deg}
/* the rest site: the Overgrowth camp, the fire, the Ironclad on his log, two of the option plates over the fire */
.gd-sc-rest-sites .gd-bg{filter:brightness(2.1) saturate(1.15)}
.gd-sc-rest-sites::before{content:"";position:absolute;z-index:1;left:58%;bottom:8cqh;width:90cqw;height:80cqh;translate:-50% 0;background:radial-gradient(closest-side,rgba(255,150,50,.34),transparent);pointer-events:none}
.gd-sc-rest-sites .gd-spr{z-index:2}
.gd-sc-rest-sites .s-fire{width:36cqw;left:58%;bottom:24cqh;translate:-50% 0;filter:brightness(1.7) drop-shadow(0 0 4cqh rgba(255,140,40,.55))}
.gd-sc-rest-sites .s-sit{height:58cqh;left:10cqw;bottom:22cqh;filter:brightness(1.1) drop-shadow(0 .8cqh .6cqh rgba(0,0,0,.6))}
.gd-sc-rest-sites .s-opt1{height:27cqh;left:40cqw;top:8cqh;rotate:-4deg}.gd-sc-rest-sites .s-opt2{height:27cqh;left:67cqw;top:12cqh;rotate:5deg}
/* card rewards: the reward screen's teal item plates over a combat room */
.gd-sc-card-rewards .gd-bg{filter:brightness(.5)}
.gd-loot{position:absolute;z-index:1;left:50%;top:50%;translate:-50% -52%;width:72cqw;display:flex;flex-direction:column;gap:3.4cqh}
.gd-loot-r{display:flex;align-items:center;gap:3cqw;height:19cqh;padding:0 5cqw;background:url(/img/ui/reward_screen/reward_item_button.webp) center/100% 100% no-repeat;filter:drop-shadow(0 .8cqh .4cqh rgba(0,0,0,.55))}
.gd-loot-r img{width:auto;height:13cqh;flex:none}
.gd-loot-r em{font:700 6.4cqh/1.1 var(--font-t);font-style:normal;color:#FFF6E2;white-space:nowrap;text-shadow:0 1px 0 rgba(0,0,0,.6)}
.gd-loot-r em b{color:var(--r-rare)}

/* the flame with its number (top bar sprite; same number treatment as the Ascension page's badge) */
.gd-fl{position:relative;display:inline-block;width:var(--fs,2.4rem);aspect-ratio:88/128;flex:none;line-height:1}
.gd-fl img{display:block;width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 0 5px rgba(255,120,30,.5)) drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.gd-fl b{position:absolute;left:0;right:0;top:57%;translate:0 -50%;text-align:center;font-family:var(--font-t);font-weight:700;font-size:calc(var(--fs,2.4rem) * .44);color:#FFF6E2;text-shadow:0 0 2px #3a1d08,0 1px 0 #3a1d08,1px 0 0 #3a1d08,-1px 0 0 #3a1d08,0 -1px 0 #3a1d08}
.gd-fl.off img{filter:grayscale(1) brightness(.55)}.gd-fl.off b{color:#9aa4a6}

/* ===== the directory: five cards, never a part row ===== */
.gd-hubw{container-type:inline-size;margin-top:var(--stack)}
.gd-hub{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--gap)}
.gd-card{container-type:inline-size}
.gd-card .arena-a{display:flex;flex-direction:column;flex:1}
.gd-card-art{position:relative;display:block;aspect-ratio:1.5/1;overflow:hidden;background:#05080a}
.gd-card .arena-a:focus-visible .gd-card-art{box-shadow:inset 0 0 0 3px var(--teal)}
.gd-card .gd-card-t{margin:0;white-space:normal;width:max-content;max-width:90%;text-align:center;text-wrap:balance;font-size:clamp(.98rem,5.4cqw,1.3rem)}
.gd-card .arena-f{flex-wrap:nowrap;font-size:clamp(.78rem,4.5cqw,.98rem)}
.gd-card-h{min-width:0;gap:.5em;white-space:nowrap}
.gd-card-h .mi{width:1.5em;height:1.5em;object-fit:contain;flex:none}
@container (min-width:36rem){
  .gd-hub{grid-template-columns:repeat(2,minmax(0,1fr))}
  .gd-hub>.gd-feat{grid-column:1/-1}.gd-hub>.gd-feat .gd-card-art{aspect-ratio:2.7/1}
}
@container (min-width:62rem){
  .gd-hub{grid-template-columns:repeat(4,minmax(0,1fr))}
  .gd-hub>.gd-feat{grid-column:span 2;grid-row:span 2}
  .gd-hub>.gd-feat .gd-card-art{aspect-ratio:auto;flex:1;min-height:0}
  .gd-hub>.gd-feat .gd-card-t{font-size:1.6rem}.gd-hub>.gd-feat .arena-f{font-size:1.08rem}
}
.gd-covers{margin:.4rem 0 0;padding-left:1.1rem;max-width:90ch}.gd-covers li{margin:.35rem 0;color:var(--muted)}

/* ===== the hero of a guide: the scene, the answer, the fact boxes ===== */
.gd-hero{display:grid;grid-template-columns:minmax(0,23rem) minmax(0,1fr);gap:var(--gap) calc(var(--gap) * 1.6);align-items:center;margin-top:var(--stack)}
.gd-hero-art{position:relative;min-width:0}
.gd-hero-art .gd-scene{position:relative;inset:auto;aspect-ratio:1.5/1;border-radius:12px;border:3px solid #2a2520;box-shadow:0 8px 0 #0a0806}
.gd-hero-t{min-width:0}
.gd-hero-t .gd-first{margin:0 0 .7rem;max-width:64ch;font-size:1.08rem;line-height:1.5;color:var(--text)}
.gd-hero-t .gd-first-n{font-size:1rem;color:var(--muted)}.gd-hero-t .gd-first:last-child{margin-bottom:0}
.gd-hero{container-type:inline-size}
.gd-hero>.gd-glance{grid-column:1/-1;margin:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.gd-glance.n5>.ew-fact:last-child,.gd-glance.n3>.ew-fact:last-child{grid-column:1/-1}
.gd-glance .ew-fact-t b{white-space:nowrap}
@container (min-width:40rem){.gd-glance.n4{grid-template-columns:repeat(4,minmax(0,1fr))}.gd-glance.n5{grid-template-columns:repeat(6,minmax(0,1fr))}.gd-glance.n5>.ew-fact{grid-column:span 2}.gd-glance.n5>.ew-fact:nth-child(n+4),.gd-glance.n5>.ew-fact:last-child{grid-column:span 3}}
@container (min-width:64rem){.gd-glance.n5{grid-template-columns:repeat(5,minmax(0,1fr))}.gd-glance.n5>.ew-fact,.gd-glance.n5>.ew-fact:nth-child(n+4),.gd-glance.n5>.ew-fact:last-child{grid-column:auto}}
.gd-glance .ew-fact-i .mi,.gd-facts .ew-fact-i .mi{object-fit:contain}
/* a small sprite in a glance box is never drawn past its pixels (wave 5, GD5: the 40 x 48 lock on the A10 and rest site guides and the 48 x 48 boss sign on the card
   rewards guide were drawn x1.2 to x1.34 on Bean's 1.5x screen). potions.css' recipe: on a dense screen the 3D wrapper is sized, not the image (its rim and sheen are
   masks of the same sprite), so the sprite stands at 24 or 32 CSS px, its own pixels at 1.5x; on a 1x screen the cell's rem size is already under the file width */
@media (min-resolution:1.25dppx){
  .gdpage .ew-fact-i:has(.mi.gd-s40) .ew-fact-3d{width:26px;height:26px}
  .gdpage .ew-fact-i:has(.mi.gd-s48) .ew-fact-3d{width:35px;height:35px}}
@media (max-width:820px){.gd-hero{grid-template-columns:minmax(0,1fr)}.gd-hero-art .gd-scene{aspect-ratio:2/1}}
/* a line the game says, as a bubble hanging from the picture */
.gd-say,.chap-b .gd-say{position:relative;margin:14px 0 0;padding:9px 14px 10px;border-radius:12px;background:rgba(0,0,0,.42);border:1px solid var(--line);display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px}
.gd-say::before{content:"";position:absolute;left:2.2rem;top:-7px;width:12px;height:12px;rotate:45deg;background:#0e1a20;border-left:1px solid var(--line);border-top:1px solid var(--line)}
.gd-say q{font-family:var(--font-d);font-style:italic;font-size:1.06rem;color:#FFF6E2}
.gd-say span{font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}

/* ===== chapter bodies ===== */
.gd-chap>.chap-b{max-width:none;container-type:inline-size}
.gd-chap .chap-b>p{max-width:78ch}
.gd-chap .chap-ico .chap-img{width:26px;height:26px;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.5))}
.gd-h3{display:flex;align-items:center;gap:8px;margin:0 0 8px;font-family:var(--font-t);font-size:1.04rem;line-height:1.2;color:var(--gold-x)}
.gd-h3 .mi{width:1.5rem;height:1.5rem;object-fit:contain}
.gd-sub{margin-top:18px;min-width:0}
.chap-b .gd-note{margin:14px 0 0;max-width:86ch;font-size:.95rem;color:var(--muted)}
.chap-b .gd-names{margin:6px 0 0;font-size:.92rem;color:var(--muted)}
.gd-chips{margin-top:10px;display:flex;flex-wrap:wrap;gap:8px}
.gd-chips .tagc a{color:inherit}.gd-chips .tagc:has(a:hover){border-color:color-mix(in srgb,var(--fc) 95%,#fff)}   /* a chip is already a button: its text is not gold (Bean, 23 Sep 2026: "Since those are already clearly buttons I don't think they need the text yellow") */
/* THE WHOLE CHIP IS THE LINK (wave 6 QoL, 23 Sep 2026): only the words inside answered a click, 17 px tall, while the chip looks like a button; the link now reaches
   the chip's edges (a stretched ::after), so a press anywhere on it follows the link, and the focus ring draws round the chip */
.gd-chips .tagc{position:relative}.gd-chips .tagc a::after{content:"";position:absolute;inset:0;border-radius:inherit}
.gd-chips .tagc a:focus-visible{outline:0}.gd-chips .tagc:has(a:focus-visible){outline:3px solid #fff;outline-offset:2px}
.gd-fold{margin-top:14px}.gd-fold .tblwrap{margin-top:8px}
/* short lines: one fact each */
.gd-pts{list-style:none;margin:14px 0 0;padding:0;max-width:92ch}
.chap-b .gd-pts{padding-left:0}
.gd-pts li{position:relative;margin:.5rem 0;padding-left:1.25rem;line-height:1.45;color:var(--text);break-inside:avoid}
.gd-pts li::before{content:"";position:absolute;left:.12rem;top:.52em;width:.46rem;height:.46rem;rotate:45deg;background:var(--gold);box-shadow:0 1px 0 rgba(0,0,0,.5)}
.gd-pts li>b:first-child{color:#fff;font-family:var(--font-t)}
@container (min-width:54rem){.gd-pts-2,.gd-pts-3{max-width:none;columns:2;column-gap:2.4rem}.gd-pts-2 li:first-child,.gd-pts-3 li:first-child{margin-top:0}}
@container (min-width:70rem){.gd-pts-3{columns:3}}
/* the site's 3D icon around one of our sprites */
.gd-3d{display:inline-grid;place-items:center;width:3rem;height:3rem;flex:none}
.gd-3d .ew-fact-3d{width:100%;height:100%;cursor:default;--lift:7px;--hov-scale:1.12}
.gd-3d .ew-fact-3d .mi{width:92%;height:92%;object-fit:contain}
.gd-3d .ew-fact-3d :is(.shd,.rim,.sheen){inset:4%}
/* item rows: the item's own icon and one or two lines */
.gd-rows{list-style:none;margin:14px 0 0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:8px}
.chap-b .gd-rows{padding-left:0}
.gd-row{display:flex;align-items:center;gap:12px;min-width:0;margin:0;padding:8px 14px 9px 10px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 3px 0 rgba(0,0,0,.4)}
.chap-b .gd-row{margin:0}
.gd-row-i{flex:none;display:grid;place-items:center;width:3.3rem;height:3.3rem}
.gd-row-i .relic,.gd-row-i .potion,.gd-row-i .power{width:3.3rem;height:3.3rem}
.gd-row-t{min-width:0;display:flex;flex-direction:column;gap:1px;line-height:1.35}
.gd-row-t>b{font-family:var(--font-t);font-size:1.04rem;color:#fff}
.gd-row-t>span{font-size:.95rem;color:var(--muted)}
.gd-row-c{margin-left:8px;font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}
.gd-cardico{display:block;width:3.3rem;border-radius:5px;overflow:hidden;box-shadow:0 2px 0 rgba(0,0,0,.5),0 0 0 1px rgba(255,255,255,.14)}
.gd-cardico img{display:block;width:100%;height:auto}
.gd-row-i:has(>.gd-evico){width:auto;height:auto}.gd-cardico.gd-evico{width:5.4rem}.gd-evico img{aspect-ratio:16/9;object-fit:cover}
@container (min-width:46rem){.gd-rows-2,.gd-rows-3{grid-template-columns:repeat(2,minmax(0,1fr))}.gd-rows-2>li:last-child:nth-child(odd),.gd-rows-3>li:last-child:nth-child(odd){grid-column:1/-1}}
@container (min-width:66rem){.gd-rows-3{grid-template-columns:repeat(3,minmax(0,1fr))}.gd-rows-3>li:last-child:nth-child(odd){grid-column:auto}}
.gd-row-is{flex:none;display:flex;gap:2px}.gd-row-is .relic,.gd-row-is .potion,.gd-row-is .power{width:2.7rem;height:2.7rem}
.gd-icons{display:flex;flex-wrap:wrap;gap:4px 8px;margin-top:8px}
.gd-icons .relic{width:3.6rem;height:3.6rem}
/* columns of sub-blocks: three across or one, never two and a leftover */
.gd-cols{display:grid;grid-template-columns:minmax(0,1fr);gap:0 var(--gap)}
@container (min-width:58rem){.gd-cols{grid-template-columns:repeat(3,minmax(0,1fr))}}
/* three bars and nothing else: they fit side by side much sooner than three columns of points do */
@container (min-width:40rem){.gd-cols-bars{grid-template-columns:repeat(3,minmax(0,1fr))}}
@container (min-width:40rem) and (max-width:57.99rem){.gd-cols .gd-rows{grid-template-columns:repeat(2,minmax(0,1fr))}.gd-cols .gd-rows>li:last-child:nth-child(odd){grid-column:1/-1}}
.gd-duo{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--gap)}
@container (min-width:54rem){.gd-duo{grid-template-columns:repeat(2,minmax(0,1fr))}}
.gd-duo>div>.gd-sub:first-child{margin-top:4px}

/* ===== numbers as pictures ===== */
.rc-common{--rc:var(--r-common)}.rc-uncommon{--rc:var(--r-uncommon)}.rc-rare{--rc:var(--r-rare)}.rc-shop{--rc:var(--teal)}
.mc-fight{--mc:var(--mc-fight)}.mc-treasure{--mc:var(--mc-treasure)}.mc-shop{--mc:var(--mc-shop)}.mc-event{--mc:var(--mc-event)}.mc-elite{--mc:var(--mc-elite)}.mc-rare{--mc:var(--r-rare)}.mc-asc{--mc:var(--gd-asc)}.mc-potion{--mc:#e0625a}
/* a price: the gold coin and the number */
.gd-tag{display:inline-flex;align-items:center;gap:5px;padding:2px 11px 3px 7px;border-radius:999px;background:rgba(0,0,0,.5);border:1px solid rgba(255,255,255,.14);box-shadow:0 2px 0 rgba(0,0,0,.4);white-space:nowrap;line-height:1.2}
.gd-tag .gd-g{width:1.2rem;height:auto;flex:none}
.gd-tag b{font-family:var(--font-t);font-size:1.08rem;color:var(--rc,var(--gold-x))}
.gd-tag s{margin-right:2px;font-family:var(--font-t);font-size:.92rem;color:var(--dim);text-decoration-color:var(--red)}
/* stacked rarity bar */
.gd-stack{margin:4px 0 0;min-width:0}
.gd-stack figcaption{display:flex;align-items:center;gap:8px;margin-bottom:7px;font-family:var(--font-t);font-size:.98rem;color:var(--text)}
.gd-stack figcaption .mi{width:1.5rem;height:1.5rem;object-fit:contain;flex:none}
.gd-stack figcaption .gd-fl{--fs:1.1rem}
.gd-stack-bar{display:flex;height:1.35rem;border-radius:7px;overflow:hidden;background:rgba(0,0,0,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12),0 3px 0 rgba(0,0,0,.4)}
.gd-stack-bar i{flex:0 0 calc(var(--v) * 1%);min-width:3px;background:var(--rc);box-shadow:inset 0 -6px 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.35)}
.gd-stack-k{display:flex;flex-wrap:wrap;gap:3px 14px;margin-top:7px;font-size:.9rem;color:var(--muted)}
.gd-stack-k span{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.gd-stack-k i{width:.68rem;height:.68rem;border-radius:2px;background:var(--rc)}
.gd-stack-k b{color:var(--rc)}
.chap-b .gd-stack-n{margin:6px 0 0;font-size:.9rem;color:var(--dim)}
.gd-stacks{display:grid;grid-template-columns:minmax(0,1fr);gap:16px var(--gap);margin-top:14px}
@container (min-width:44rem){.gd-stacks{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* meters */
.gd-meter{display:grid;grid-template-columns:2rem minmax(4.6rem,9.5rem) minmax(0,1fr) 3.9rem;align-items:center;gap:10px;min-width:0}
.gd-meter-i{display:grid;place-items:center;width:2rem;height:2rem}
.gd-meter-i .mi{width:2rem;height:2rem;object-fit:contain}.gd-meter-i .gd-fl{--fs:1.25rem}
.gd-meter-l{font-family:var(--font-t);font-size:1rem;line-height:1.15;color:var(--text)}
.gd-meter-bar{display:block;height:1.05rem;border-radius:6px;overflow:hidden;background:rgba(0,0,0,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
.gd-meter-bar i{display:block;height:100%;width:calc(var(--v0) * 1%);border-radius:0 5px 5px 0;background:var(--mc,var(--gold));box-shadow:inset 0 -5px 0 rgba(0,0,0,.16);transition:width .34s cubic-bezier(.6,0,.4,1)}
.gd-meter-v{font-family:var(--font-t);font-size:1.12rem;text-align:right;color:var(--mc,var(--gold-x));font-variant-numeric:tabular-nums;white-space:nowrap}
/* the stepper: every state is in the markup, data-n picks one */
.gd-step{margin-top:6px;padding:14px 16px 16px;border-radius:12px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.gd-step-h{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin-bottom:14px}
.gd-step-q{font-family:var(--font-t);font-size:.78rem;font-weight:700;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
.gd-step-btns{display:flex;flex-wrap:wrap;gap:6px}
.gd-step-b{min-width:2.6rem;height:2.6rem;padding:0 .5rem;border-radius:999px;border:2px solid #0b1114;background:radial-gradient(circle at 50% 35%,#2c3a40,#141c20 72%);box-shadow:inset 0 2px 3px rgba(0,0,0,.6),0 1px 0 rgba(255,255,255,.08);font:700 1rem/1 var(--font-t);color:var(--muted);cursor:pointer;transition:filter .05s}
.gd-step-b:hover{filter:brightness(1.3)}
.gd-step-b:focus-visible{outline:2px solid #fff;outline-offset:2px}
.gd-step-b.on{background:radial-gradient(circle at 50% 35%,#ffe08a,#d9a52e 75%);color:#2a1a05;border-color:#5a3f0c;box-shadow:0 0 10px rgba(239,200,81,.35)}
.gd-step-m{display:grid;gap:10px}
.chap-b .gd-step-n{margin:12px 0 0;min-height:2.7em;font-size:.95rem;color:var(--muted)}
.gd-step [data-k]{display:none}
.gd-step[data-n="0"] [data-k="0"],.gd-step[data-n="1"] [data-k="1"],.gd-step[data-n="2"] [data-k="2"],.gd-step[data-n="3"] [data-k="3"],.gd-step[data-n="4"] [data-k="4"],.gd-step[data-n="5"] [data-k="5"],.gd-step[data-n="6"] [data-k="6"]{display:inline}
.gd-step[data-n="1"] .gd-meter-bar i{width:calc(var(--v1) * 1%)}.gd-step[data-n="2"] .gd-meter-bar i{width:calc(var(--v2) * 1%)}.gd-step[data-n="3"] .gd-meter-bar i{width:calc(var(--v3) * 1%)}
.gd-step[data-n="4"] .gd-meter-bar i{width:calc(var(--v4) * 1%)}.gd-step[data-n="5"] .gd-meter-bar i{width:calc(var(--v5) * 1%)}.gd-step[data-n="6"] .gd-meter-bar i{width:calc(var(--v6) * 1%)}
/* numbered step tiles */
.gd-steps{list-style:none;margin:4px 0 0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:10px;counter-reset:none}
.chap-b .gd-steps{padding-left:0}
.gd-stepc{display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto 1fr;gap:2px 12px;align-items:start;margin:0;padding:12px 14px 13px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 3px 0 rgba(0,0,0,.4)}
.chap-b .gd-stepc{margin:0}
.gd-stepc-i{grid-row:1/3;position:relative;display:grid;place-items:center;width:3rem;height:3rem}
.gd-stepc-i img{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.55))}
.gd-stepc-i em{position:absolute;right:-5px;bottom:-4px;min-width:1.3rem;height:1.3rem;display:grid;place-items:center;border-radius:50%;background:var(--gold);color:#2a1a05;font:700 .78rem/1 var(--font-t);font-style:normal;box-shadow:0 1px 0 rgba(0,0,0,.6)}
.gd-steps.num .gd-stepc-i{width:2.3rem;height:2.3rem}
.gd-steps.num .gd-stepc-i em{position:static;width:2.3rem;height:2.3rem;font-size:1.15rem}
.gd-stepc>b{font-family:var(--font-t);font-size:1.04rem;line-height:1.2;color:#fff}
.gd-stepc>span:last-child{font-size:.95rem;line-height:1.4;color:var(--muted)}
@container (min-width:40rem){.gd-steps.c4{grid-template-columns:repeat(2,minmax(0,1fr))}}
@container (min-width:72rem){.gd-steps.c4{grid-template-columns:repeat(4,minmax(0,1fr))}.gd-steps.c4 .gd-stepc{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr}.gd-steps.c4 .gd-stepc-i{grid-row:auto;margin-bottom:6px}}

/* ===== the Merchant ===== */
.gd-shelf{position:relative;margin-top:12px;border-radius:12px;overflow:hidden;border:3px solid #2a2520;box-shadow:0 6px 0 #0a0806;background:#16302c}
.gd-shelf-bg{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;filter:brightness(.5) saturate(.85)}
.gd-shelf-in{position:relative;display:flex;flex-wrap:wrap;justify-content:space-between;gap:14px 22px;padding:14px 16px 16px}
.gd-shelf-g{flex:0 1 auto;min-width:0}
.gd-shelf-h{margin:0 0 7px;font-family:var(--font-t);font-size:.8rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#d8e6e0;text-shadow:0 1px 0 rgba(0,0,0,.7)}
.gd-shelf-h b{font-size:1.15rem;color:var(--gold-x);letter-spacing:0}
.gd-slots{list-style:none;margin:0;padding:0;display:flex;gap:8px}
.chap-b .gd-slots{padding-left:0}
.gd-slot{position:relative;flex:0 1 4.5rem;width:4.5rem;min-width:0;margin:0;display:flex;flex-direction:column;align-items:center;gap:4px;padding:9px 4px 7px;border-radius:8px;background:rgba(6,12,14,.72);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12),0 3px 0 rgba(0,0,0,.45)}
.chap-b .gd-slot{margin:0}
.gd-slot-i{display:grid;place-items:center;height:2.5rem}
.gd-slot-i img{width:auto;height:2.5rem;max-width:2.9rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.gd-slot-l{font-family:var(--font-t);font-size:.78rem;line-height:1.1;text-align:center;color:#fff6e2}
.gd-slot.shopr .gd-slot-l{color:var(--teal)}
.gd-slot-sale{position:absolute;right:-7px;top:-9px;width:1.9rem;height:auto;rotate:16deg;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.gd-pricegrid{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--gap);margin-top:4px}
@container (min-width:42rem){.gd-pricegrid{grid-template-columns:repeat(3,minmax(0,1fr))}}
.gd-prices{min-width:0;padding:12px 14px 8px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.gd-prices ul{list-style:none;margin:0;padding:0}
.chap-b .gd-prices ul{padding-left:0}
.gd-prices li{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;margin:0;padding:6px 0;border-top:1px solid rgba(255,255,255,.07)}
.gd-prices-l{display:flex;flex-direction:column;min-width:0;font-family:var(--font-t);line-height:1.2;color:var(--text)}
.gd-prices small{font-family:var(--font-b);font-size:.84rem;color:var(--dim);white-space:nowrap}
.gd-prices{display:flex;flex-direction:column}
.gd-wob{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;margin:auto 0 0;padding:12px 0 6px;font-family:var(--font-t);font-size:.84rem;color:var(--dim)}
.chap-b .gd-wob{margin:auto 0 0}
.gd-wob>span:first-child{font-size:.7rem;font-weight:700;letter-spacing:.13em;text-transform:uppercase}
.gd-wob-t{position:relative;display:block;height:.9rem;border-radius:6px;background:rgba(0,0,0,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
.gd-wob-t::after{content:"";position:absolute;left:50%;top:-3px;bottom:-3px;width:2px;background:#fff6e2}
.gd-wob-t i{position:absolute;top:0;bottom:0;left:calc(50% - var(--w) / 15 * 50%);width:calc(var(--w) / 15 * 100%);border-radius:5px;background:var(--gold)}
.gd-wob b{color:var(--gold-x);white-space:nowrap}
.gd-sale,.gd-rem{display:flex;align-items:flex-start;gap:14px;min-width:0;padding:14px 16px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.gd-sale>div,.gd-rem>div{min-width:0}
.chap-b .gd-sale p{margin:0 0 8px;color:var(--muted)}
.gd-sale-i{width:4.2rem;height:auto;flex:none;rotate:-10deg;filter:drop-shadow(0 3px 3px rgba(0,0,0,.6))}
.gd-rem-i{width:3.6rem;height:auto;flex:none;filter:drop-shadow(0 3px 3px rgba(0,0,0,.6))}
.gd-rem .gd-pts{margin-top:0}
.gd-was{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:8px 18px}
.chap-b .gd-was{padding-left:0}
.gd-was li{display:inline-flex;align-items:center;gap:8px;margin:0;font-family:var(--font-t)}
.gd-stair{display:flex;align-items:flex-end;gap:clamp(6px,2cqw,18px);margin-top:20px;padding:22px 14px 0}
.gd-stair-c{flex:1;min-width:0;display:flex;flex-direction:column;align-items:stretch}
.gd-stair-bars{display:flex;align-items:flex-end;justify-content:center;gap:4px;height:9.5rem;border-bottom:2px solid var(--line)}
.gd-stair-bars i{position:relative;flex:0 1 2.6rem;height:calc(var(--h) / 350 * 100%);border-radius:5px 5px 0 0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.3),inset -5px 0 0 rgba(0,0,0,.14)}
.gd-stair-bars i.v0{background:#e9e2d0}.gd-stair-bars i.v1{background:var(--gd-asc)}
.gd-stair-bars b{position:absolute;left:50%;bottom:100%;translate:-50% -2px;font:700 .82rem/1 var(--font-t);font-style:normal;color:#e9e2d0}
.gd-stair-bars i.v1 b{color:var(--gd-asc)}
.gd-stair-n{padding:5px 0 0;text-align:center;font-family:var(--font-t);font-size:.82rem;color:var(--dim)}
.chap-b .gd-key{display:flex;flex-wrap:wrap;justify-content:center;gap:4px 22px;margin:12px 0 0;max-width:none;font-size:.92rem;color:var(--muted)}
.gd-key span{display:inline-flex;align-items:center;gap:7px}
.gd-key i{width:.75rem;height:.75rem;border-radius:2px;background:#e9e2d0}.gd-key .k1 i{background:var(--gd-asc)}
.gd-disc{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;margin-top:4px}
@container (min-width:44rem){.gd-disc{grid-template-columns:repeat(3,minmax(0,1fr))}}
.gd-disc-c{display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto auto;align-items:center;gap:6px 12px;padding:10px 14px 12px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.gd-disc-c .relic{width:3.2rem;height:3.2rem}
.gd-disc-2{display:flex}.gd-disc-2 .relic{width:2.7rem;height:2.7rem}.gd-disc-2 .relic+.relic{margin-left:-.9rem}
.gd-disc-c>b{min-width:0;font-family:var(--font-t);font-size:1.04rem;line-height:1.2;color:#fff}
.gd-disc-x{font-family:var(--font-t);font-size:.95rem;color:var(--gold-x);white-space:nowrap}
.gd-disc-c>.gd-tag{justify-self:end}
.gd-restock{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:8px 22px}
.chap-b .gd-restock{padding-left:0}
@container (min-width:46rem){.gd-restock{grid-template-columns:repeat(2,minmax(0,1fr))}}
.gd-restock li{display:flex;align-items:center;gap:10px;margin:0;color:var(--muted);line-height:1.4}
.gd-restock .mi{width:2rem;height:2rem;object-fit:contain;flex:none}
.gd-restock b{color:#fff}
.gd-fakew{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--gap);align-items:start;margin-top:10px}
@container (min-width:40rem){.gd-fakew{grid-template-columns:minmax(0,17rem) minmax(0,1fr)}}
@container (min-width:62rem){.gd-fakew{grid-template-columns:minmax(0,22rem) minmax(0,1fr)}}
@container (max-width:39.99rem){.gd-fake-art{aspect-ratio:2.2/1}}
.gd-fake-art{position:relative;display:block;aspect-ratio:1.5/1;overflow:hidden;background:#0c161b}
.gd-fake-rug{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;filter:brightness(.55)}
.gd-fake-m{position:absolute;left:50%;bottom:16%;translate:-50% 0;height:80%;width:auto;max-width:none;filter:drop-shadow(0 6px 6px rgba(0,0,0,.6))}
.gd-fake .arena-hp b{color:var(--gold-x)}
.gd-fake .mt-tags{display:inline-flex;margin-left:auto}
/* QoL (wave 6, 23 Sep 2026): the fake merchant's card showed nothing when Tab reached it (the arena link drops its outline; its teal ring is drawn on .arena-stage,
   which this card does not have). It gets the guide cards' teal ring, drawn over the rug and the figure */
.gd-fake .arena-a:focus-visible .gd-fake-art::after{content:"";position:absolute;inset:0;box-shadow:inset 0 0 0 3px var(--teal);pointer-events:none}
.gd-fakeside{min-width:0}.chap-b .gd-fakeside .gd-say{margin:0 0 10px}.gd-fakeside .gd-say::before{display:none}
.gd-facts{margin:0}.gd-facts .ew-fact{flex:1 1 13rem}

/* ===== Ascension 10 ===== */
.gdpage .arenas.mtgrid.gd-bosses{grid-template-columns:repeat(3,minmax(0,1fr))}
.gd-bosses>.arena{container-type:inline-size}.gd-bosses .arena-name{font-size:clamp(.92rem,7.2cqw,1.15rem)}.gd-bosses .arena-f{font-size:clamp(.72rem,5.6cqw,.92rem)}
@container (max-width:39.99rem){.gdpage .arenas.mtgrid.gd-bosses{grid-template-columns:minmax(0,1fr)}}
.gd-ladder{list-style:none;margin:4px 0 0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:8px var(--gap)}
.chap-b .gd-ladder{padding-left:0}
@container (min-width:52rem){.gd-ladder{grid-auto-flow:column;grid-template-rows:repeat(5,auto);grid-template-columns:repeat(2,minmax(0,1fr))}}
.gd-lv{display:flex;align-items:center;gap:14px;min-width:0;margin:0;padding:8px 14px 9px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 3px 0 rgba(0,0,0,.4)}
.chap-b .gd-lv{margin:0}
.gd-lv .gd-fl{--fs:2.1rem}
.gd-lv.top{border-color:#b5622a;background:linear-gradient(rgba(70,36,14,.9),rgba(34,22,16,.95))}
.gd-lv-t{min-width:0;display:flex;flex-direction:column;gap:1px;line-height:1.35}
.gd-lv-n{font-family:var(--font-t);font-size:1.06rem}
.gd-lv-t>span{font-size:.94rem;color:var(--muted)}
.gd-no{display:flex;flex-wrap:wrap;align-items:center;gap:10px 26px}
.gd-no-w{font:700 3.4rem/1 var(--font-d);color:var(--gold)}
.gd-a20{display:flex;align-items:flex-end;gap:clamp(2px,.7cqw,8px);min-width:0}
.gd-a20 .gd-fl{--fs:clamp(1.25rem,4cqw,2.3rem)}
.gd-a20-x{position:relative;display:inline-grid;margin-left:clamp(6px,1.6cqw,18px)}
.gd-a20-x::after{content:"";position:absolute;left:-12%;right:-12%;top:50%;height:3px;rotate:-24deg;background:var(--red);box-shadow:0 1px 0 rgba(0,0,0,.6)}

/* ===== unknown rooms ===== */
.gd-roll{margin:4px 0 16px}
.gd-roll-bar{display:flex;height:1.9rem;border-radius:9px;overflow:hidden;background:rgba(0,0,0,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.14),0 4px 0 rgba(0,0,0,.4)}
.gd-roll-bar i{flex:0 0 calc(var(--v) * 1%);background:var(--mc);box-shadow:inset 0 -8px 0 rgba(0,0,0,.15),inset -2px 0 0 rgba(0,0,0,.4)}
.gd-roll-k{display:flex;flex-wrap:wrap;gap:6px 20px;margin-top:10px;font-family:var(--font-t);color:var(--text)}
.gd-roll-k span{display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
.gd-roll-k .mi{width:1.7rem;height:1.7rem;object-fit:contain}
.gd-roll-k b{color:var(--mc)}
.gd-roll-k .off{color:var(--dim)}.gd-roll-k .off .mi{filter:grayscale(1) brightness(.7)}.gd-roll-k .off b{color:var(--dim)}
.gd-can{display:grid;grid-template-columns:minmax(0,1fr);gap:14px var(--gap)}
@container (min-width:54rem){.gd-can{grid-template-columns:repeat(2,minmax(0,1fr))}}
.gd-canl{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}
.chap-b .gd-canl{padding-left:0}
.gd-canl li{display:flex;flex-direction:column;align-items:center;gap:6px;margin:0;padding:10px 6px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 3px 0 rgba(0,0,0,.4);font-family:var(--font-t);font-size:.92rem;line-height:1.2;text-align:center;color:var(--text)}
.gd-canl li.off{color:var(--dim)}.gd-canl li.off .mi{filter:grayscale(1) brightness(.75)}
@container (max-width:30rem){.gd-canl{grid-template-columns:repeat(2,minmax(0,1fr))}}
.gd-firstq{list-style:none;margin:12px 0 0;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.chap-b .gd-firstq{padding-left:0}
@container (min-width:44rem){.gd-firstq{grid-template-columns:repeat(4,minmax(0,1fr))}}
.gd-firstq li{display:flex;flex-direction:column;align-items:center;gap:6px;margin:0;padding:12px 8px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 3px 0 rgba(0,0,0,.4);text-align:center}
.gd-firstq li.rest{border-style:dashed}
.gd-firstq-n{font-family:var(--font-t);font-size:.76rem;font-weight:700;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
.gd-firstq b{font-family:var(--font-t);font-size:1.08rem;color:#fff}
.gd-firstq-mix{display:grid;grid-template-columns:repeat(2,1.45rem);gap:2px 4px;height:3rem;align-content:center}.gd-firstq-mix .mi{display:block;width:1.45rem;height:1.45rem;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.55))}
.gd-acts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:4px}
@container (min-width:56rem){.gd-acts.c4{grid-template-columns:repeat(4,minmax(0,1fr))}}
.gd-act{position:relative;display:flex;flex-direction:column;gap:3px;min-width:0;padding:12px 14px 13px;border-radius:12px;overflow:hidden;border:3px solid #2a2520;box-shadow:0 6px 0 #0a0806;color:var(--text);text-decoration:none;isolation:isolate}
.gd-act:hover{text-decoration:none}
.gd-act-bg{position:absolute;z-index:-1;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;filter:brightness(.42);transition:filter .17s cubic-bezier(.6,0,.4,1)}
.gd-act:hover .gd-act-bg,.gd-act:focus-visible .gd-act-bg{filter:brightness(.6)}
.gd-act-t small{display:block;font-family:var(--font-t);font-size:.82rem;color:#87CEEB}
.gd-act-t b{font-family:var(--font-d);font-size:1.35rem;line-height:1.1;color:#EFC851}
.gd-act-n,.gd-act-s{display:flex;align-items:center;gap:7px;font-family:var(--font-t);white-space:nowrap}
.gd-act-n{margin-top:6px;font-size:1rem}.gd-act-n b{font-size:1.3rem;color:#fff}
.gd-act-s{font-size:.9rem;color:var(--muted)}
.gd-act .mi{width:1.5rem;height:1.5rem;object-fit:contain;flex:none}

/* ===== rest sites ===== */
.gd-rest-sites .gd-chap>.chap-b>.gd-say{display:inline-flex;margin:0 0 12px;max-width:none}.gd-rest-sites .gd-chap>.chap-b>.gd-say::before{display:none}
.gd-opts{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--gap)}
.gd-opt{display:grid;grid-template-columns:7rem minmax(0,1fr);grid-template-rows:auto auto 1fr auto;gap:2px 14px;min-width:0;padding:12px 14px;border-radius:12px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.gd-opt-i{grid-row:1/5;align-self:start}
.gd-opt-i img{display:block;width:100%;height:auto;filter:drop-shadow(0 4px 3px rgba(0,0,0,.55));transition:transform .17s cubic-bezier(.6,0,.4,1)}
.gd-opt:hover .gd-opt-i img{transform:translateY(-3px) scale(1.04)}
.gd-opt-n{margin:0;font-family:var(--font-d);font-size:1.4rem;line-height:1.1;color:var(--gold)}
.gd-opt-q{display:block;quotes:none;font-family:var(--font-d);font-style:italic;font-size:.98rem;line-height:1.35;color:#fff6e2}
.gd-opt-q::before,.gd-opt-q::after{content:none}
.gd-opt-d{margin:4px 0 0;font-size:.94rem;line-height:1.4;color:var(--muted)}
.chap-b .gd-opt-d,.chap-b .gd-opt-f{margin-bottom:0}
.gd-opt-f{grid-column:2;grid-row:4;align-self:end;margin:8px 0 0;padding-top:7px;border-top:1px solid rgba(255,255,255,.08);font-family:var(--font-t);font-size:.95rem;line-height:1.3;color:var(--text)}
.gd-opt-f small{margin-right:8px;font-size:.7rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}
@container (min-width:40rem){
  .gd-opts{grid-template-columns:repeat(3,minmax(0,1fr))}
  .gd-opt{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto auto 1fr auto;justify-items:center;text-align:center;padding:16px 14px 12px}
  .gd-opt-i{grid-row:auto;width:min(100%,10.5rem);margin-bottom:8px;align-self:auto}
  .gd-opt-f{grid-column:1;grid-row:5;justify-self:stretch}
}
.gd-heals{display:grid;grid-template-columns:minmax(0,1fr);gap:8px;margin:12px 0 4px}
.gd-heal{display:grid;grid-template-columns:2.6rem minmax(0,8rem) minmax(0,1fr) auto;align-items:center;gap:12px;min-width:0;padding:8px 14px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 3px 0 rgba(0,0,0,.4);color:var(--text);text-decoration:none}
.gd-heal:hover{text-decoration:none;border-color:var(--line-l)}
.gd-heal-i{width:2.6rem;height:2.6rem;object-fit:contain}
.gd-heal-t{display:flex;flex-direction:column;line-height:1.2;min-width:0}
.gd-heal-t b{font-family:var(--font-t);font-size:1.04rem}.gd-heal-t small{font-size:.86rem;color:var(--dim)}
.gd-heal-bar{display:block;width:var(--w,100%);height:1rem;border-radius:6px;overflow:hidden;background:rgba(0,0,0,.55);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
.gd-heal-bar i{display:block;width:30%;height:100%;background:linear-gradient(#8be36a,#4fae3a);box-shadow:inset 0 -4px 0 rgba(0,0,0,.18)}
.gd-heal-v{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-t);white-space:nowrap}
.gd-heal-v .mi{width:1.5rem;height:auto}.gd-heal-v b{font-size:1.25rem;color:#8be36a}
@container (min-width:60rem){
  .gd-heals.c5{grid-template-columns:repeat(5,minmax(0,1fr))}
  .gd-heals.c5 .gd-heal{grid-template-columns:2.6rem minmax(0,1fr);grid-template-rows:auto auto auto;gap:8px 10px;padding:12px 14px}
  .gd-heals.c5 .gd-heal-bar{grid-column:1/-1}.gd-heals.c5 .gd-heal-v{grid-column:1/-1;justify-content:center}
}
.gd-rows-ev{margin-top:16px}

/* ===== card rewards ===== */
.gd-loots{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;margin-top:4px}
@container (min-width:34rem){.gd-loots{grid-template-columns:repeat(2,minmax(0,1fr))}}
@container (min-width:64rem){.gd-loots{grid-template-columns:repeat(4,minmax(0,1fr))}}
.gd-lootc{min-width:0;padding:12px 12px 14px;border-radius:12px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4)}
.gd-lootc-h{display:flex;align-items:center;gap:9px;margin:0 0 10px;font-family:var(--font-d);font-size:1.25rem;line-height:1.1;color:var(--gold)}
.gd-lootc-h .mi{width:2rem;height:2rem;object-fit:contain;flex:none}
.gd-lootc ul{list-style:none;margin:0;padding:0;display:grid;gap:7px}
.chap-b .gd-lootc ul{padding-left:0}
.gd-lootc li{display:flex;align-items:center;gap:10px;min-height:3rem;margin:0;padding:5px 14px 6px 12px;background:url(/img/ui/reward_screen/reward_item_button.webp) center/100% 100% no-repeat;font-family:var(--font-t);font-size:.98rem;line-height:1.15;color:#FFF6E2;text-shadow:0 1px 0 rgba(0,0,0,.55)}
.gd-lootc li .mi{width:1.9rem;height:1.9rem;object-fit:contain;flex:none;filter:drop-shadow(0 2px 1px rgba(0,0,0,.5))}
.gd-lootc li span{min-width:0;display:flex;flex-direction:column}
.gd-lootc li small{font-size:.66rem;font-weight:700;letter-spacing:.13em;text-transform:uppercase;color:#bfe9e4}
.gd-lootc li.off{filter:grayscale(1) brightness(.62)}
.gd-ups{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
.gd-up{position:relative;display:flex;flex-direction:column;align-items:center;gap:2px;min-width:0;padding:10px 6px 9px;border-radius:10px;overflow:hidden;border:2px solid #2a2520;box-shadow:0 4px 0 #0a0806;isolation:isolate;text-align:center}
.gd-up-bg{position:absolute;z-index:-1;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;filter:brightness(.4)}
.gd-up small{font-family:var(--font-t);font-size:.82rem;color:#87CEEB}
.gd-up b{font:700 1.7rem/1.05 var(--font-d);color:#fff}
.gd-up-a{display:inline-flex;align-items:center;gap:5px;font-family:var(--font-t);font-size:.92rem;color:var(--gd-asc)}
.gd-up-a .gd-fl{--fs:.95rem}
.gd-pot{padding:12px 14px;border-radius:10px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4);margin-bottom:14px}
.gd-pot .gd-meter{grid-template-columns:2rem auto minmax(0,1fr) 3.4rem}
.gd-pot-k{display:flex;flex-wrap:wrap;gap:4px 18px;margin:10px 0 0;font-family:var(--font-t);font-size:.95rem;color:var(--muted)}
.chap-b .gd-pot-k{margin-bottom:0}
.gd-pot-k .dn b{color:var(--hp)}.gd-pot-k .up b{color:#8be36a}.gd-pot-k .el b{color:var(--gold-x)}
.gd-packs{list-style:none;margin:12px 0 0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:10px}
.chap-b .gd-packs{padding-left:0}
@container (min-width:44rem){.gd-packs{grid-template-columns:repeat(2,minmax(0,1fr))}}
@container (min-width:78rem){.gd-packs{grid-template-columns:repeat(5,minmax(0,1fr))}}
.gd-pack{display:flex;flex-direction:column;min-width:0;margin:0;padding:10px 12px 0;border-radius:12px;background:var(--gd-panel);border:1px solid var(--line);box-shadow:0 4px 0 rgba(0,0,0,.4);overflow:hidden}
.chap-b .gd-pack{margin:0}
.gd-pack-h{display:flex;align-items:center;gap:8px;margin:0 0 8px;font-family:var(--font-t);font-size:.8rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.gd-pack-h .mi{width:1.5rem;height:1.5rem;object-fit:contain}
.gd-pack-c{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;flex:1}
.chap-b .gd-pack-c{padding-left:0}
.gd-pack-c li{margin:0;min-width:0}
.gd-pack-c a{display:flex;flex-direction:column;gap:5px;font-family:var(--font-t);font-size:.9rem;line-height:1.15;text-align:center;color:var(--gold)}
.gd-pack-c img{display:block;width:100%;height:auto;border-radius:6px;box-shadow:0 2px 0 rgba(0,0,0,.5),0 0 0 1px rgba(255,255,255,.14);transition:filter .2s}
.gd-pack-c a:hover img{filter:brightness(1.18)}
.gd-pack-x{display:flex;align-items:center;gap:4px 14px;min-height:2.7rem;margin:10px -12px 0;padding:4px 12px;background:rgba(0,0,0,.32);border-top:1px solid rgba(255,255,255,.08);font-family:var(--font-t);font-size:.9rem;white-space:nowrap}
.chap-b .gd-pack-x{margin-bottom:0}
.gd-pack-b{display:inline-flex;align-items:center;gap:6px;min-width:0}
.gd-pack-b .relic,.gd-pack-b .potion{width:2rem;height:2rem}

@media (max-width:640px){
  .gd-meter{grid-template-columns:1.7rem minmax(3.6rem,5.2rem) minmax(0,1fr) 3.5rem;gap:8px}
  .gd-meter-i,.gd-meter-i .mi{width:1.7rem;height:1.7rem}.gd-meter-l{font-size:.9rem}.gd-meter-v{font-size:1rem}
  .gd-step{padding:12px 12px 14px}.gd-step-b{min-width:2.5rem;height:2.5rem}
  .gd-row{padding:8px 11px 9px 8px;gap:10px}.gd-row-i,.gd-row-i .relic,.gd-row-i .potion,.gd-row-i .power{width:2.8rem;height:2.8rem}.gd-cardico{width:2.8rem}
  .gd-stair{padding:20px 0 0;gap:4px}.gd-stair-bars{height:8rem;gap:2px}.gd-stair-bars b{font-size:.66rem}
  .gd-opt{grid-template-columns:5.4rem minmax(0,1fr)}
  .gd-heal{grid-template-columns:2.2rem minmax(0,5.6rem) minmax(0,1fr) auto;gap:8px;padding:8px 10px}.gd-heal-i{width:2.2rem;height:2.2rem}
  .gd-no-w{font-size:2.6rem}
  .gd-shelf-in{padding:12px 10px 14px;gap:12px 14px}.gd-slots{gap:5px}.gd-slot{min-width:0;flex-basis:3rem;padding:8px 2px 6px}.gd-slot-l{font-size:.7rem}
  .gd-act{padding:10px 10px 11px}.gd-act-t b{font-size:1.15rem}.gd-act-n{font-size:.9rem}.gd-act-n b{font-size:1.1rem}.gd-act-s{font-size:.8rem}
}
@media (prefers-reduced-motion:reduce){.gd-opt:hover .gd-opt-i img{transform:none}.gd-meter-bar i,.gd-act-bg,.gd-opt-i img{transition:none}}
.gd-h3-n{margin-top:14px}.rc-asc{--rc:var(--gd-asc)}
.gd-prices li:first-child{border-top:0}

.gdhub .gd-note{margin-top:16px}
.gd-slot[class*=" t-"]{box-shadow:inset 0 3px 0 var(--tc),inset 0 0 0 1px rgba(255,255,255,.12),0 3px 0 rgba(0,0,0,.45)}
.gd-slot.t-attack{--tc:var(--attack)}.gd-slot.t-skill{--tc:var(--skill)}.gd-slot.t-power{--tc:var(--power)}.gd-slot.t-unc{--tc:var(--r-uncommon)}.gd-slot.t-rare{--tc:var(--r-rare)}
/* Related: a card's painting or an enemy's still in the directory's tile frame (tilehousing.css .itemcell.housed / .ih-slot), the same height as the relic and potion
   tiles beside it (wave 5, GD4). The picture box is the frame's inner 4.2rem; hover scales the picture only (no reflow) */
.gd-pic{display:grid;place-items:center;width:4.2rem;height:4.2rem}
.gd-pic img{display:block;max-width:100%;max-height:100%;object-fit:contain;filter:drop-shadow(0 3px 3px rgba(0,0,0,.6));transition:transform .17s cubic-bezier(.6,0,.4,1)}
.gd-pic-cards img{width:4.2rem;height:auto;border-radius:5px;box-shadow:0 2px 0 rgba(0,0,0,.5),0 0 0 1px rgba(255,255,255,.14);filter:none}
.gd-pic-monsters img{max-height:4.6rem}
.gd-cell:hover .gd-pic img,.gd-cell:focus-visible .gd-pic img{transform:scale(1.08)}
.chap-b .gd-chips{margin-top:14px}
@media (prefers-reduced-motion:reduce){.gd-pic img{transition:none}.gd-cell:hover .gd-pic img{transform:none}}
/* the first chapter of a guide has no head of its own: the page's banner (banner.js secBanner, guides.js gdBanChap) is its head (wave 5, GD3) */
.gdpage .secban.gd-ban+.chap.gd-underban{margin-top:14px}
.gdpage .chap.gd-underban>.chap-b{padding-top:14px}

/* ===== wave 4, WP6 (21 Sep 2026; docs/wave4/wp6-progress-reference.md) ===== */
/* the hub's "How to read these guides" is the daily hub's rules box (daily.js rulesFoldHtml, dailyhub.css): two lines, the plate button on the text's own line, the rest in the fold */
.gd-read .rf-body .gd-h3{margin:14px 0 6px}
.gd-read .rf-body .gd-covers{margin:0;max-width:none}
.gd-read .gd-readnotes b{color:var(--text)}
.gd-read .rf-body .gd-note{margin:12px 0 0;font-size:.95rem;color:var(--muted)}
/* the ? room painting is 380 px wide. In a scene wider than 300 px (a guide's hero, the phone's hub card) it used to be stretched to the scene, 1.5x its pixels on a 1.5x screen
   (audit GD2). There it now stands as a picture of at most 253 px over a blurred, dimmed copy of itself; the small hub tile keeps it edge to edge (it is sharp at that size). */
.gd-sc-unknown-rooms .gd-paint-bk{display:none}
@container (min-width:300px){
  .gd-sc-unknown-rooms .gd-paint-bk{display:block;inset:-10%;width:120%;height:120%;filter:blur(14px) brightness(.5) saturate(1.15)}
  .gd-sc-unknown-rooms .gd-paint{inset:auto;left:50%;top:47%;translate:-50% -50%;width:min(70cqw,253px);height:auto;aspect-ratio:380/288;border-radius:10px;box-shadow:0 0 0 2px rgba(255,255,255,.16),0 5px 0 rgba(0,0,0,.5),0 12px 26px rgba(0,0,0,.55)}
}

/* touch (wave 6 QoL, 23 Sep 2026; the site's touch rule, style.css): the step buttons were 2.5 to 2.6rem, 37.5 to 39 px at the phone root; 40 px floor for a finger */
@media (hover:none) and (pointer:coarse){.gd-step-b{min-width:40px;min-height:40px}}
/* the Ascension ladder's level name was the only link in its panel, 21 px tall: on a touch screen the whole panel is the link (a link inside its line, Ascender's Bane,
   stays above it); a pack's relic and potion grow from 2rem (30 px) to 2.75rem */
@media (hover:none) and (pointer:coarse){.gd-lv{position:relative}.gd-lv-n::after{content:"";position:absolute;inset:0;border-radius:inherit}.gd-lv-t>span a{position:relative;z-index:1}
  .gd-pack-b .relic,.gd-pack-b .potion{width:2.75rem;height:2.75rem}}

/* ===== app/home.css ===== */
/* ===== home (docs/wave3/home.md): the rotating title word; the act map, PARKED (not on any page since 17 Sep 2026, kept whole for a later site-wide overlay: the ".mapboard" and
   ".maprow" blocks); the hero band; section headers; the character tiles with their hover attack; the Lethal feature banner and the illustrated game / directory tiles (shared with the
   daily hub, so those rules are not scoped to .home); the store banner; the patch strip. The layout answers to the content column's own width (container "home"). =====
   Wave 2 notes on the map:
   The map follows NMapScreen: the Overgrowth parchment (packed/map/map_bgs), pencil-dotted paths in the act's untraveled
   ink #877256 and traveled ink #28231D, map_node_background under every icon, the boss placeholder as ink line art over
   its parchment silhouette (NBossMapPoint modulates the icon with MapTraveledColor and the outline with MapBgColor),
   hover scale 1.45 in 0.05 s and a 0.3 s Back-out return (NNormalMapPoint), boss hover 1.05 / 0.5 s Cubic-out,
   the map marker's hop (NMapMarker: up 25 px Sine-in over 0.2 s, back with Elastic-out over 0.75 s). */

/* ---------- title: "Every <word> in Slay the Spire 2" ---------- */
.rot-h1 .brk{display:block}
.rot{display:inline-block;position:relative;vertical-align:baseline;white-space:nowrap;transition:width .5s cubic-bezier(.2,.8,.2,1)}
.rot.live{clip-path:inset(-2px -.08em)} /* clip-path instead of overflow:hidden, which would move the inline-block's baseline to its bottom edge and lift the word */
.rot-w{display:inline-block;position:relative;transition:transform .55s cubic-bezier(.2,.8,.2,1),opacity .35s ease}
.rot-w.in{transform:translateY(105%);opacity:0}
.rot-w.out{position:absolute;left:0;top:0;transform:translateY(-105%);opacity:0;pointer-events:none}
.rot-w[data-c="cards"]{color:var(--teal)} /* not gold: the rest of the title is gold and the word must stand out (Bean, 17 Sep 2026) */
.rot-w[data-c="relics"]{color:var(--blue)}
.rot-w[data-c="potions"]{color:var(--green)}
.rot-w[data-c="powers"]{color:var(--orange)}
.rot-w[data-c="enemies"]{color:var(--red)}
.rot-w[data-c="events"]{color:var(--purple)}
@media (prefers-reduced-motion:reduce){.rot{transition:none}.rot-w{transition:opacity .4s ease}.rot-w.in,.rot-w.out{transform:none}}

/* ---------- the map board ---------- */
/* the housing rule (wave 3): the sheet fills its frame edge to edge. mapBoardSvg() scales the parchment so its torn silhouette lies outside the viewBox; the frame crops it, and what shows
   of the wear (rim band, pencil border, stains, the odd tear) sits inside the frame. The box takes the svg's own 520:760 shape, so paper and frame agree at every width; the colour behind the
   sheet is the rim's brown, so a tear that reaches past the crop line reads as paper, not as a gap. ::after is the frame's shadow falling on the sheet. */
.mapboard{position:relative;border-radius:12px;overflow:hidden;background:#6f5535;border:3px solid #2a2520;box-shadow:0 10px 0 #0a0806;aspect-ratio:520/760}
.mapboard::after{content:"";position:absolute;inset:0;border-radius:9px;pointer-events:none;box-shadow:inset 0 0 0 1px rgba(36,24,10,.55),inset 0 3px 10px rgba(20,12,4,.5),inset 0 0 38px rgba(54,34,12,.38)}
.mapboard svg{display:block;width:100%;height:auto}
.mapboard .paper{pointer-events:none}
.mapboard .dots{pointer-events:none}
.mapboard .reveal{transform-box:fill-box;transform-origin:50% 100%}
.mapboard .node{cursor:pointer;outline:0}
/* NNormalMapPoint._Process: a travelable room's container scales sin(t*4)*0.25+1.2 (0.95..1.45, 1.57 s a loop) until it is focused; the other rooms only breathe 2 px so the board is not dead */
.mapboard .node .pulse{transform-box:fill-box;transform-origin:center;animation:nodebob 3.6s ease-in-out infinite;animation-delay:calc(var(--i,0)*-.55s)}
.mapboard .node.start .pulse{animation:mappulse 1.571s ease-in-out infinite;animation-delay:calc(var(--ph,0)*-1.571s)}
.mapboard .node.ancient .pulse{animation:ancpulse 1.571s ease-in-out infinite}
.mapboard .node:hover .pulse,.mapboard .node:focus-visible .pulse{animation:none;transform:none}
.mapboard .node .ico{transform-box:fill-box;transform-origin:center;transition:transform .5s cubic-bezier(.33,1,.68,1)} /* AnimUnhover: 0.5 s cubic-out */
.mapboard .node .outl{transform-box:fill-box;transform-origin:center;opacity:0;transition:opacity .5s cubic-bezier(.33,1,.68,1),transform .5s cubic-bezier(.33,1,.68,1)} /* the outline sprite in MapBgColor is invisible on the parchment; hover shows it white at 75% (_outlineColor) */
.mapboard .node:hover .ico,.mapboard .node:focus-visible .ico,.mapboard .node:hover .outl,.mapboard .node:focus-visible .outl{transform:scale(1.45);transition-duration:.05s}
.mapboard .node:hover .outl,.mapboard .node:focus-visible .outl{opacity:.75}
.mapboard .node:active .ico,.mapboard .node:active .outl{transform:scale(.9);transition-duration:.3s} /* AnimPressDown: DownScale 0.9 over 0.3 s */
.mapboard .node.ancient:hover .ico,.mapboard .node.ancient:focus-visible .ico{transform:scale(1.1)} /* NAncientMapPoint.HoverScale */
.mapboard .node.ancient:active .ico{transform:scale(.9)}
.mapboard .node .bossart{transform-box:fill-box;transform-origin:center;transition:transform .5s cubic-bezier(.33,1,.68,1)}
.mapboard .node.boss:hover .bossart,.mapboard .node.boss:focus-visible .bossart{transform:scale(1.05);transition-duration:.05s}
.mapboard .node.boss:active .bossart{transform:scale(1.02);transition-duration:.3s;transition-timing-function:cubic-bezier(.16,1,.3,1)}
/* NMapPingVfx on the click: the ring scales to 2.5 over 0.7 s expo-out and its alpha drops to 0 over 0.15 s after 0.15 s */
.mapboard .node .ping{opacity:0;transform-box:fill-box;transform-origin:center;pointer-events:none}
.mapboard .node .ping.go{animation:mapping .7s cubic-bezier(.16,1,.3,1) 1 both}
.mapboard .lbl{font-family:var(--font-t);font-weight:700;font-size:18px;fill:#2b2216;paint-order:stroke;stroke:rgba(224,201,158,.92);stroke-width:4px;stroke-linejoin:round;transition:fill .15s}
.mapboard .node:hover .lbl,.mapboard .node:focus-visible .lbl{fill:#100c08;text-decoration:underline}
.mapboard .bosslbl{font-size:20px;letter-spacing:.02em}
.mapboard .marker{transform-box:fill-box;transform-origin:50% 100%;filter:drop-shadow(0 3px 2px rgba(0,0,0,.35));animation:markerhop .95s cubic-bezier(.2,.7,.3,1) 1,markeridle 2.6s ease-in-out .95s infinite alternate;pointer-events:none}
/* the legend scroll: map_screen.tscn MapLegend, header Kreon bold in #152A3E, items in #294667; slides in from the right on open (Open: +120 px, 0.25 s back-out); hover scales the icon 1.25 at once and back over 0.5 s expo-out (NMapLegendItem) */
.mapboard .legend{transform-box:fill-box;transform-origin:center;animation:legendin .25s cubic-bezier(.34,1.56,.64,1) .1s both}
.mapboard .lgh{font-family:var(--font-t);font-weight:700;font-size:19px;fill:#152A3E}
.mapboard .lg{cursor:default}
.mapboard .lg text{font-family:var(--font-t);font-weight:700;font-size:15px;fill:#294667;pointer-events:none}
.mapboard .lg image{transform-box:fill-box;transform-origin:center;transition:transform .5s cubic-bezier(.16,1,.3,1)}
.mapboard .lg:hover image{transform:scale(1.25);transition-duration:.05s}
.mapboard[data-hl="unknown"] .node[data-t="unknown"] .ico,.mapboard[data-hl="shop"] .node[data-t="shop"] .ico,.mapboard[data-hl="chest"] .node[data-t="chest"] .ico,.mapboard[data-hl="rest"] .node[data-t="rest"] .ico,.mapboard[data-hl="monster"] .node[data-t="monster"] .ico,.mapboard[data-hl="elite"] .node[data-t="elite"] .ico,
.mapboard[data-hl="unknown"] .node[data-t="unknown"] .outl,.mapboard[data-hl="shop"] .node[data-t="shop"] .outl,.mapboard[data-hl="chest"] .node[data-t="chest"] .outl,.mapboard[data-hl="rest"] .node[data-t="rest"] .outl,.mapboard[data-hl="monster"] .node[data-t="monster"] .outl,.mapboard[data-hl="elite"] .node[data-t="elite"] .outl{transform:scale(1.45);transition-duration:.05s}
.mapboard[data-hl="unknown"] .node[data-t="unknown"] .outl,.mapboard[data-hl="shop"] .node[data-t="shop"] .outl,.mapboard[data-hl="chest"] .node[data-t="chest"] .outl,.mapboard[data-hl="rest"] .node[data-t="rest"] .outl,.mapboard[data-hl="monster"] .node[data-t="monster"] .outl,.mapboard[data-hl="elite"] .node[data-t="elite"] .outl{opacity:.75}
/* NActBanner: a black band at 25% across the map from 39.8% to 58.3% of its height, "Act 1" in Kreon (#87CEEB) over the act's title in Spectral bold (#EFC851); in over 0.5 s, holds, out over 1 s */
.mapboard .actbanner{position:absolute;left:0;right:0;top:39.8%;height:18.5%;background:rgba(0,0,0,.25);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.1em;pointer-events:none;animation:bannerin .5s ease .3s both,bannerout .8s ease-out 2.4s both}
.mapboard .actbanner .actn{font-family:var(--font-t);font-size:min(1.1rem,3.4vw);color:#87CEEB;text-shadow:3px 2px 0 rgba(0,0,0,.05);animation:bannerlift 1.25s cubic-bezier(.25,.46,.45,.94) .5s both}
.mapboard .actbanner .actname{font-family:var(--font-d);font-weight:700;font-size:min(2.6rem,8vw);line-height:1;color:#EFC851;text-shadow:4px 3px 0 rgba(0,0,0,.05)}
@keyframes nodebob{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}
@keyframes mappulse{0%{transform:scale(1.2)}25%{transform:scale(1.45)}75%{transform:scale(.95)}100%{transform:scale(1.2)}}
@keyframes ancpulse{0%{transform:scale(1)}25%{transform:scale(1.05)}75%{transform:scale(.95)}100%{transform:scale(1)}}
@keyframes mapping{0%{opacity:1;transform:scale(1)}21%{opacity:1}43%{opacity:0;transform:scale(2.05)}100%{opacity:0;transform:scale(2.5)}}
@keyframes legendin{0%{transform:translateX(60px);opacity:0}100%{transform:none;opacity:1}}
@keyframes bannerin{0%{opacity:0}100%{opacity:1}}
@keyframes bannerout{0%{opacity:1}100%{opacity:0}}
@keyframes bannerlift{0%{transform:translateY(10px)}100%{transform:none}}
@keyframes markerhop{0%{transform:translateY(0) scaleY(.2)}12%{transform:translateY(-3px) scaleY(1)}30%{transform:translateY(-25px)}52%{transform:translateY(5px)}70%{transform:translateY(-4px)}85%{transform:translateY(2px)}100%{transform:translateY(0)}}
@keyframes markeridle{0%{transform:translateY(0)}100%{transform:translateY(-4px)}}
@media (prefers-reduced-motion:reduce){.mapboard .node .pulse,.mapboard .marker,.mapboard .legend,.mapboard .node .ping.go{animation:none}.mapboard .node .ico,.mapboard .node .outl,.mapboard .node .bossart,.mapboard .lg image{transition:none}.mapboard .actbanner{display:none}}
/* type sizes above: a step up from wave 2 (room names 18, legend 15 / 19 units), set when the board was last drawn at about 430 px; a bigger board may take them down again */
/* PARKED with the map (pages.js mapRowHtml): the slim parchment row that unrolls the board in place. Not on any page today. */
.maprowbox{position:relative}
.mapopen{position:absolute;left:0;top:0;width:1px;height:1px;margin:0;opacity:0;pointer-events:none}
.maprow{display:flex;align-items:center;gap:12px;padding:7px 14px 7px 10px;border-radius:12px;border:3px solid #2a2520;box-shadow:0 5px 0 #0a0806;cursor:pointer;color:#241F1A;
  background:linear-gradient(rgba(255,240,205,.16),rgba(60,38,12,.18)),#A78A67;-webkit-tap-highlight-color:transparent;user-select:none;transition:filter .12s,translate .12s}
.maprow img{flex:none;width:2.5rem;height:auto;filter:drop-shadow(0 2px 0 rgba(0,0,0,.35))}
.maprow .mr-t{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:1px}
.maprow b{font-family:var(--font-t);font-size:1.12rem;line-height:1.15;color:#1d1711}
.maprow .st{font-size:.84rem;line-height:1.25;color:#3d2f1e}
.maprow .mr-close{display:none}
.maprow .mr-chev{flex:none;width:.7rem;height:.7rem;margin:0 4px 4px 0;border-right:3px solid #241F1A;border-bottom:3px solid #241F1A;rotate:45deg;transition:rotate .2s,margin .2s}
.maprow:hover{filter:brightness(1.07)}
.maprow:active{translate:0 2px}
.mapopen:focus-visible+.maprow{outline:3px solid var(--gold);outline-offset:2px}
.mapopen:checked+.maprow .mr-open{display:none}.mapopen:checked+.maprow .mr-close{display:inline}
.mapopen:checked+.maprow .mr-chev{rotate:225deg;margin:4px 4px 0 0}
.maprowbox .mapboard{display:none;width:min(100%,27rem);margin:14px auto 10px}
.mapopen:checked~.mapboard{display:block;animation:mapunroll .28s cubic-bezier(.2,.8,.2,1) both}
@keyframes mapunroll{0%{opacity:0;clip-path:inset(0 0 100% 0);translate:0 -8px}100%{opacity:1;clip-path:inset(0 0 0 0);translate:0 0}}
@media (prefers-reduced-motion:reduce){.mapopen:checked~.mapboard{animation:none}.maprow,.maprow .mr-chev{transition:none}}

/* ---------- layout: the home page answers to its own width, not the window's (wave 3) ----------
   The content column changes width with the rail (docked, collapsed, drawer), so what depends on room (the hero, the character row, the banner's art) is sized by the width of its
   container "home" (.page.home; .dailytiles is the same container around the banner and the game tiles on the daily hub), not by the viewport.
   The page is a stack of sections with the same rhythm: the hero band, then .homesec blocks that each open with a .sechead (small game sprite, h2, optional "view all" link). */
@supports (container-type:inline-size){.page.home,.dailytiles{container:home/inline-size}}
/* Bean, 17 Sep 2026: "add 12px more in distance between bottom of prior category and the title of the next one" */
.homesec{margin-top:calc(var(--stack,16px)*2.1 + 12px)}
.sechead{display:flex;align-items:center;gap:10px;margin:0 0 12px;padding:0 2px 8px;border-bottom:2px solid rgba(255,255,255,.09)}
.sechead img{flex:none;width:2rem;height:2rem;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.5))}
.sechead :is(h2,.hx){flex:1 1 auto;min-width:0;margin:0;color:var(--gold);font-size:clamp(1.3rem,1.1rem + .6vw,1.65rem);line-height:1.1}
.sechead .sh-more{flex:none;font-family:var(--font-t);font-weight:700;font-size:.95rem;color:var(--dim);white-space:nowrap;text-decoration:none;transition:color .12s}
.sechead .sh-more::after{content:"›";display:inline-block;margin-left:.35em;transition:translate .12s}
.sechead .sh-more:hover,.sechead .sh-more:focus-visible{color:var(--gold)}
.sechead .sh-more:hover::after{translate:3px 0}
.homesec>.lethalbanner.dailybox,.homesec>.steambanner,.homesec>.patchstrip,.homesec>.charfan{margin-top:0}

/* ---------- the hero band: the full width on purpose (the map's column is gone) ----------
   One framed band: title, lead and the three buttons on the left, the game's character-select scene on the right, fading through the five characters (pages.js heroRotate,
   every 5 s, 1.4 s cross-fade; the Silent alone without JS or under reduced motion). Each .hh-scene is one character: a base gradient in that character's scene colours
   (from the game's char_select_bg_<id>.tscn gradients), the backdrop texture (.hh-bg: the game's for the Silent and the Necrobinder, the scene's own backdrop slots for the Defect and the Regent), and the still (.hh-fig). The
   still is placed the way the Lethal character picker places it (Bean: "that is the right way"): natural aspect, never cropped or stretched, as tall as the band, anchored
   to the bottom-right corner (the stills are cropped to their opaque box by extract/hero_art.py, so the figure meets the band's right and bottom edges), its left edge
   fading out into the backdrop (mask), the painted skies of the Ironclad, the Defect and the Regent included. ::after is the scrim under the text:
   the left 60 % only, so the art keeps its colour. Compact: as tall as the text needs, so the characters start above the fold on a 1080p screen. Phone: the scene sits
   dimmed behind the text. */
.home .homehero{position:relative;display:grid;grid-template-columns:minmax(0,1fr);align-items:center;gap:0;min-height:13rem;padding:clamp(16px,2.6vw,32px) clamp(16px,3vw,40px);border-radius:16px;overflow:hidden;isolation:isolate;
  border:2px solid rgba(255,255,255,.1);background:#0c1719;box-shadow:0 6px 0 rgba(0,0,0,.45)}
.home .hh-main{position:relative;min-width:0;max-width:min(100%,44rem)}
.home .hh-main .lead{max-width:40rem}
.home .hh-art{position:absolute;inset:0;z-index:-1;pointer-events:none}
.home .hh-scene{position:absolute;inset:0;opacity:0;transition:opacity 1.4s ease;background:radial-gradient(90% 140% at 100% 50%,var(--hg,transparent),transparent 70%),linear-gradient(100deg,var(--h1),var(--h2) 60%,var(--h3))}
.home .hh-scene.on{opacity:1}
.home .hh-scene::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(6,10,12,.55) 0,rgba(6,10,12,.3) 28%,transparent 55%)}
.home .hh-scene[data-c="silent"]{--h1:#0c1719;--h2:#0e1d18;--h3:#0a1411;--hg:rgba(46,125,84,.2)}
.home .hh-scene[data-c="ironclad"]{--h1:#0b0503;--h2:#1c0907;--h3:#3f130c;--hg:rgba(233,80,58,.16)}
.home .hh-scene[data-c="defect"]{--h1:#06111a;--h2:#0b1f2d;--h3:#123a52;--hg:rgba(6,137,189,.22)}
.home .hh-scene[data-c="necrobinder"]{--h1:#150612;--h2:#2a0b26;--h3:#4b1140;--hg:rgba(200,60,160,.18)}
.home .hh-scene[data-c="regent"]{--h1:#1a0d05;--h2:#2e1508;--h3:#5c2b0c;--hg:rgba(224,127,100,.2)}
/* backdrops (Bean, 17 Sep 2026 second pass): no left fade, just lower opacity. The Silent's is untouched ("perfect"); the Defect's and the Regent's (their scenes
   split into figure and backdrop by extract/hero_layers.py) sit at 80 %; the Necrobinder's a further 20 % under its earlier dimming ("isn't faded enough") */
.home .hh-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 50%;opacity:.8}
.home .hh-scene[data-c="silent"] .hh-bg{opacity:.85;-webkit-mask-image:linear-gradient(90deg,transparent 8%,#000 62%);mask-image:linear-gradient(90deg,transparent 8%,#000 62%)}
.home .hh-scene[data-c="necrobinder"] .hh-bg{opacity:.44;filter:brightness(.74) saturate(.85)}
.home .hh-scene[data-c="necrobinder"] .hh-fig{-webkit-mask-image:linear-gradient(90deg,transparent 10%,#000 46%);mask-image:linear-gradient(90deg,transparent 10%,#000 46%)}
.home .hh-fig{position:absolute;right:-1%;bottom:-1.5%;height:106%;width:auto;max-width:none;filter:drop-shadow(0 8px 10px rgba(0,0,0,.55));-webkit-mask-image:linear-gradient(90deg,transparent 4%,#000 34%);mask-image:linear-gradient(90deg,transparent 4%,#000 34%)}
/* cut-out figures over their own backdrop: only the far tip fades (the Defect's claw, the Regent's constellations reach toward the text) */
.home .hh-scene[data-c="defect"] .hh-fig,.home .hh-scene[data-c="regent"] .hh-fig{-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 18%);mask-image:linear-gradient(90deg,transparent 0,#000 18%)}
.home .hh-scene[data-c="ironclad"] .hh-fig{right:-2.2%}   /* Bean: "moved to the right very slightly" */
/* the still's own backdrop (the Ironclad, the Defect, the Regent) fades out to the left the same way, into the scene's gradient */
@media (prefers-reduced-motion:reduce){.home .hh-scene{transition:none}}
@media (max-width:760px){
  .home .homehero{min-height:0}
  .home .hh-fig{height:100%;right:-12%;opacity:.42}
  .home .hh-bg{opacity:.6}
  .home .hh-scene::after{background:linear-gradient(90deg,rgba(6,10,12,.5),rgba(6,10,12,.25))}
  .home .rot-h1,.home .hh-main .lead{text-shadow:0 2px 0 rgba(0,0,0,.7),0 0 14px rgba(0,0,0,.6)}}

/* ---------- the characters: big upright tiles, five across on a desktop, three and two on a tablet, two to a row on a phone (the odd one out lies down across the row) ----------
   The tile is the positioned box the live canvas is placed in (hover attack, pages.js homeCharAnim). The player is mounted with pin:true, so the body attacks on the spot, and the
   tile clips whatever still reaches past its SIDES. The hover lift moves the whole tile, art3d's tilt happens inside it, the focus ring is an outline (not clipped).
   Sizing is by BODY, not by the still's box (pages.js CHAR_FIT): --cah is the art height every tile reserves, --cs the character's own scale, --cy a shift down (share of --cah).
   .cb-art is the scaled box: --cse times as wide and as tall as the reserved box, centred, its feet on the reserved box's bottom edge (the negative top margin takes the extra
   height back, so every tile stays the same height and the five stand on one ground line). What a scaled still has above its body (the Necrobinder's scythe, the Ironclad's blade)
   rises over the tile's top edge on the desktop row (--csk 1, overflow-y visible, room kept above the row), and on the stacked layouts, where it would cover the tile above, the
   scale is eased (--csk .75), the tile keeps that much headroom inside (padding-top) and clips all round. Real layout size on purpose, never a transform: creatureanim.js places the canvas from the still's offset box and does
   not see transforms. The still keeps offset 0,0 in .cb-art and in art3d's wrapper alike, and its height is spelled out (not 100%) so it is the same in both. Centred contain fit:
   the player assumes it. */
:is(.home,.charidx) .charfan{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap,12px)}
:is(.home,.charidx) .charbtn{--cah:8rem;--cse:calc(1 + (var(--cs,1) - 1)*var(--csk,.75));position:relative;overflow:clip;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;min-width:0;padding:calc(var(--cah)*.24) 10px 12px;text-align:center;
  background:radial-gradient(130% 85% at 50% 100%,color-mix(in srgb,var(--c,#888) 34%,transparent),transparent 72%),rgba(0,0,0,.32)}
:is(.home,.charidx) .charbtn .cb-art{position:relative;top:calc(var(--cah)*var(--cy,0));left:calc(var(--cah)*var(--cx,0));display:flex;flex:none;align-self:center;min-width:0;width:calc(100%*var(--cse));margin-top:calc(var(--cah)*(1 - var(--cse)))}
:is(.home,.charidx) .charbtn .cb-art>.a3d{flex:none}
:is(.home,.charidx) .charbtn img{display:block;flex:none;width:100%;height:calc(var(--cah)*var(--cse));object-fit:contain}
:is(.home,.charidx) .charbtn .a3d-t:has(>canvas.ca-live)>.a3d-sheen{display:none} /* art3d's rim light is cut to the still's shape; over the moving skeleton it would be a ghost */
:is(.home,.charidx) .charbtn .cb-t{position:relative;display:flex;flex-direction:column;gap:3px;min-width:0}
:is(.home,.charidx) .charbtn .cb-n{font-weight:700;font-size:clamp(1.12rem,.9rem + .5vw,1.4rem);line-height:1.08;text-wrap:balance}
:is(.home,.charidx) .charbtn .cb-f{font-family:var(--font-b,inherit);font-size:.86rem;color:var(--dim);line-height:1.2}
:is(.home,.charidx) .charbtn .sw{height:5px;border-radius:3px;margin-top:6px}
:is(.home,.charidx) .charbtn:last-child:nth-child(odd){grid-column:1/-1;flex-direction:row;align-items:center;justify-content:center;gap:14px;padding-top:12px;text-align:left;
  background:radial-gradient(90% 130% at 30% 100%,color-mix(in srgb,var(--c,#888) 34%,transparent),transparent 72%),rgba(0,0,0,.32)}
:is(.home,.charidx) .charbtn:last-child:nth-child(odd) .cb-art{width:calc(7.5rem*var(--cse))}
:is(.home,.charidx) .charbtn:last-child:nth-child(odd) .cb-t{flex:0 1 12rem}
@supports (container-type:inline-size){
  :is(.home,.charidx) .charbtn{--cah:clamp(7rem,32cqi,10rem)}
  @container home (min-width:40.01rem){ /* every tile upright from here on, the fifth included */
    :is(.home,.charidx) .charbtn:last-child:nth-child(odd){flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;padding-top:calc(var(--cah)*.24);text-align:center;
      background:radial-gradient(130% 85% at 50% 100%,color-mix(in srgb,var(--c,#888) 34%,transparent),transparent 72%),rgba(0,0,0,.32)}
    :is(.home,.charidx) .charbtn:last-child:nth-child(odd) .cb-art{width:calc(100%*var(--cse))}
    :is(.home,.charidx) .charbtn:last-child:nth-child(odd) .cb-t{flex:none}}
  @container home (min-width:40.01rem) and (max-width:56rem){ /* tablet, narrow desktop window: three over two */
    :is(.home,.charidx) .charfan{grid-template-columns:repeat(6,minmax(0,1fr))}
    :is(.home,.charidx) .charbtn{grid-column:span 2;--cah:clamp(9rem,24cqi,12.5rem)}
    :is(.home,.charidx) .charbtn:nth-child(n+4),:is(.home,.charidx) .charbtn:last-child:nth-child(odd){grid-column:span 3}}
  @container home (min-width:56.01rem){ /* desktop: one row of five, full scale, the blades rise over the top edge (the row keeps that much room under the section header) */
    :is(.home,.charidx) .charfan{grid-template-columns:repeat(5,minmax(0,1fr));gap:clamp(12px,1.3cqi,20px)}   /* no headroom above the row (Bean, 17 Sep 2026: the gap under the header is measured "from the top of the char boxes", like every other section; the scythe and the blade may cross the header's rule) */
    :is(.home,.charidx) .charbtn,:is(.home,.charidx) .charbtn:last-child:nth-child(odd){grid-column:auto;padding:calc(clamp(10.5rem,17cqi,14.5rem)*.17) 12px 16px;--cah:clamp(10.5rem,17cqi,14.5rem);--csk:1;overflow:visible;overflow-x:clip}}
}

/* ---------- Lethal: the feature banner (a minigame gets a poster, not a text box) ----------
   One framed panel: the fight as the art (room, the two creatures on its floor, the intent, the reticle, a fanned hand at the bottom edge) with the logo hung top centre, and a plate under
   it with the pitch, the puzzle number and the one button. The art is a link of its own (hidden from the tab order and from screen readers: the button is the real one). The creatures' layer
   is not clipped (the live canvas is larger than the still, creatureanim.css); the room and the hand clip inside their own boxes. */
.lethalbanner.dailybox,.lethalbanner.lb-half{position:relative;display:grid;grid-template-columns:minmax(0,1fr);gap:0;align-items:stretch;margin-top:calc(var(--stack,16px)*1.7);border-radius:16px;border:2px solid var(--line);background:#0b1418;
  box-shadow:0 10px 0 rgba(0,0,0,.5);isolation:isolate;transition:border-color .2s ease}
/* THE OUTLINE IS THE SITE'S BOX OUTLINE, NOT GOLD (Bean, 21 Sep 2026 evening, of all three daily cards: "make the outline colors for all 3 lethal, guess the card, and daily climb a
   dark low opacity grey instead of yellow, the yellow is overpowering. We have the standard greyish outline we use on boxes elsewhere on the site. Use that one. On hover said outline
   can get 20% brighter."). So the frame and the rule over the plate are .room's 2px solid var(--line); the gold frame (#7a5a24, 3px), its dark hairline and its gold halo are gone.
   Hover on the card: var(--line) about a fifth brighter (#35525d x 1.2 = #406270; colour only, nothing moves). */
.lethalbanner.dailybox:hover,.lethalbanner.lb-half:hover,.lethalbanner.dailybox:focus-within,.lethalbanner.lb-half:focus-within{border-color:#406270;border-color:color-mix(in srgb,var(--line),#fff 8%)}
.lethalbanner:hover>.lb-info,.lethalbanner:focus-within>.lb-info{border-top-color:#406270;border-top-color:color-mix(in srgb,var(--line),#fff 8%)}
.lb-stage{grid-area:1/1;position:relative;display:block;height:18.4rem;height:clamp(15.2rem,28cqi,20.8rem);border-radius:14px 14px 0 0;color:inherit;text-decoration:none;cursor:pointer;outline:0}
.lb-bg{position:absolute;inset:0;overflow:hidden;border-radius:inherit;background:#13241c}
.lb-bg img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 62%;filter:saturate(.95) brightness(.9);transition:filter .5s ease,scale 1.2s cubic-bezier(.16,1,.3,1)}
.lb-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(rgba(6,12,14,.36),rgba(6,12,14,0) 34%,rgba(6,12,14,0) 62%,rgba(4,8,10,.72) 100%),radial-gradient(120% 90% at 50% 40%,transparent 55%,rgba(0,0,0,.5) 100%)}
.lb-stage:hover .lb-bg img{filter:saturate(1) brightness(1);scale:1.025}
.lb-side{position:absolute;bottom:10%;display:block}
.lb-hero{left:7%}.lb-foe{right:7%}
.lb-cr{display:block;height:11.4rem;height:clamp(8.4rem,18.2cqi,13.4rem);width:auto;max-width:none;transform-origin:50% 100%;filter:drop-shadow(0 6px 6px rgba(0,0,0,.55));animation:breathe 3.4s ease-in-out infinite}
.lb-foe .lb-cr{animation-delay:-1.3s}
.lb-cr.ca-hide{animation:none} /* the live canvas has taken over (creatureanim.js hides the still) */
.lb-intent{position:absolute;left:42%;bottom:calc(100% + 8px);width:clamp(38px,5cqi,58px);height:auto;translate:-50% 0;filter:drop-shadow(0 2px 0 rgba(0,0,0,.6));animation:lbbob 2s ease-in-out infinite}
.lb-ret{position:absolute;inset:4% -10px -2%;pointer-events:none;opacity:.92;animation:lbret 2.4s ease-in-out infinite}
.lb-ret i{position:absolute;width:clamp(18px,2.6cqi,28px);aspect-ratio:1;background:var(--ret) center/contain no-repeat;filter:drop-shadow(3px 3px 0 rgba(0,0,0,.5))}
.lb-ret i:nth-child(1){left:0;top:0}.lb-ret i:nth-child(2){right:0;top:0;transform:rotate(90deg)}.lb-ret i:nth-child(3){right:0;bottom:0;transform:rotate(180deg)}.lb-ret i:nth-child(4){left:0;bottom:0;transform:rotate(270deg)}
.lb-handclip{position:absolute;inset:0;overflow:hidden;border-radius:inherit;pointer-events:none}
.lb-hand{position:absolute;left:50%;bottom:0;display:flex;translate:-50% 0;transition:translate .5s cubic-bezier(.16,1,.3,1)}
.lb-stage:hover .lb-hand{translate:-50% -9%;transition-duration:.12s}
.lb-c{flex:none;margin:0 -.75rem;transform-origin:50% 100%;transform:translateY(calc(47% + var(--y,0px))) rotate(var(--r,0deg))}
.lb-hand .card{--cw:7rem;--cw:clamp(5rem,11cqi,7.8rem);cursor:inherit}
.lb-logo{grid-area:1/1;align-self:start;justify-self:center;z-index:2;width:min(29rem,62%);margin:clamp(4px,1cqi,12px) 0 0;line-height:0;pointer-events:none}
.lethal-logo{display:block;width:100%;height:auto;overflow:visible;filter:drop-shadow(0 8px 10px rgba(0,0,0,.6))}
.lethal-logo .lgo-t{font-family:var(--font-d);font-weight:700;font-size:128px;letter-spacing:.07em;text-transform:uppercase;fill:url(#lgoink);stroke:#2a0d08;stroke-width:15px;paint-order:stroke;stroke-linejoin:round}
.lethal-logo .lgo-sw{filter:drop-shadow(0 5px 0 rgba(0,0,0,.35))}
.lethal-logo.sm{width:13rem;max-width:100%} /* lethalLogoHtml('sm'): the small cut for a page header (not used on the home page) */
.lb-info{grid-area:2/1;display:flex;align-items:center;gap:clamp(12px,2.6cqi,36px);padding:clamp(12px,1.7cqi,18px) clamp(14px,2.2cqi,26px);border-top:2px solid var(--line);border-radius:0 0 14px 14px;background:linear-gradient(#16262e,#0e191f);transition:border-color .2s ease}
.lb-copy{flex:1 1 0;margin:0;max-width:66ch;color:var(--muted)}
.lb-cta{flex:none;margin-left:auto;display:flex;align-items:center;gap:clamp(10px,1.6cqi,18px)}
.lb-no{font-family:var(--font-t);font-size:.95rem;color:var(--dim);white-space:nowrap}
.lethalbanner .bignum{display:inline-block;margin-left:.2em;font-size:1.55rem;vertical-align:-.08em}
.lb-act{display:flex;flex-direction:column;align-items:stretch;gap:3px}
.lb-status{min-height:1.25em;font-family:var(--font-t);font-size:.84rem;line-height:1.25;color:var(--dim);text-align:center}
.lb-play{min-width:11.75rem} /* as wide as "See today's result", so the label can change after load without moving anything */
@keyframes lbbob{0%,100%{translate:-50% 0}50%{translate:-50% -9px}}
@keyframes lbret{0%,100%{scale:1}50%{scale:1.035}}
@media (max-width:760px){
  .lb-stage{height:16.8rem}
  .lb-side{bottom:19%}.lb-hero{left:3%}.lb-foe{right:5%}
  .lb-intent{display:none} /* the logo hangs where the intent would float */
  .lb-ret{inset:4% -6px -2%}
  .lb-cr{height:clamp(6.6rem,31vw,9.4rem)}
  .lb-logo{width:min(19rem,78%)}
  .lb-info{flex-direction:column;align-items:stretch;text-align:left}
  .lb-cta{margin-left:0;justify-content:space-between}
  .lb-hand .card{--cw:clamp(4.6rem,20vw,6rem)}}
@media (prefers-reduced-motion:reduce){.lb-cr,.lb-intent,.lb-ret{animation:none}.lb-bg img,.lb-hand{transition:none}.lb-stage:hover .lb-bg img{scale:1}.lb-stage:hover .lb-hand{translate:-50% 0}}

/* ---------- the other two daily games: the Lethal banner's component at half width (Bean, 21 Sep 2026) ----------
   "style this game card the same as we do lethal, not as large obviously, it should occupy half of the width and the other half is attributed to the daily climb still. But it needs
   the height and more in detailed illustration like lethal has which has a big background, with the explanatory text below in a darker area and a button to play it. Same with daily
   climb so they are all matching." Markup: daily.js dailyGameCardHtml (section.lethalbanner.lb-half > a.lb-stage + div.lb-info): frame, art box, scrim, hover, info plate and
   button are the banner's own rules above; only what differs at half width is here. No status line under a card ("not needed"): the button's label carries the state (pages.js dailyTilesWire).
   One column when the container is under 40rem (a half would be too narrow for its art) and at phone width.
   SHORTER AND SLIMMER (Bean, the same evening: "Guess the card and daily climb are too tall. Make the image area 20% shorter. Then we need to make the text section less tall as
   well. The "Play" button needs to be on the right side next to the explanatory text for both of them. Shorten the text and simplify it so we can fit the button on the right.
   Make buttons less wide"). The stage is 0.8 of its first height (--sh) and everything in the art is sized FROM --sh (the hidden card is 80 % of it, the fanned cards 80 % of that,
   the climbers 56 %), so the picture is re-framed, not cropped, and stays framed at every width. The plate is the Lethal plate again: title + one or two short lines on the left
   (.lb-txt), the button on the right, centred; the button is as wide as its longest label ("Continue #N"), not a bar. Where even that cannot sit beside the text (a card
   under about 20rem), the row wraps and the button drops under the text. */
.homegames{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap,12px);margin-top:var(--stack,16px);align-items:stretch}
.lethalbanner.lb-half{margin-top:0;grid-template-rows:auto minmax(0,1fr)}
.lb-half .lb-stage{--sh:11.5rem;--sh:clamp(10.4rem,17.6cqi,12.3rem);height:var(--sh)}
.lb-half .lb-info{flex-direction:row;flex-wrap:wrap;align-items:center;gap:6px clamp(10px,1.6cqi,18px);padding:clamp(9px,1.2cqi,13px) clamp(14px,1.8cqi,20px) clamp(10px,1.3cqi,14px)}
.lb-txt{flex:1 1 10.5rem;min-width:0}
.lb-name{margin:0;font-family:var(--font-t);font-weight:700;font-size:clamp(1.15rem,1rem + .45cqi,1.32rem);line-height:1.1;letter-spacing:.005em;color:var(--gold-x);text-shadow:0 2px 0 rgba(0,0,0,.55)}
.lb-half .lb-copy{flex:none;max-width:none;margin-top:3px;font-size:.94rem;line-height:1.35}
.lb-half .lb-cta{flex:none;margin:0 0 0 auto}
.lb-half .lb-play{min-width:7.9rem}   /* "Continue #N", the longest of the Guess button's labels (pages.js dailyTilesWire), so a label change moves nothing; "Today's climb" is about as wide */
/* Guess the card: a warm-lit wall of real card paintings (img/ui/daily/guess_wall.webp, extract/daily_art.py), four real cards fanned on it and the hidden card standing in the
   middle, glowing. Bean: the old tile's "dark purple along with the icon being chains and a lock feel more negative than enticing ... make this more inviting". The hidden card is
   the game's Unknown card in bronze and gold (no locked grey, no padlock): its portrait is the game's gold question mark. All motion is transform / opacity / filter. */
.dg-wall img{object-position:50% 46%;filter:saturate(1) brightness(.95)}
.dg-wall::after{background:linear-gradient(rgba(10,6,3,.2),rgba(10,6,3,0) 30%,rgba(10,6,3,0) 58%,rgba(6,4,3,.7) 100%),radial-gradient(110% 95% at 50% 46%,transparent 50%,rgba(0,0,0,.55) 100%)}
.dg-fan{position:absolute;left:50%;bottom:0;display:flex;align-items:flex-end;translate:-50% 0;transition:translate .5s cubic-bezier(.16,1,.3,1)}
.lb-stage:hover .dg-fan{translate:-50% -4%;transition-duration:.12s}
.dg-c{position:relative;flex:none;margin:0 calc(var(--sh)*-.068);transform-origin:50% 100%;transform:translateY(calc(13% + var(--y,0px))) rotate(var(--r,0deg))}
.dg-fan .card{--cw:calc(var(--sh)*.455);cursor:inherit}
.dg-c:not(.dg-mid) .card{filter:brightness(.82) saturate(.92)}
.dg-mid{z-index:3;margin:0 calc(var(--sh)*-.02);transform:translateY(-7%)}
.dg-mid .card{--cw:calc(var(--sh)*.569);filter:drop-shadow(0 0 14px rgba(255,196,84,.55))}
.dg-mid::before{content:"";position:absolute;inset:-48% -105%;z-index:-1;border-radius:50%;background:radial-gradient(closest-side,rgba(255,226,146,.9),rgba(255,198,88,.62) 36%,rgba(255,160,48,.27) 63%,rgba(255,140,30,0) 100%);animation:dgglow 3.6s ease-in-out infinite}
.dg-myst .frame{filter:hue-rotate(32deg) saturate(.75) brightness(.62)}
.dg-myst .portrait{background:radial-gradient(circle at 50% 52%,#a8681c 0,#54290a 58%,#221004 100%)}
.dg-myst .portrait img{object-fit:contain;opacity:1;padding:7% 0 5%;box-sizing:border-box;filter:drop-shadow(0 0 calc(10*var(--u)) rgba(255,214,120,.85));animation:dgq 3.6s ease-in-out infinite}
.dg-myst .title{color:#fff6e2}
.dg-myst .desc .tx{font-size:calc(46*var(--u));letter-spacing:.08em;color:#ffd978;text-shadow:0 0 calc(12*var(--u)) rgba(255,190,80,.6)}
@keyframes dgglow{0%,100%{opacity:.78;scale:1}50%{opacity:1;scale:1.06}}
@keyframes dgq{0%,100%{translate:0 0}50%{translate:0 -4%}}
/* Daily Climb: the Spire from the game's Ascender's Bane painting (1000x760) and the five characters at its foot. The export shows all five lit; on the client today's climber
   steps forward and the rest fall back (daily.js climbHubAfter: .has-today / .on), which is the card's whole "status". */
.dg-spire img{inset:0 auto 0 0;width:118%;max-width:none;object-position:50% 38%;filter:saturate(1) brightness(.94)}   /* wider than the stage and anchored left: the Spire stands at three quarters, the climbers get the left */
.dg-spire::after{background:linear-gradient(rgba(12,4,8,.3),rgba(12,4,8,0) 32%,rgba(12,4,8,0) 52%,rgba(8,3,5,.82) 100%),radial-gradient(120% 90% at 50% 40%,transparent 55%,rgba(0,0,0,.5) 100%)}
.dg-climbers{position:absolute;left:0;right:26%;bottom:5%;display:flex;justify-content:center;align-items:flex-end;pointer-events:none;transition:translate .5s cubic-bezier(.16,1,.3,1)}
.lb-stage:hover .dg-climbers{translate:0 -3%;transition-duration:.12s}
.dg-ch{flex:none;display:block;height:calc(var(--sh)*.56);width:auto;max-width:none;margin:0 calc(var(--sh)*-.072);transform-origin:50% 100%;filter:drop-shadow(0 5px 5px rgba(0,0,0,.6));transition:filter .4s ease,scale .4s cubic-bezier(.16,1,.3,1)}
.dg-ch:nth-child(1),.dg-ch:nth-child(5){scale:.9}.dg-ch:nth-child(3){scale:1.06;z-index:2}
.dg-climbers.has-today .dg-ch{filter:brightness(.6) saturate(.6) drop-shadow(0 5px 5px rgba(0,0,0,.6))}
.dg-climbers.has-today .dg-ch.on{z-index:3;scale:1.14;filter:drop-shadow(0 0 12px rgba(255,190,90,.55)) drop-shadow(0 5px 5px rgba(0,0,0,.6))}
@media (max-width:760px){
  .homegames{grid-template-columns:minmax(0,1fr)}
  .lb-half .lb-stage{--sh:clamp(11.7rem,30.4vw,13.6rem)}}
@supports (container-type:inline-size){@container home (max-width:40rem){
  .homegames{grid-template-columns:minmax(0,1fr)}
  .lb-half .lb-stage{--sh:clamp(10.7rem,35.2cqi,12.8rem)}}}
@media (prefers-reduced-motion:reduce){.dg-mid::before,.dg-myst .portrait img{animation:none}.dg-fan,.dg-climbers,.dg-ch{transition:none}.lb-stage:hover .dg-fan{translate:-50% 0}.lb-stage:hover .dg-climbers{translate:0 0}}
/* the illustrated link tile (pages.js artTileHtml): the directory cards below */
.gamecard.homegame{flex-direction:row;align-items:center;gap:14px;padding:10px 14px 10px 10px}
.gamecard.homegame img{flex:none;width:6.4rem;height:auto;aspect-ratio:380/288;border-radius:6px;box-shadow:0 3px 0 rgba(0,0,0,.5)}
/* the menu paintings carry a peach frame (about 1.4 % of the width, 2 px in from the edge); a card painting used as a tile gets the same frame drawn here */
.gamecard.homegame img.hg-framed{box-sizing:border-box;border:2px solid #f4d2a9;object-fit:cover}
.gamecard.homegame .hg-t{display:flex;flex-direction:column;gap:4px;min-width:0}
.gamecard.homegame .gct{font-size:1.12rem}
/* directory cards (pages.js HOME_DIRS): the same tile */
/* ONE EVEN GRID OF EQUAL TILES (wave 4 overview H1, 21 Sep 2026; app/wp1pages.js HOME_DIRS_W4): cards, relics, potions, powers, enemies, events. "All cards" used to span
   the row, 70 % of it an empty band, and Powers and Events had no tile. Six tiles, so three, two or one to a row always ends on a full row; the grid stretches a row's
   tiles to one height. Cards stays first (Bean, 17 Sep 2026: "it holds more authority") and keeps his line. */
.homedirs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap,12px)}
.homedirs:not(.even)>.homegame:first-child{grid-column:1/-1}   /* the old lead tile: only where pages.js still draws the four-tile block (wp1pages.js absent) */
@media (max-width:760px){.homedirs{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:560px){.homedirs{grid-template-columns:minmax(0,1fr)}}
@supports (container-type:inline-size){
  @container home (max-width:50rem){.homedirs{grid-template-columns:repeat(2,minmax(0,1fr))}}
  @container home (max-width:35rem){.homedirs{grid-template-columns:minmax(0,1fr)}}}

/* ---------- the store banner: buy the game on Steam (one outbound link, the whole banner) ----------
   The Ironclad's character-select painting is the backdrop on the right, fading into the panel; the game's logo, one line of our own and the gold plate on the left. The plate is a span
   (the banner is the link), so it takes the hover look from the banner. Phone: the painting on top, the text under it. */
.steambanner{position:relative;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,56%);align-items:center;min-height:11.5rem;margin-top:var(--stack,16px);border-radius:12px;overflow:hidden;
  border:2px solid rgba(255,255,255,.12);background:linear-gradient(90deg,#15090a,#1c0a09 55%,#120404);box-shadow:0 6px 0 rgba(0,0,0,.45);color:var(--text);text-decoration:none;isolation:isolate;transition:border-color .15s}
.steambanner:hover,.steambanner:focus-visible{border-color:var(--gold);text-decoration:none}
.steambanner .stm-art{grid-area:1/2;align-self:stretch;position:relative;min-height:100%;z-index:-1}
.steambanner .stm-art img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:60% 30%;-webkit-mask-image:linear-gradient(90deg,transparent,#000 48%);mask-image:linear-gradient(90deg,transparent,#000 48%);transition:scale 1.2s cubic-bezier(.16,1,.3,1),filter .5s ease;filter:brightness(.92)}
.steambanner:hover .stm-art img{scale:1.04;filter:brightness(1.05)}
.steambanner .stm-body{grid-area:1/1;display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:clamp(14px,2vw,22px) clamp(16px,2.4vw,28px)}
.steambanner .stm-logo{display:block;width:clamp(9.5rem,17vw,13rem);height:auto;filter:drop-shadow(0 3px 0 rgba(0,0,0,.55))}
.steambanner .stm-name{font-family:var(--font-d);font-size:1.8rem;line-height:1.05}
.steambanner .stm-line{max-width:46ch;color:var(--muted);line-height:1.4}
/* wave 5 (Bean, 22 Sep 2026: "Move the "Get it on steam" button to the right side, in the middle height wise within the banner"): the plate is a direct child of the banner in
   the art's column, at its right end, centred on the banner's height; the art keeps its z-index -1 so the plate sits over it */
.steambanner .stm-btn{grid-area:1/2;justify-self:end;align-self:center;margin:0 clamp(16px,2.4vw,28px) 0 0;position:relative;z-index:1}
.steambanner .stm-btn img{width:1.15em;height:1.15em;filter:brightness(0);opacity:.78}
.steambanner:hover .stm-btn,.steambanner:focus-visible .stm-btn{transform:scale(1.05);--v:1.25;transition-duration:.05s}
.steambanner:hover .stm-btn::after,.steambanner:focus-visible .stm-btn::after{opacity:1;transition-duration:.05s}
.steambanner:focus-visible{outline:0}
/* the plate centred on the LINE's height, same place across (Bean, 23 Sep 2026: "move the get it on steam button down to fall in the center of that info text height wise,
   however it needs to stay in the same spot horizontally"): above the phone the body lets its logo and line into the banner's grid (display:contents) as rows 2 and 3 between
   two spacer rows that share the free height (the group stays centred as before), the art spans all four rows, the plate sits in the line's row at the right end */
@media (min-width:641px){
  .steambanner{grid-template-rows:minmax(clamp(14px,2vw,22px),1fr) auto auto minmax(clamp(14px,2vw,22px),1fr)}
  .steambanner .stm-body{display:contents}
  .steambanner .stm-logo,.steambanner .stm-name{grid-area:2/1;justify-self:start;margin:0 0 10px clamp(16px,2.4vw,28px)}
  .steambanner .stm-art{grid-area:1/2/-1/3}
  /* the line and the plate swap places (Bean, 25 Sep 2026: "can we swap the places of the text and button here please"): the plate under the logo on the left, the line
     at the right end over the painting, right-aligned, with a dark halo so it reads on the Ironclad */
  .steambanner .stm-btn{grid-area:3/1;justify-self:start;margin:0 0 0 clamp(16px,2.4vw,28px)}
  .steambanner .stm-line{grid-area:3/2;justify-self:end;text-align:right;margin:0 clamp(16px,2.4vw,28px) 0 12px;position:relative;z-index:1;color:#f1e4cf;
    text-shadow:0 2px 0 rgba(0,0,0,.75),0 0 10px rgba(0,0,0,.9),0 0 22px rgba(0,0,0,.8)}}
@media (max-width:640px){
  .steambanner{grid-template-columns:minmax(0,1fr)}
  .steambanner .stm-art{grid-area:1/1;min-height:0;aspect-ratio:924/400}
  .steambanner .stm-art img{object-position:60% 25%;-webkit-mask-image:linear-gradient(#000 55%,transparent);mask-image:linear-gradient(#000 55%,transparent)}
  .steambanner .stm-body{display:contents}
  .steambanner .stm-logo,.steambanner .stm-name{grid-area:2/1;justify-self:start;margin:4px 16px 8px}
  .steambanner .stm-btn{grid-area:3/1;justify-self:start;margin:0 16px 10px}   /* phone: the plate under the logo (the swap), its own row */
  .steambanner .stm-line{grid-area:4/1;margin:0 16px 16px}}
@media (prefers-reduced-motion:reduce){.steambanner .stm-art img{transition:none}.steambanner:hover .stm-art img{scale:1}.steambanner:hover .stm-btn,.steambanner:focus-visible .stm-btn{transform:none}}

/* ---------- the patch strip: what the newest patch changed (the section header carries the icon and the link to all notes) ---------- */
.patchstrip{display:flex;align-items:center;padding:10px 16px;border-radius:12px;background:rgba(0,0,0,.3);border:2px solid rgba(255,255,255,.1);transition:border-color .15s}
.patchstrip:hover{border-color:var(--gold)}
.patchstrip .ps-main{flex:1 1 0;min-width:0;display:flex;align-items:center;gap:12px;color:var(--text);text-decoration:none}
.patchstrip .ps-t{display:flex;flex-direction:column;gap:2px;min-width:0}
.patchstrip .ps-t b{font-family:var(--font-t);font-size:1.12rem;line-height:1.15;color:var(--gold-x,var(--gold))}
.patchstrip .ps-t .st{font-size:.86rem;color:var(--dim);line-height:1.3}
.patchstrip .ps-main:hover b{text-decoration:underline}
/* the Purchase strip under a page that is not the homepage: the same section, 10 px lower than before (wave 5, Bean, 22 Sep 2026: "move the "purchase today" title and below
   section a little lower on all pages, it shouldn't be so close to the main page content, maybe 10px lower. Besides the homepage, leave it where it is there": was + 8px) */
.page:not(.home)>.buysec{margin-top:calc(var(--stack,16px)*2 + 18px)}
.buysec+.credit{margin-top:var(--stack,16px)}
/* SOLID CHARACTER TILES WITH THE GAME'S HP BAR (Bean, 23 Sep 2026, on the home page's character row: "I think we should remove the hp bars unless you want to make them
   look like character hp bars in game. And once we do that, because thats more illustrative we would have to make the boxes more solid. We should also remove the text
   "80 hp" and "87-88 cards" above that too"; then "Why was the hover animation changed on character homepage boxes? Hover does no meaningful brightness change now + the
   hp bars werent added"). The fact line is gone (pages_characters.js charTileHtml); the colour bar became the combat screen's HP bar under the feet (the fight frames'
   recipe, enemyturns.css .lm-hp: the bg nine-slice, the red fill nine-slice inside it, the number in cream ringed in dark red, overflowing the bar as in the game), full
   at the character's Max HP, at .55 CSS px per game px. The tile is opaque now (the character box's floor: colour rising from the bottom over the dark plate, the 6 px
   ledge); the rim and the hover are style.css's own again: a faint rim at rest that lights up in the character's colour and lifts on hover. */
.home .charfan>.charbtn,.home .charfan>.charbtn:last-child:nth-child(odd){box-shadow:0 6px 0 rgba(0,0,0,.45);
  background:radial-gradient(130% 85% at 50% 100%,color-mix(in srgb,var(--c,#888) 44%,transparent),transparent 74%),linear-gradient(#111d23,#0a1317)}
.home .charbtn .cb-hp{--u:.55px;position:relative;display:block;flex:none;align-self:center;width:min(calc(276*var(--u)),100%);height:calc(16*var(--u));margin:calc(10*var(--u)) auto calc(6*var(--u))}   /* under the name now: a little air above, less below (it closes the tile) */
.home .charbtn:last-child:nth-child(odd) .cb-hp{margin-left:0}
@container home (min-width:40.01rem){.home .charbtn:last-child:nth-child(odd) .cb-hp{margin-left:auto}}
.home .charbtn .cb-hp::before{content:"";position:absolute;inset:0 var(--u);border:0 solid transparent;border-width:0 calc(9*var(--u));border-image:url(/img/ui/combat/hp/bg.webp) 0 9 fill/0 calc(9*var(--u)) stretch;pointer-events:none}
.home .charbtn .cb-hp .fill{position:absolute;inset:calc(3*var(--u)) calc(5*var(--u));z-index:1;overflow:hidden;clip-path:polygon(0 50%,calc(5*var(--u)) 0,calc(100% - 5*var(--u)) 0,100% 50%,calc(100% - 5*var(--u)) 100%,calc(5*var(--u)) 100%)}
.home .charbtn .cb-hp .fill::before{content:"";position:absolute;left:0;right:0;top:calc(-4*var(--u));bottom:calc(-4*var(--u));border:0 solid transparent;border-width:0 calc(6*var(--u));border-image:url(/img/ui/combat/hp/fill_red.webp) 0 6 fill/0 calc(6*var(--u)) stretch}
.home .charbtn .cb-hp>b{position:absolute;left:50%;top:50%;translate:-50% -50%;z-index:2;font-family:var(--font-t);font-weight:700;font-size:calc(26*var(--u));line-height:1;letter-spacing:var(--u);color:#FFF6E2;white-space:nowrap;
  --or:calc(3.5*var(--u));--oc:#900000;text-shadow:calc(var(--or)*1) calc(var(--or)*0) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*0) calc(var(--or)*1) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*-1) calc(var(--or)*0) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*0) calc(var(--or)*-1) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*0.5) calc(var(--or)*0) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*0) calc(var(--or)*0.5) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*-0.5) calc(var(--or)*0) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*-0.354) 0 var(--oc),calc(var(--or)*0) calc(var(--or)*-0.5) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*-0.354) 0 var(--oc),calc(6*var(--u)) calc(4*var(--u)) 0 rgba(0,0,0,.25)}
/* the HP bar and the name are the tile's top layer (Bean, 23 Sep 2026: "When you hover on necrobinder his shadow covers the hp bar, please put the hp bars as the top
   layer"): the hover wraps the still in art3d's .a3d (z-index 3, its floor shadow inside), which painted over the text block that follows it */
:is(.home,.charidx) .charbtn .cb-t{z-index:4}

/* ===== app/i18n.css ===== */
/* wave 6 languages (app/i18n.js): a static page in a stored language keeps its English column hidden until it is drawn in that language
   (the class comes from the head script ssr.js writes and leaves with app/i18n.js, or after a few seconds by itself) */
html.i18n-wait #main{visibility:hidden}

/* ===== app/icons3d.css ===== */
/* ===== relic / potion / power icons: hover tilt, lift, ground shadow, outline rim and sheen (core.js tiltTo + iconFx; docs/wave2/icons3d.md) =====
   The same state machine as the cards (style.css "3D tilt", docs/wave2/card-3d.md): --tx/--ty are the pointer's offset from the icon centre (-1..1), written by
   tiltTo on the hovered icon only. .hov grows the icon (the separate `scale` property, eased over --hov-in) and, once .tilt is on, turns it by --tilt-x/--tilt-y
   with an 80 ms tracking transition; the <img> lifts by --lift on Z above a blurred black copy of itself (.shd) that slides against the tilt, the game's outline
   sprite (.rim, relics and potions) glows behind it in the halo colour, and a light band masked to the icon's own alpha (.sheen) sweeps with the pointer.
   Leaving drops .hov/.tilt; .settle keeps preserve-3d, the layer transitions and the effect elements displayed for the 550 ms expo-out return, then the icon is
   flat again and the effects are display:none: no masks, no 3D, no will-change on an icon at rest. --ico (the img's currentSrc) and --rim (the outline sprite)
   are set inline by iconFx, so the shadow and the sheen follow whatever image the <img> shows. The Lethal HUD (.lz), the hand and the sandbox picker never tilt
   (tiltTo returns for them); reduced motion and touch get the grow only. */
:is(.relic,.potion,.power){--tilt-x:18deg;--tilt-y:20deg;--lift:9px;--persp:420px;--sheen:.38;--hov-scale:1.14;--rim-c:#f5c65b}
.big :is(.relic,.potion,.power){--tilt-x:12deg;--tilt-y:14deg;--lift:18px;--persp:700px;--hov-scale:1.08}
/* rim colours follow the halo per rarity (style.css); potions are blue-white; powers have no outline sprite and keep the halo alone */
.relic.r-shop{--rim-c:#3fd8cf}.relic.r-rare{--rim-c:#f7c948}.relic.r-ancient{--rim-c:#ff7d3b}
.potion{--rim-c:#bfe4ff}
.potion .halo{background:radial-gradient(circle,rgba(170,220,255,.5),transparent 65%)}
/* hover-in: above the neighbours, the grow eased over --hov-in; transform 0s so the first tilt frame is not eased up from flat */
:is(.relic,.potion,.power):is(.hov,:focus-visible){z-index:6;scale:var(--hov-scale);transition:transform 0s,scale var(--hov-in,.22s) cubic-bezier(.2,.7,.3,1)}
/* before app.js attaches, and for touch (no .hov from the pointer handler): the same grow on plain :hover */
:is(.relic,.potion,.power):hover:not(.hov):not(.settle){scale:var(--hov-scale)}
:is(.relic,.potion,.power).settle{z-index:5}
:is(.relic,.potion,.power):is(.hov,.settle){transform-style:preserve-3d}
:is(.relic,.potion,.power).hov.tilt{transform:perspective(var(--persp)) rotateX(calc(var(--ty,0) * -1 * var(--tilt-x))) rotateY(calc(var(--tx,0) * var(--tilt-y)));transition:transform .08s linear,scale var(--hov-in,.22s) cubic-bezier(.2,.7,.3,1)}
/* the icon lifts on Z, instantly with the grow; the .5s return transition exists only while hovered or settling */
:is(.relic,.potion,.power):is(.hov,.settle) img{transition:transform .5s cubic-bezier(.16,1,.3,1)}
:is(.relic,.potion,.power).hov.tilt img{transform:translateZ(var(--lift));transition:transform 0s}
/* effect elements (iconFx): display:none at rest, shown by .hov/.settle at opacity 0 (flushed by tiltTo before .tilt) so their fades run */
:is(.relic,.potion,.power) :is(.shd,.rim,.sheen){display:none;position:absolute;inset:6%;opacity:0;pointer-events:none}
:is(.relic,.potion,.power):is(.hov,.settle) :is(.shd,.rim,.sheen){display:block}
/* ground shadow: a black copy of the icon (its own alpha as the mask, no filter: a blur cost 4 ms a frame in software rendering) at Z 0, sliding against the tilt while the icon floats above it */
:is(.relic,.potion,.power) .shd{z-index:0;background:#000;-webkit-mask:var(--ico,none) center/contain no-repeat;mask:var(--ico,none) center/contain no-repeat;translate:0 3px;transition:opacity .35s,translate .5s cubic-bezier(.16,1,.3,1)}
:is(.relic,.potion,.power).hov.tilt .shd{opacity:.5;translate:calc(var(--tx,0) * -6px) calc(4px + var(--ty,0) * -6px);transition:opacity .12s,translate .08s linear}
/* rim: the game's outline sprite, masked and filled with the rim colour; the glow is a second, slightly larger copy at low opacity (::after) plus the halo behind, no drop-shadow filter */
:is(.relic,.potion) .rim{z-index:1;transition:opacity .35s,transform .5s cubic-bezier(.16,1,.3,1)}
:is(.relic,.potion) .rim i,:is(.relic,.potion) .rim::after{content:"";display:block;position:absolute;inset:0;background:var(--rim-c);-webkit-mask:var(--rim,none) center/contain no-repeat;mask:var(--rim,none) center/contain no-repeat}
:is(.relic,.potion) .rim::after{inset:-7%;opacity:.45}
:is(.relic,.potion).hov.tilt .rim{opacity:1;transform:translateZ(4px);transition:opacity .16s,transform 0s}
/* sheen: a soft light band masked to the icon's alpha, angled and shifted by the pointer like the card sheen, just above the lifted icon */
:is(.relic,.potion,.power) .sheen{z-index:3;background:linear-gradient(calc(118deg + var(--tx,0) * 24deg - var(--ty,0) * 18deg),rgba(255,246,214,0) calc(20% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,246,214,var(--sheen)) calc(46% + (var(--tx,0) + var(--ty,0)) * 18%),rgba(255,246,214,0) calc(72% + (var(--tx,0) + var(--ty,0)) * 18%));-webkit-mask:var(--ico,none) center/contain no-repeat;mask:var(--ico,none) center/contain no-repeat;transition:opacity .35s,transform .5s cubic-bezier(.16,1,.3,1)}
:is(.relic,.potion,.power).hov.tilt .sheen{opacity:1;transform:translateZ(calc(var(--lift) + 1px));transition:opacity .12s,transform 0s}

/* ===== app/lang.css ===== */
/* ===== the language picker in the footer, the flags, the first-visit note (wave 6, UI language agent; app/lang_ui.js, docs/wave6/languages.md) =====
   The picker is the seed finder's dropdown (seedfinder.css .sf-dd*: the dark field, the 2 px ink border, the chevron, the teal focus ring, the list under the button),
   in its own classes so the two never pull on each other. A flag is a span whose picture travels inside this stylesheet (the block between the @@FLAGS markers is
   written by tools/gen_langflags.js from src/img/flags/*.svg), so the footer's flag is in the first frame and the export needs no extra files. Windows draws no
   flag emoji, so the flags are our own simplified drawings, all 3:2, rounded here, with a thin dark inner edge and a faint light outer one (white flags on
   the dark footer, dark stripes on it too). */
.lang-flag{display:inline-block;flex:none;width:24px;height:16px;border-radius:3px;background:#555 center/100% 100% no-repeat;box-shadow:inset 0 0 0 1px rgba(0,0,0,.42),0 0 0 1px rgba(255,255,255,.12);vertical-align:middle}
/* the footer's top panel: the logo, the site line, then the picker at the right end (its own line when the panel wraps) */
.foot-top .lang-box{display:flex;flex-direction:column;gap:6px;flex:none;margin-left:auto}
.foot-top:has(.lang-box) .foot-tag{flex-basis:20rem}
.foot-top .lang-box>.hx{margin:0;font-family:var(--font-t);font-size:.76rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--gold)}
.lang-dd{position:relative;display:inline-flex;min-width:0}
.lang-ddb{position:relative;display:flex;align-items:center;gap:10px;width:100%;min-width:12.5rem;min-height:42px;margin:0;padding:0 38px 0 12px;border:2px solid #0a1216;border-radius:9px;background:#0f1c22;box-shadow:inset 0 2px 0 rgba(0,0,0,.35);color:#fff6e2;font-family:var(--font-t);font-size:1rem;line-height:1.2;text-align:left;cursor:pointer;transition:border-color .12s}
.lang-ddb::after{content:"";position:absolute;right:15px;top:50%;width:8px;height:8px;margin-top:-6px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);rotate:45deg;transition:rotate .15s,margin .15s}
.lang-dd.open>.lang-ddb::after{rotate:225deg;margin-top:-2px}
.lang-ddb:hover{border-color:var(--line-l)}
.lang-ddb:focus-visible,.lang-dd.open>.lang-ddb{border-color:color-mix(in srgb,var(--teal) 45%,#0a1216);outline:0;box-shadow:inset 0 2px 0 rgba(0,0,0,.35),0 0 0 3px rgba(63,216,207,.14)}
.lang-ddv{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.lang-ddp{position:absolute;left:0;top:calc(100% + 6px);z-index:40;display:flex;flex-direction:column;min-width:100%;width:max-content;max-width:min(30rem,calc(100vw - 16px));border:2px solid #0a1216;border-radius:10px;background:#0f1c22;box-shadow:0 14px 30px rgba(0,0,0,.65),0 0 0 1px rgba(255,255,255,.07);overflow:hidden}
.lang-ddp.rt{left:auto;right:0}
.lang-ddl{position:relative;max-height:min(27rem,64vh);overflow-y:auto;overscroll-behavior:contain;padding:4px 0 6px;outline:0}
.lang-ddo{display:flex;align-items:center;gap:12px;min-height:2.75rem;padding:6px 16px 6px 12px;color:#e9dcc0;font-family:var(--font-t);font-size:1.05rem;line-height:1.25;cursor:pointer;white-space:nowrap}
.lang-ddo .lang-flag{width:27px;height:18px}
.lang-ddt{flex:none}
.lang-ddo small{overflow:hidden;text-overflow:ellipsis;color:var(--dim);font-size:.88rem;font-weight:400}
.lang-ddo.act{background:rgba(63,216,207,.15);color:#fff}
.lang-ddo[aria-selected="true"]{color:var(--gold-x);font-weight:700}
.foot-top:has(.lang-dd.open){position:relative;z-index:6}
/* the note after an automatic pick: the toast's plate (style.css .toast), bottom right, once */
.lang-note{position:fixed;right:max(16px,env(safe-area-inset-right,0px));bottom:calc(18px + env(safe-area-inset-bottom,0px));z-index:85;display:flex;align-items:center;gap:12px;max-width:calc(100vw - 32px);padding:10px 10px 10px 14px;border:2px solid var(--line-l);border-radius:10px;background:var(--panel-l);box-shadow:0 12px 28px rgba(0,0,0,.55);color:#fff;font-family:var(--font-t);opacity:0;translate:0 14px;transition:opacity .2s,translate .2s}
.lang-note.on{opacity:1;translate:0 0}
.lang-note .lang-nt{display:flex;flex-direction:column;gap:1px;min-width:0}
.lang-note .lang-nt b{font-weight:700;color:var(--gold-x);line-height:1.2}
.lang-note .lang-nt small{color:var(--muted);font-size:.82rem;line-height:1.25}
.lang-nen{display:inline-flex;align-items:center;gap:8px;flex:none;min-height:36px;padding:0 12px;border:2px solid #0a1216;border-radius:8px;background:#0f1c22;color:#fff6e2;font-family:var(--font-t);font-size:.95rem;cursor:pointer}
.lang-nen:hover,.lang-nen:focus-visible{border-color:color-mix(in srgb,var(--teal) 45%,#0a1216);outline:0}
.lang-nen .lang-flag{width:21px;height:14px}
.lang-nx{position:relative;flex:none;width:32px;height:32px;padding:0;border:0;border-radius:7px;background:none;cursor:pointer}
.lang-nx::before,.lang-nx::after{content:"";position:absolute;left:50%;top:50%;width:14px;height:2px;margin:-1px 0 0 -7px;border-radius:1px;background:var(--muted);rotate:45deg}
.lang-nx::after{rotate:-45deg}
.lang-nx:hover,.lang-nx:focus-visible{background:rgba(255,255,255,.08);outline:0}
@media (max-width:640px){.lang-note{left:12px;right:12px;bottom:calc(12px + env(safe-area-inset-bottom,0px));max-width:none}.lang-note .lang-nt{flex:1}}
@media (max-width:700px){.foot-top .lang-box{margin-left:0}}
@media (hover:none) and (pointer:coarse){.lang-ddo{min-height:3rem}}
@media (prefers-reduced-motion:reduce){.lang-note{transition:none}.lang-ddb::after{transition:none}}
/* @@FLAGS START (tools/gen_langflags.js writes this block; edit the drawings there) */
.lang-flag.f-en{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3CclipPath id='t'%3E%3Cpath d='M18 12h18v12zv12H0zH0V0zV0h18z'/%3E%3C/clipPath%3E%3Cpath fill='%23012169' d='M0 0h36v24H0z'/%3E%3Cpath d='M0 0l36 24M36 0 0 24' stroke='%23FFF' stroke-width='4.8'/%3E%3Cpath d='M0 0l36 24M36 0 0 24' clip-path='url(%23t)' stroke='%23C8102E' stroke-width='3.2'/%3E%3Cpath d='M18 0v24M0 12h36' stroke='%23FFF' stroke-width='8'/%3E%3Cpath d='M18 0v24M0 12h36' stroke='%23C8102E' stroke-width='4.8'/%3E%3C/svg%3E")}
.lang-flag.f-de{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23000' d='M0 0h36v8H0z'/%3E%3Cpath fill='%23D00' d='M0 8h36v8H0z'/%3E%3Cpath fill='%23FFCE00' d='M0 16h36v8H0z'/%3E%3C/svg%3E")}
.lang-flag.f-fr{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%230055A4' d='M0 0h12v24H0z'/%3E%3Cpath fill='%23FFF' d='M12 0h12v24H12z'/%3E%3Cpath fill='%23EF4135' d='M24 0h12v24H24z'/%3E%3C/svg%3E")}
.lang-flag.f-it{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23009246' d='M0 0h12v24H0z'/%3E%3Cpath fill='%23F4F5F0' d='M12 0h12v24H12z'/%3E%3Cpath fill='%23CE2B37' d='M24 0h12v24H24z'/%3E%3C/svg%3E")}
.lang-flag.f-pl{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23FFF' d='M0 0h36v12H0z'/%3E%3Cpath fill='%23DC143C' d='M0 12h36v12H0z'/%3E%3C/svg%3E")}
.lang-flag.f-ru{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23FFF' d='M0 0h36v8H0z'/%3E%3Cpath fill='%230039A6' d='M0 8h36v8H0z'/%3E%3Cpath fill='%23D52B1E' d='M0 16h36v8H0z'/%3E%3C/svg%3E")}
.lang-flag.f-tr{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23E30A17' d='M0 0h36v24H0z'/%3E%3Ccircle cx='12' cy='12' r='6' fill='%23FFF'/%3E%3Ccircle cx='13.5' cy='12' r='4.8' fill='%23E30A17'/%3E%3Cpath fill='%23FFF' d='M18.5 12L20.57 11.33L20.57 9.15L21.85 10.91L23.93 10.24L22.65 12L23.93 13.76L21.85 13.09L20.57 14.85L20.57 12.67z'/%3E%3C/svg%3E")}
.lang-flag.f-ja{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23FFF' d='M0 0h36v24H0z'/%3E%3Ccircle cx='18' cy='12' r='7.2' fill='%23BC002D'/%3E%3C/svg%3E")}
.lang-flag.f-ko{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23FFF' d='M0 0h36v24H0z'/%3E%3Ccircle cx='18' cy='12' r='6' fill='%230047A0'/%3E%3Cpath fill='%23CD2E3A' d='M13.01 8.67A6 6 0 0 1 22.99 15.33A3 3 0 0 0 18 12A3 3 0 0 1 13.01 8.67z'/%3E%3Cg fill='%23000'%3E%3Cg transform='translate(8.85 5.9) rotate(-56.31)'%3E%3Cpath d='M-3 -2h6v1h-6z'/%3E%3Cpath d='M-3 -0.5h6v1h-6z'/%3E%3Cpath d='M-3 1h6v1h-6z'/%3E%3C/g%3E%3Cg transform='translate(27.15 5.9) rotate(56.31)'%3E%3Cpath d='M-3 -2h2.75v1h-2.75zM.25 -2h2.75v1h-2.75z'/%3E%3Cpath d='M-3 -0.5h6v1h-6z'/%3E%3Cpath d='M-3 1h2.75v1h-2.75zM.25 1h2.75v1h-2.75z'/%3E%3C/g%3E%3Cg transform='translate(8.85 18.1) rotate(56.31)'%3E%3Cpath d='M-3 -2h6v1h-6z'/%3E%3Cpath d='M-3 -0.5h2.75v1h-2.75zM.25 -0.5h2.75v1h-2.75z'/%3E%3Cpath d='M-3 1h6v1h-6z'/%3E%3C/g%3E%3Cg transform='translate(27.15 18.1) rotate(-56.31)'%3E%3Cpath d='M-3 -2h2.75v1h-2.75zM.25 -2h2.75v1h-2.75z'/%3E%3Cpath d='M-3 -0.5h2.75v1h-2.75zM.25 -0.5h2.75v1h-2.75z'/%3E%3Cpath d='M-3 1h2.75v1h-2.75zM.25 1h2.75v1h-2.75z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")}
.lang-flag.f-th{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23A51931' d='M0 0h36v24H0z'/%3E%3Cpath fill='%23F4F5F8' d='M0 4h36v16H0z'/%3E%3Cpath fill='%232D2A4A' d='M0 8h36v8H0z'/%3E%3C/svg%3E")}
.lang-flag.f-pt-BR{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23009C3B' d='M0 0h36v24H0z'/%3E%3Cpath fill='%23FFDF00' d='M3 12 18 2.9 33 12 18 21.1z'/%3E%3CclipPath id='g'%3E%3Ccircle cx='18' cy='12' r='6'/%3E%3C/clipPath%3E%3Ccircle cx='18' cy='12' r='6' fill='%23002776'/%3E%3Cpath clip-path='url(%23g)' d='M10.6 13.2A15 15 0 0 1 25.6 13' fill='none' stroke='%23FFF' stroke-width='1.2'/%3E%3C/svg%3E")}
.lang-flag.f-zh-Hans{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 20'%3E%3Cpath fill='%23EE1C25' d='M0 0h30v20H0z'/%3E%3Cpath fill='%23FFDE00' d='M5 2L5.67 4.07L7.85 4.07L6.09 5.35L6.76 7.43L5 6.15L3.24 7.43L3.91 5.35L2.15 4.07L4.33 4.07zM9.14 2.51L9.62 1.97L9.25 1.34L9.91 1.63L10.39 1.08L10.33 1.8L11 2.09L10.29 2.25L10.22 2.97L9.85 2.35zM11.01 4.14L11.66 3.82L11.56 3.1L12.07 3.62L12.72 3.3L12.38 3.95L12.88 4.47L12.17 4.34L11.83 4.99L11.73 4.27zM11.04 6.73L11.76 6.7L11.96 6L12.21 6.68L12.94 6.66L12.37 7.1L12.62 7.79L12.01 7.38L11.44 7.83L11.64 7.13zM9.22 8.38L9.9 8.63L10.35 8.06L10.32 8.79L11 9.05L10.3 9.24L10.26 9.96L9.87 9.36L9.16 9.55L9.62 8.98z'/%3E%3C/svg%3E")}
.lang-flag.f-es-ES{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23AA151B' d='M0 0h36v24H0z'/%3E%3Cpath fill='%23F1BF00' d='M0 6h36v12H0z'/%3E%3C/svg%3E")}
.lang-flag.f-es-419{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 36 24'%3E%3Cpath fill='%23006847' d='M0 0h12v24H0z'/%3E%3Cpath fill='%23FFF' d='M12 0h12v24H12z'/%3E%3Cpath fill='%23CE1126' d='M24 0h12v24H24z'/%3E%3Cpath d='M14.6 12.6q3.4 5 6.8 0' fill='none' stroke='%233F8A3A' stroke-width='1'/%3E%3Cpath fill='%237A4A21' d='M15.6 12.4q.2-3.6 2.6-4.6 1.4-.5 2 .6-1 .1-1.2.9 1.6.5 1.4 2.6-.3 1.9-2.4 2.3-1.7.2-2.4-1.8z'/%3E%3Cpath fill='%234E9A43' d='M17.4 14.2h1.2v2h-1.2z'/%3E%3C/svg%3E")}
/* @@FLAGS END */

/* ===== app/lethal.css ===== */
/* ===== Lethal: the game's combat screen (owned by app/daily.js; notes in docs/wave2/lethal.md) =====
   Everything is scoped to .lz (the #lboard room) and overrides the older .lstage/.hand lethal rules in style.css
   by specificity or by bundle order (app/*.css follow style.css). Motion numbers follow the game's combat nodes:
   hand fan from HandPosHelper, hover instant / 0.5 s expo-out return, energy orb layers spinning at 30 and 60 deg/s,
   damage numbers 1.3 -> 1 scale drifting up and fading, card play 0.2 s cubic-out to the play spot at 0.8 scale.
   Wave 3 (docs/wave3/lethal-play.md): cards are dragged like the game's (NMouseCardPlay / NHandCardHolder / NTargetingArrow); the dragged, parked and flying
   card is a fixed-position copy in <body> (.lz-ghost), the arrow and the trail are fixed overlays, so those rules are not scoped to .lz. */
.lz{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;overflow:visible;container:lz/inline-size}

/* ---------- the room: player left, enemy right, both on the floor ---------- */
.lz .lstage{position:relative;display:grid;grid-template-columns:1fr 1fr;align-items:end;justify-items:center;gap:0;min-height:21rem;padding:3.8rem 6% 1.3rem;border-radius:14px;border:0;background:none;overflow:visible;isolation:isolate}
.lz .lz-bg{position:absolute;inset:0;z-index:-1;border-radius:14px;overflow:hidden;background:#0b1418;border:1px solid rgba(255,255,255,.08)}
.lz .lz-bg::before{content:"";position:absolute;inset:-4%;background:var(--room,none) center 32%/cover no-repeat;filter:saturate(.8) brightness(.55)}
.lz .lz-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(rgba(8,14,18,.3),rgba(8,14,18,.08) 40%,rgba(4,8,10,.78) 100%),radial-gradient(70% 38% at 50% 100%,rgba(0,0,0,.55),transparent 70%)}
/* the game's combat room (docs/wave3/lethal-rooms.md): the art is already the game's own lighting, so it is only taken down a little for the hud's contrast and the
   creatures' silhouettes; daily.js lzRoomFit sets --bgs (auto <height>) and --bgy (the top offset) so the art's ground line lies under the creatures' feet */
.lz .lz-bg.fit::before{inset:0;background:var(--room,none) 50% var(--bgy,32%)/var(--bgs,cover) no-repeat;filter:saturate(.92) brightness(.8);-webkit-mask:linear-gradient(#000 calc(var(--bgb,200%) - 5rem),transparent var(--bgb,200%));mask:linear-gradient(#000 calc(var(--bgb,200%) - 5rem),transparent var(--bgb,200%))}
/* ONE ROOM (daily.js lzHudFit): the room layer reaches under the hud; below the art's bottom edge the floor's own tone carries on */
.lz .lz-bg{bottom:calc(-1 * var(--hudh,0px));background:var(--floor,#0b1418)}
.lz .lz-bg.fit::after{background:linear-gradient(rgba(8,14,18,.22),rgba(8,14,18,0) 35%,rgba(4,8,10,.6) 100%),radial-gradient(70% 38% at 50% 100%,rgba(0,0,0,.42),transparent 70%)}
/* screen-reader-only live region (the drag / aim prompts; the old "HP to go" readout is gone) */
.lz-sr{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
/* the practice chip: the top panel's character icon + name */
.lz-shareout{display:block;width:100%;margin-top:10px}.lz-shareout[hidden]{display:none}
.lz .lstage .side{position:relative;display:flex;flex-direction:column;align-items:center;gap:0;min-width:0;max-width:100%}
.lz .lstage .side.player{justify-self:start;margin-left:4%}
.lz .lstage .side.enemy{justify-self:end;margin-right:4%;cursor:pointer}
.lz .lstage .side.enemy:focus-visible{outline:0}
.lz .lstage .side.enemy:focus-visible .lz-body img.creature{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) drop-shadow(0 0 0 #fff) drop-shadow(0 0 3px #fff)}
.lz .lz-body{position:relative;transform-origin:50% 100%}
.lz .lstage .side .lz-body img.creature{display:block;max-height:12.5rem;max-width:min(100%,17rem);width:auto;object-fit:contain;transform-origin:50% 100%;filter:drop-shadow(0 6px 6px rgba(0,0,0,.55));animation:breathe 3.4s ease-in-out infinite}
.lz .lstage .side.enemy .lz-body img.creature{animation-delay:-1.3s}
.lz .lz-shadow{position:absolute;left:14%;bottom:-.55rem;z-index:-1;width:72%;height:1.1rem;border-radius:50%;pointer-events:none;background:radial-gradient(closest-side,rgba(0,0,0,.62),rgba(0,0,0,0));transition:opacity .4s}
/* the play pile: PileType.Play is the middle of the screen, 100 px up; here the middle of the room between the two creatures */
.lz .lz-spot{position:absolute;left:50%;bottom:36%;width:0;height:0;pointer-events:none}
.lz .lz-fx{position:absolute;inset:0;z-index:50;pointer-events:none;overflow:visible}

/* the intent over the enemy's head (the enemy pages' markup and sizes: THE GAME'S COMBAT UI below), bobbing like NIntent */
.lz .lz-intent{position:absolute;left:50%;bottom:calc(100% - var(--crown,0px) + 8px);translate:-50% 0;display:flex;align-items:flex-end;gap:0;font-family:var(--font-t);font-weight:700;line-height:1;color:#FFF6E2;white-space:nowrap;z-index:3;animation:lzbob 3.2s ease-in-out infinite;pointer-events:none}
@keyframes lzbob{0%,100%{translate:-50% 0}50%{translate:-50% -4px}}

/* targeting reticle (NSelectionReticle): the game's corner sprite at the four corners with its half-black shadow; on select it fades in over 0.2 s while the
   scale goes 0.9 -> 1 in 0.5 s expo-out, on deselect it fades over 0.2 s out to 1.05. The enemy's shows while the arrow is on it (or an all-enemies card is
   armed), the player's while a self card is held over the play zone */
.lz .lz-ret{position:absolute;inset:4% -10px;opacity:0;scale:1.05;pointer-events:none;transition:opacity .2s ease-out,scale .2s ease-out}
.lz .lstage .side.target .lz-ret{opacity:1;scale:1;transition:opacity .2s linear;animation:lzret .5s cubic-bezier(.16,1,.3,1)}
.lz .lz-ret i{position:absolute;width:28px;height:28px;background:var(--ret) center/contain no-repeat;filter:drop-shadow(4px 3px 0 rgba(0,0,0,.5))}
.lz .lz-ret i:nth-child(1){left:0;top:0}.lz .lz-ret i:nth-child(2){right:0;top:0;transform:rotate(90deg)}.lz .lz-ret i:nth-child(3){right:0;bottom:0;transform:rotate(180deg)}.lz .lz-ret i:nth-child(4){left:0;bottom:0;transform:rotate(270deg)}
@keyframes lzret{from{scale:.9}to{scale:1}}
.lz .lstage .side.enemy.aim{cursor:crosshair}
.lz .lstage .side.enemy.target .lz-body img.creature{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) drop-shadow(0 0 10px rgba(255,90,70,.75))}

/* ---------- THE GAME'S COMBAT UI (Bean, 23 Sep 2026: "We need every fight / the block and attack to be sized the same as the game"; the enemy and fight pages got
   these pieces that day, app/enemyturns.css, and the Lethal board uses the same pieces at the same proportions). Every piece is its size in the game's
   1920 x 1080 combat scene times --gu, the board's one UI unit: CSS px per game px, taken from the hand card (the fan card is the game's 0.8 card, 240 game px
   wide, drawn --cw wide: 8.4rem / 240 = .035rem; .03rem on a phone). The creatures keep their sizes; only a bar's width follows its creature (--hbx: the
   hitbox in the creature's own unit, daily.js lzHpFit). Numbers from scenes/combat/health_bar.tscn, intent.tscn, power.tscn, creature_state_display.tscn:
   HP BAR     hitbox + 24 wide, 16 tall, 7 under the feet: the dark back (health_bar_bg), the fill strip 3 down and 5 in with pointed ends (the Mask). Inside it,
              back to front as in the scene: the ORANGE middleground (HpMiddleground, modulate 1, .5, 0: it waits 1 s, then runs down over 1 s expo-out; at once
              on the way up), next turn's Poison (79C03C), the fill (F1373E, 3B6FA3 with Block and the pale stroke) and Doom from the left (the doom_bar
              shader's purples). Each is the white health_bar_fill modulated: its rows are 1, .855 and .686 of the colour. Label Kreon Bold 24 cream, a 16 px
              outline 900000 (1B3045 with Block, 76FF40 on 074700 when Poison kills, FB8DFF on 2D1263 when Doom does), shadow (6, 4) .25, spilling over the bar.
   BLOCK      the shield 60 x 60, 12 in from the bar's left, 26 over its top; its number 24, outline 14 0B5569, shadow (4, 4) .25.
   INTENT     a 64 x 64 slot, the icon 72 x 72, the number 22 over its lower left with a 12 px black outline at .5, "x4" at 18; slots 10 apart; the moving
              intents step through the game's frame strip at 15 frames a second.
   POWERS     40 x 40 icons in 48 px steps from the hitbox's left, 25 under the feet; the amount 18 right-aligned 4 px past the icon, outline 10 1F1A15.
   NAMEPLATE  Kreon 24 cream, 31 under the feet on the soft plate (black .66), only while the creature is hovered or aimed at (the powers fade to .5).
   Font sizes are the game's x 1.09 and an outline's visible radius .22 of its outline_size, as measured for the fight pages (enemyturns.css). ---------- */
.lz{--gu0:.035rem;--gu:var(--gu0)}
.lz :is(.lz-hp .lbl,.lz-blk b,.pn-num,.pi-what,.lz-pow b,.pw-pow>b){--ring:calc(var(--or)*1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*1.0) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*-1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-1.0) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*0.5) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*-0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*-0.354) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-0.5) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*-0.354) 0 var(--oc)}
.lz .lz-plate{position:relative;z-index:3;width:calc(var(--hbx,9rem) + 24*var(--gu));margin-top:calc(7*var(--gu));translate:var(--pshift,0px) 0}
.lz .lz-hp{position:relative;width:100%;height:calc(16*var(--gu))}
.lz .lz-hp::before,.lz .lz-hp::after{content:"";position:absolute;inset:0 var(--gu);border:0 solid transparent;border-width:0 calc(9*var(--gu));border-image:url(/img/ui/combat/hp/bg.webp) 0 9 fill/0 calc(9*var(--gu)) stretch;pointer-events:none}
.lz .lz-hp::after{display:none;border-image-source:url(/img/ui/combat/hp/stroke.webp)}
.lz .lz-hp.blocked::after{display:block}
.lz .lz-hp .strip{position:absolute;inset:calc(3*var(--gu)) calc(5*var(--gu));z-index:1;overflow:hidden;clip-path:polygon(0 50%,calc(5*var(--gu)) 0,calc(100% - 5*var(--gu)) 0,100% 50%,calc(100% - 5*var(--gu)) 100%,calc(5*var(--gu)) 100%)}
.lz .lz-hp .strip>i{position:absolute;left:0;top:calc(-4*var(--gu));bottom:calc(-4*var(--gu));width:0;background:linear-gradient(var(--c1) 0 56.25%,var(--c2) 56.25% 62.5%,var(--c3) 62.5%)}
.lz .lz-hp .strip>.mid{--c1:#FF7F00;--c2:#DA6D00;--c3:#AF5700;transition:width 1s cubic-bezier(.16,1,.3,1) 1s}
.lz .lz-hp .strip>.pois{left:var(--pl,0%);width:var(--pw,0%);--c1:#79C03C;--c2:#67A433;--c3:#538429}
.lz .lz-hp .strip>.fill{width:var(--fw,100%);--c1:#F1373E;--c2:#CC2F35;--c3:#A5262B}
.lz .lz-hp.blocked .strip>.fill{--c1:#3B6FA3;--c2:#325E8A;--c3:#284C70}
.lz .lz-hp .strip>.doom{width:var(--dw,0%);background:radial-gradient(40% 90% at 22% 30%,#834181,transparent),radial-gradient(35% 80% at 68% 70%,#834181,transparent),linear-gradient(90deg,#4D2987,#5A0B6F 50%,#4D2987)}
.lz .lz-hp .lbl{position:absolute;left:50%;top:50%;translate:-50% -50%;z-index:2;font-family:var(--font-t);font-weight:700;font-size:calc(26*var(--gu));line-height:1;letter-spacing:var(--gu);color:#FFF6E2;white-space:nowrap;--or:calc(3.5*var(--gu));--oc:#900000;text-shadow:var(--ring),calc(6*var(--gu)) calc(4*var(--gu)) 0 rgba(0,0,0,.25)}
.lz .lz-hp.blocked .lbl{--oc:#1B3045}
.lz .lz-hp.plethal .lbl{color:#76FF40;--oc:#074700}
.lz .lz-hp.dlethal .lbl{color:#FB8DFF;--oc:#2D1263}
.lz .lz-blk{position:absolute;left:calc(-18*var(--gu));top:calc(-26*var(--gu));z-index:4;width:calc(60*var(--gu));height:calc(60*var(--gu));display:grid;place-items:center}
.lz .lz-blk img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain}
.lz .lz-blk b{position:relative;left:calc(.5*var(--gu));top:calc(3*var(--gu));font-family:var(--font-t);font-weight:700;font-size:calc(26*var(--gu));line-height:1;color:#FFF6E2;--or:calc(3.1*var(--gu));--oc:#0B5569;text-shadow:var(--ring),calc(4*var(--gu)) calc(4*var(--gu)) 0 rgba(0,0,0,.25)}
.lz .lz-blk.pulse{animation:lzpulse .35s ease-out}
@keyframes lzpulse{0%{scale:1}40%{scale:1.4}100%{scale:1}}
.lz .lz-powers{display:flex;flex-wrap:wrap;gap:0 calc(8*var(--gu));width:calc(var(--hbx,9rem) + 25*var(--gu));min-height:calc(44*var(--gu));margin:calc(2*var(--gu)) 0 0 calc(12*var(--gu));white-space:nowrap;transition:opacity .2s}
.lz .lz-pow{position:relative;display:block;width:calc(40*var(--gu));height:calc(40*var(--gu));margin-bottom:calc(4*var(--gu));cursor:help}
.lz .lz-pow img{display:block;width:100%;height:100%;object-fit:contain}
.lz .lz-pow b{position:absolute;right:calc(-4*var(--gu));top:calc(21*var(--gu));font-family:var(--font-t);font-weight:700;font-size:calc(19.5*var(--gu));line-height:1;color:#FFF6E2;--or:calc(2.2*var(--gu));--oc:#1F1A15;text-shadow:var(--ring),calc(3*var(--gu)) calc(3*var(--gu)) 0 rgba(0,0,0,.19)}
.lz .lz-powers.pop .lz-pow{animation:lzpulse .35s ease-out}
.lz .lz-name{position:absolute;left:50%;top:calc(24*var(--gu));translate:-50% 0;z-index:1;height:calc(28*var(--gu));padding:0 calc(6*var(--gu));display:flex;align-items:center;font-family:var(--font-t);font-weight:400;font-size:calc(26*var(--gu));line-height:1;white-space:nowrap;color:#FFF6E2;text-shadow:calc(2*var(--gu)) var(--gu) 0 rgba(0,0,0,.25);opacity:0;transition:opacity .2s;pointer-events:none}
.lz .lz-name::before{content:"";position:absolute;left:calc(-51*var(--gu));right:calc(-50*var(--gu));top:calc(-21*var(--gu));bottom:calc(-20*var(--gu));z-index:-1;background:rgba(0,0,0,.66);-webkit-mask:url(/img/ui/combat/combat_nameplate_background.webp) center/100% 100% no-repeat;mask:url(/img/ui/combat/combat_nameplate_background.webp) center/100% 100% no-repeat}
.lz .lstage .side:is(:has(>.lz-body:hover),:focus-visible,.target)>.lz-plate>.lz-name{opacity:1;transition-duration:.15s}
.lz .lstage .side:is(:has(>.lz-body:hover),:focus-visible,.target)>.lz-plate>.lz-powers{opacity:.5;transition-duration:.15s}
.lz .lz-intent .pi{position:relative;display:inline-flex;align-items:center;gap:calc(6*var(--gu));min-width:calc(64*var(--gu));min-height:calc(64*var(--gu));padding-left:calc(64*var(--gu));margin:0}
.lz .lz-intent .pi+.pi{margin-left:calc(-10*var(--gu))}
.lz .lz-intent .pi:has(>.pi-what:not(.pw-defend))+.pi{margin-left:calc(8*var(--gu))}
.lz .lz-intent .pi-what.pw-defend{display:none}
.lz .lz-intent .pi>img{position:absolute;left:calc(-6*var(--gu));top:calc(50% - 37*var(--gu));width:calc(72*var(--gu));height:calc(72*var(--gu));object-fit:contain}
.lz .lz-intent img.ia{object-fit:none;object-position:-9999px 0;background:var(--ia) 0 0/calc(var(--n)*100%) 100% no-repeat;animation:lzia calc(var(--n)*1s/15) steps(var(--n)) infinite}
@keyframes lzia{to{background-position:calc(var(--n)*-72*var(--gu)) 0}}
.lz .lz-intent .pn-num{position:absolute;left:calc(2*var(--gu));top:calc(50% + 8*var(--gu));z-index:1;font-size:calc(24*var(--gu));line-height:1;font-weight:700;color:#FFF6E2;white-space:nowrap;--or:calc(2.6*var(--gu));--oc:rgba(0,0,0,.5);text-shadow:var(--ring)}
.lz .lz-intent .pn-num i{font-style:normal;font-size:calc(19.5*var(--gu))}
.lz .lz-intent .pi-what{display:flex;flex-wrap:wrap;align-items:center;gap:calc(2*var(--gu)) calc(8*var(--gu));max-width:calc(230*var(--gu));font-size:calc(19.5*var(--gu));line-height:1.1;font-weight:700;color:#FFF6E2;--or:calc(2.2*var(--gu));--oc:#1F1A15;text-shadow:var(--ring),calc(3*var(--gu)) calc(3*var(--gu)) 0 rgba(0,0,0,.19)}
.lz .lz-intent .pi-what>span{display:inline-flex;align-items:center;gap:calc(4*var(--gu));white-space:nowrap}
.lz .lz-intent .pi-what img{width:calc(32*var(--gu));height:calc(32*var(--gu))}
.lz .lz-intent .pi-what .pw-pow{position:relative;display:inline-flex;align-items:flex-start;height:calc(64*var(--gu));cursor:help;pointer-events:auto}
.lz .lz-intent .pi-what .pw-pow+.pw-pow{margin-left:calc(10*var(--gu))}
.lz .lz-intent .pi-what .pw-pow>img{order:1;flex:none;margin:calc(12*var(--gu)) 0 0 calc(7*var(--gu));width:calc(40*var(--gu));height:calc(40*var(--gu));object-fit:contain}
.lz .lz-intent .pi-what .pw-pow>b{order:0;flex:none;position:relative;margin-top:calc(40*var(--gu));z-index:1;font-size:calc(24*var(--gu));--or:calc(2.6*var(--gu));--oc:rgba(0,0,0,.5);text-shadow:var(--ring)}
.lz .lz-intent .pi-what .pw-n{display:none}
/* a new number or icon (Weak played on it, Strength gained) pops in the way NIntent refreshes */
.lz .lz-intent.pop{animation:lzbob 3.2s ease-in-out infinite,lzipop .35s cubic-bezier(.34,1.56,.64,1)}
@keyframes lzipop{from{scale:.6;opacity:.3}}
@media (prefers-reduced-motion:reduce){.lz .lz-intent img.ia{animation:none}.lz .lz-hp .mid{transition:none}}

/* ---------- creature motion ---------- */
.lz .lstage .side.player .lz-body.lunge{animation:lzlunge .34s cubic-bezier(.3,0,.2,1)}
.lz .lstage .side.enemy .lz-body.lunge{animation:lzlungeL .34s cubic-bezier(.3,0,.2,1)}
.lz .lz-body.hit{animation:lzhit .3s ease-out}
.lz .lstage .side .lz-body.hit img.creature{animation:breathe 3.4s ease-in-out infinite,lzflash .3s ease-out}
.lz .lstage .side .lz-body.buff img.creature{animation:breathe 3.4s ease-in-out infinite,lzbuff .45s ease-out}
.lz .lstage .side .lz-body.debuff img.creature{animation:breathe 3.4s ease-in-out infinite,lzdebuff .45s ease-out}
/* with a creature animation mounted (app/creatureanim.js: a canvas.ca-canvas right after the still, which becomes img.ca-hide once frames draw) the hidden still
   stops breathing, every filter effect above also goes on the canvas (it carries the same drop shadow), a hit with a hurt animation is the white flash alone
   (.flash; the animation is the motion), and the die animation replaces the css fall */
.lz .lstage .side .lz-body img.creature.ca-hide{animation:none}
.lz .lstage .side .lz-body.hit .ca-canvas,.lz .lstage .side .lz-body.flash .ca-canvas,.lz .lstage .side .lz-body.flash img.creature{animation:lzflash .3s ease-out}
.lz .lstage .side .lz-body.buff .ca-canvas{animation:lzbuff .45s ease-out}
.lz .lstage .side .lz-body.debuff .ca-canvas{animation:lzdebuff .45s ease-out}
.lz .lstage .side.enemy.target .lz-body .ca-canvas{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) drop-shadow(0 0 10px rgba(255,90,70,.75))}
.lz .lstage .side.enemy:focus-visible .lz-body .ca-canvas{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) drop-shadow(0 0 0 #fff) drop-shadow(0 0 3px #fff)}
/* a power card arriving in the player (NCardFlyPowerVfx ends in a medium, short screen shake) */
.lz .lstage.shake{animation:lzshake .22s ease-out}
@keyframes lzshake{0%,100%{translate:0 0}20%{translate:-4px 2px}45%{translate:4px -2px}70%{translate:-2px 1px}}
@keyframes lzlunge{0%{translate:0 0}35%{translate:64px -8px}60%{translate:52px -4px}100%{translate:0 0}}
@keyframes lzlungeL{0%{translate:0 0}35%{translate:-64px -8px}60%{translate:-52px -4px}100%{translate:0 0}}
@keyframes lzhit{0%{translate:0 0}20%{translate:-9px 0}45%{translate:8px 0}70%{translate:-5px 0}100%{translate:0 0}}
@keyframes lzflash{0%{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) brightness(2.4) contrast(1.2)}100%{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) brightness(1)}}
@keyframes lzbuff{0%{filter:drop-shadow(0 0 14px #FFA518) brightness(1.5)}100%{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) brightness(1)}}
@keyframes lzdebuff{0%{filter:drop-shadow(0 0 14px #EE82EE) brightness(1.3) hue-rotate(40deg)}100%{filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) brightness(1)}}
/* slash / burst flash over the struck creature */
.lz .lz-slash{position:absolute;left:50%;top:44%;width:120%;height:12px;margin-left:-60%;border-radius:6px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.95) 40%,#fff 50%,rgba(255,255,255,.95) 60%,transparent);box-shadow:0 0 18px 4px rgba(255,255,255,.55);transform-origin:50% 50%;transform:rotate(var(--ang,-38deg)) scaleX(0);animation:lzslash .24s ease-out forwards;pointer-events:none;mix-blend-mode:screen;z-index:2}
.lz .lz-slash.dagger{height:6px;width:80%;margin-left:-40%;animation-duration:.18s}
.lz .lz-slash.heavy{width:70%;height:70%;margin-left:-35%;top:15%;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.95),rgba(255,200,120,.6) 40%,transparent 70%);box-shadow:none;transform:scale(.3);animation:lzburst .3s ease-out forwards}
@keyframes lzslash{0%{transform:rotate(var(--ang,-38deg)) scaleX(0);opacity:1}45%{transform:rotate(var(--ang,-38deg)) scaleX(1);opacity:1}100%{transform:rotate(var(--ang,-38deg)) scaleX(1.1);opacity:0}}
@keyframes lzburst{0%{transform:scale(.3);opacity:1}100%{transform:scale(1.4);opacity:0}}
/* block gained: a blue ring swells off the creature */
.lz .lz-ring{position:absolute;left:50%;top:55%;width:64%;aspect-ratio:1;translate:-50% -50%;border-radius:50%;border:3px solid #8fd8ff;box-shadow:0 0 22px 6px rgba(63,143,255,.55),inset 0 0 22px rgba(143,216,255,.45);animation:lzring .38s ease-out forwards;pointer-events:none;z-index:2}
@keyframes lzring{0%{scale:.5;opacity:0}30%{opacity:1}100%{scale:1.35;opacity:0}}
/* damage numbers (NDamageNumVfx): red, 1.3 -> 1 scale, drift up, fade */
.lz-num{position:absolute;transform:translate(-50%,-50%) rotate(var(--tilt,0deg));font-family:var(--font-t);font-weight:700;font-size:2.3rem;line-height:1;white-space:nowrap;color:#FF5555;text-shadow:0 2px 0 #000,-2px 0 0 #3a0000,2px 0 0 #3a0000,0 -2px 0 #3a0000,0 0 10px rgba(0,0,0,.8);animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards,lzcream .6s ease-out .1s forwards}
.lz-num.blk{color:#87CEEB;font-size:1.4rem;text-shadow:0 2px 0 #000,0 0 8px #1B3045;animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards}
.lz-num.pois{color:#7FFF00;text-shadow:0 2px 0 #000,0 0 8px #074700;animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards}
.lz-num.still{animation:none;opacity:1}
@keyframes lznum{0%{opacity:0;translate:0 12px;scale:.7}12%{opacity:1;scale:1.3}100%{opacity:0;translate:0 -64px;scale:1}}
@keyframes lzcream{to{color:#FFF6E2}}
/* lethal: the enemy falls and fades */
.lz .lstage .side.enemy.dying .lz-body{animation:lzdie .45s ease-in forwards}
.lz .lstage .side.enemy.dying:not(.hasdie) .lz-body img.creature,.lz .lstage .side.enemy.dead:not(.hasdie) .lz-body img.creature{filter:grayscale(1) brightness(.4);animation:none;transition:filter .4s}
.lz .lstage .side.enemy.dead .lz-body{opacity:.18;translate:0 14px;rotate:-6deg}
.lz .lstage .side.enemy.dying .lz-shadow,.lz .lstage .side.enemy.dead .lz-shadow{opacity:.3}
.lz .lstage .side.enemy.dead,.lz .lstage .side.enemy.dying{cursor:default}
.lz .lstage .side.enemy.dead .lz-intent,.lz .lstage .side.enemy.dying .lz-intent{display:none}
@keyframes lzdie{0%{opacity:1;translate:0 0;rotate:0deg}30%{translate:-10px -6px;rotate:2deg}100%{opacity:.18;translate:0 14px;rotate:-6deg}}
/* .hasdie: the skeleton's own die animation plays and holds its last frame, so no css fall and no grey-out; the corpse dims once the win panel is up */
.lz .lstage .side.enemy.dying.hasdie .lz-body{animation:none}
.lz .lstage .side.enemy.dead.hasdie .lz-body{opacity:.45;translate:none;rotate:none;transition:opacity .6s}
/* defeat: the player goes down the same way (the skeleton's die animation held, or the css fall on the still) and stays down until Retry */
.lz .lstage .side.player.dying .lz-body{animation:lzdieP .5s ease-in forwards}
.lz .lstage .side.player.dying:not(.hasdie) .lz-body img.creature,.lz .lstage .side.player.dead:not(.hasdie) .lz-body img.creature{filter:grayscale(1) brightness(.4);animation:none;transition:filter .4s}
.lz .lstage .side.player.dead .lz-body{opacity:.2;translate:0 14px;rotate:8deg}
.lz .lstage .side.player.dying.hasdie .lz-body{animation:none}
.lz .lstage .side.player.dead.hasdie .lz-body{opacity:.55;translate:none;rotate:none;transition:opacity .6s}
.lz .lstage .side.player.dying .lz-shadow,.lz .lstage .side.player.dead .lz-shadow{opacity:.3}
@keyframes lzdieP{0%{opacity:1;translate:0 0;rotate:0deg}30%{translate:10px -6px;rotate:-2deg}100%{opacity:.2;translate:0 14px;rotate:8deg}}
.lz .lz-banner{position:absolute;left:50%;top:38%;translate:-50% -50%;font-family:var(--font-d);font-weight:700;font-size:3.2rem;line-height:1;color:var(--gold);text-shadow:0 3px 0 rgba(0,0,0,.7),0 0 24px rgba(245,198,91,.45);letter-spacing:.04em;animation:lzbanner 1.4s cubic-bezier(.2,.8,.3,1) forwards;pointer-events:none}
@keyframes lzbanner{0%{opacity:0;scale:.6}18%{opacity:1;scale:1.08}30%{scale:1}80%{opacity:1}100%{opacity:0;translate:-50% -70%}}
/* NEnemyTurnBanner (daily.js lzTurnBanner): Spectral Bold 96 EFC851, outline 24 black at .5, across the room (stage + hud) at 43.3 % of its height; the label
   grows from 2x to 1x over 0.75 s expo-out while the banner fades in over 1.3 s expo-out, then the label goes red (modulate: the gold times red) and the banner
   fades out, both over 1 s */
.lz .lz-turnban{position:absolute;left:0;right:0;top:calc((100% + var(--hudh,0px))*.433);height:0;display:grid;place-items:center;z-index:60;pointer-events:none;animation:lztbA 2.3s linear forwards}
.lz .lz-turnban span{display:block;font-family:var(--font-d);font-weight:700;font-size:calc(96*var(--gu));line-height:1;white-space:nowrap;color:#EFC851;--or:calc(5.3*var(--gu));--oc:rgba(0,0,0,.5);text-shadow:var(--ring);animation:lztbS .75s cubic-bezier(.16,1,.3,1) both,lztbR 1s cubic-bezier(.16,1,.3,1) 1.3s forwards}
.lz .lz-turnban span{--ring:calc(var(--or)*1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*1.0) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*-1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-1.0) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*0.5) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*-0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*-0.354) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-0.5) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*-0.354) 0 var(--oc)}
.lz .lz-turnban.still{animation:none;opacity:1}.lz .lz-turnban.still span{animation:none}
@keyframes lztbA{0%{opacity:0}10%{opacity:.8}56.5%{opacity:1}100%{opacity:0}}
@keyframes lztbS{from{scale:2}to{scale:1}}
@keyframes lztbR{to{color:#EF0000}}
/* the enemy's intent goes as it makes its move */
.lz .lstage .side.enemy .lz-intent{transition:opacity .3s}
.lz .lstage .side.enemy.acting .lz-intent{opacity:0}

/* ---------- the bottom hud at the game's sizes and places (scenes/combat/combat_ui.tscn, combat_piles_container.tscn, draw_pile.tscn, exhaust_pile.tscn,
   end_turn_button.tscn, energy_counters/*.tscn), in the board's UI unit --gu (THE GAME'S COMBAT UI above). In the game's 1920 x 1080 screen the energy counter
   is 128 x 128 at (100, 828), the draw pile 80 x 80 in the bottom-left corner (15 in), the discard pile in the bottom-right corner, the exhaust pile over it
   (from 280 to 200 up) and End Turn (a 220 x 90 button drawn as a 256 x 128 plate) left of the exhaust pile. The board is narrower than the game's screen
   (1600 of its units at 1345 px against 1920), so each group stands in a column (the pile under the orb, the two piles under End Turn): 128 and 256 wide
   instead of the game's 213 and 324, which leaves the fan 90 px more. The room behind them is the combat room itself (lzHudFit carries it under the hud) ---------- */
.lz .lz-hud{position:relative;z-index:2;display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"left hand right";align-items:end;gap:0 8px;margin-top:-1.4rem;padding:0 clamp(14px,calc(48*var(--gu)),28px) clamp(8px,calc(22*var(--gu)),14px)}
/* the hud stands off the board's edges (Bean, 23 Sep 2026: "These need to be a proper distance from the edges of the board it is bad now": the piles, the orb and End
   Turn sat flush on the board's left, right and bottom edges); the room behind still reaches the edges, lzHudFit measures the padded hud */
.lz .lz-hl{grid-area:left;display:flex;flex-direction:column;align-items:center;gap:calc(29*var(--gu));width:calc(128*var(--gu));padding-bottom:calc(15*var(--gu))}
.lz .lz-hl>.lz-pile{align-self:flex-start}
.lz .lz-hr{grid-area:right;display:flex;flex-direction:column;align-items:flex-end;gap:calc(20*var(--gu));width:calc(256*var(--gu));padding-bottom:calc(15*var(--gu))}
.lz .lz-hr .lz-piles{gap:calc(20*var(--gu))}
.lz :is(.lz-orb .n,.lz-pile b,.lz-end .t){--ring:calc(var(--or)*1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*1.0) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*0.924) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*0.707) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*0.383) 0 var(--oc),calc(var(--or)*-1.0) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*-0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*-0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-1.0) 0 var(--oc),calc(var(--or)*0.383) calc(var(--or)*-0.924) 0 var(--oc),calc(var(--or)*0.707) calc(var(--or)*-0.707) 0 var(--oc),calc(var(--or)*0.924) calc(var(--or)*-0.383) 0 var(--oc),calc(var(--or)*0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*0.0) calc(var(--or)*0.5) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*0.354) 0 var(--oc),calc(var(--or)*-0.5) calc(var(--or)*0.0) 0 var(--oc),calc(var(--or)*-0.354) calc(var(--or)*-0.354) 0 var(--oc),calc(var(--or)*-0.0) calc(var(--or)*-0.5) 0 var(--oc),calc(var(--or)*0.354) calc(var(--or)*-0.354) 0 var(--oc)}
/* energy orb: the character's layered counter sprite; layers 2 and 3 turn at 30 and 60 deg/s, slower when empty. Label "3/3" Kreon Bold 36, outline 16 in
   the character's dark colour (--eo), shadow (3, 2) */
.lz .lz-orb{position:relative;width:calc(128*var(--gu));height:calc(128*var(--gu));display:grid;place-items:center;filter:drop-shadow(0 calc(3*var(--gu)) 0 rgba(0,0,0,.55))}
.lz .lz-orb img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;pointer-events:none}
.lz .lz-orb .rot{animation:lzspin 12s linear var(--ph,0s) infinite}
.lz .lz-orb .rot2{animation:lzspin 6s linear var(--ph,0s) infinite}
.lz .lz-orb.empty .rot{animation-duration:72s}.lz .lz-orb.empty .rot2{animation-duration:36s}
.lz .lz-orb.empty img:not(.shine){filter:brightness(.5) saturate(.6)}
/* the shine sprite is white on opaque black (additive in the game). The orb's drop-shadow filter isolates its blending, so screen only works over the orb's own
   layers: clip the sprite to the disc, or its black corners flash as a square on every energy change */
.lz .lz-orb .shine{opacity:0;scale:1.3;mix-blend-mode:screen;clip-path:circle(31%)}
.lz .lz-orb.tick{animation:lzbump .3s ease-out}
.lz .lz-orb.tick .shine{animation:lzshine .45s ease-out}
.lz .lz-orb.deny{animation:lzdeny .28s ease-in-out}
.lz .lz-orb .n{position:relative;font-family:var(--font-t);font-weight:700;font-size:calc(39*var(--gu));line-height:1;letter-spacing:var(--gu);color:#FFF6E2;white-space:nowrap;--or:calc(3.5*var(--gu));--oc:var(--eo,#801212);text-shadow:var(--ring),calc(3*var(--gu)) calc(2*var(--gu)) 0 rgba(0,0,0,.19)}
.lz .lz-orb .n small{font-size:inherit}
.lz .lz-orb.empty .n{color:#FF5555;--eo:#501717}
@keyframes lzspin{to{rotate:360deg}}
@keyframes lzbump{0%{scale:1}40%{scale:1.16}100%{scale:1}}
@keyframes lzshine{0%{opacity:.9;scale:.8}100%{opacity:0;scale:1.5}}
/* pile buttons (NCombatCardPile): the 80 x 80 icon, the count on the 48 x 48 badge 8 right of and 4 over the middle (Kreon Bold 26 cream, outline 12 881F1F,
   shadow (2, 1)); the exhaust pile has no badge, its count stands on the icon (Kreon 32, FFB5E2 on 341F2F, shadow (4, 3)). Hover: the icon to 1.25 at once,
   back over 0.5 s expo-out */
.lz .lz-piles{display:flex;gap:8px;align-items:flex-end}
.lz .lz-pile{position:relative;width:calc(80*var(--gu));height:calc(80*var(--gu));padding:0;border:0;background:none;cursor:pointer;filter:drop-shadow(0 calc(3*var(--gu)) 0 rgba(0,0,0,.55))}
.lz .lz-pile img{display:block;width:100%;height:100%;object-fit:contain;transition:scale .5s cubic-bezier(.16,1,.3,1),filter .5s cubic-bezier(.16,1,.3,1)}
.lz .lz-pile b{position:absolute;left:calc(48*var(--gu));top:calc(36*var(--gu));width:calc(48*var(--gu));height:calc(48*var(--gu));display:grid;place-items:center;background:center/100% 100% no-repeat;font-family:var(--font-t);font-weight:700;font-size:calc(28*var(--gu));line-height:1;color:#FFF6E2;--or:calc(2.6*var(--gu));--oc:#881F1F;text-shadow:var(--ring),calc(2*var(--gu)) var(--gu) 0 rgba(0,0,0,.125)}
.lz .lz-pile.exhaust b{left:calc(21*var(--gu));top:calc(-8*var(--gu));width:calc(38*var(--gu));height:calc(100*var(--gu));background:none!important;font-weight:400;font-size:calc(35*var(--gu));color:#FFB5E2;--oc:#341F2F;text-shadow:var(--ring),calc(4*var(--gu)) calc(3*var(--gu)) 0 rgba(0,0,0,.125)}
.lz .lz-pile:is(:hover,:focus-visible) img{scale:1.25;transition-duration:.05s}
.lz .lz-pile:focus-visible{outline:0}
.lz .lz-pile.on img{filter:brightness(1.3)}
.lz .lz-pile.bump img,.lz .lz-pile.bump b{animation:lzpilebump .5s cubic-bezier(.16,1,.3,1)}
@keyframes lzpilebump{from{scale:1.25}}
/* NExhaustPileButton: hidden until the first card is exhausted, then it slides in from 150 px to the right over 0.5 s expo-out */
.lz .lz-pile.exhaust.zero{visibility:hidden}
.lz .lz-pile.exhaust.in{animation:lzexhin .5s cubic-bezier(.16,1,.3,1)}
@keyframes lzexhin{from{translate:calc(150*var(--gu)) 0;opacity:0}}
/* End Turn (NEndTurnButton): the plate sprite, label Kreon Bold 30 cream, outline 12 131F2E, shadow (3, 2) .19. When nothing else can be played the glow layer
   comes up to .75 and a second glow pulses out (scale .5 -> .7, alpha .4 -> 0 over 1.5 s). Hover: brighter, 2 px up, the label red while a card can still be
   played and cyan when none can. Disabled (the enemy's turn, a finished puzzle): grey */
.lz .lz-end{position:relative;width:calc(256*var(--gu));height:calc(128*var(--gu));padding:calc(4*var(--gu)) 0 0;border:0;background:center/contain no-repeat;cursor:pointer;font-family:var(--font-t);font-weight:700;font-size:calc(32.7*var(--gu));line-height:1;color:#FFF6E2;filter:drop-shadow(0 calc(3*var(--gu)) 0 rgba(0,0,0,.55));transition:translate .2s,filter .2s}
.lz .lz-end .gl{position:absolute;inset:0;background:center/contain no-repeat;opacity:0;pointer-events:none;mix-blend-mode:screen;transition:opacity .5s cubic-bezier(.16,1,.3,1)}
.lz .lz-end.glow .gl{opacity:.75;animation:lzetin .8s cubic-bezier(.34,1.56,.64,1)}
.lz .lz-end.glow .gl::after{content:"";position:absolute;inset:0;background:inherit;opacity:0;animation:lzetpulse 1.5s cubic-bezier(.25,1,.5,1) infinite}
@keyframes lzetin{from{opacity:0;scale:.9}}
@keyframes lzetpulse{from{scale:1;opacity:.53}to{scale:1.4;opacity:0}}
.lz .lz-end .t{position:relative;--or:calc(2.64*var(--gu));--oc:#131F2E;text-shadow:var(--ring),calc(3*var(--gu)) calc(2*var(--gu)) 0 rgba(0,0,0,.19)}
.lz .lz-end:is(:hover,:focus-visible):not(:disabled){translate:0 calc(-2*var(--gu));filter:drop-shadow(0 calc(3*var(--gu)) 0 rgba(0,0,0,.55)) brightness(1.35);transition-duration:.05s;outline:0}
.lz .lz-end:is(:hover,:focus-visible):not(:disabled) .t{color:#FF5555}
.lz .lz-end.glow:is(:hover,:focus-visible):not(:disabled) .t{color:#00FFFF}
.lz .lz-end:active:not(:disabled){translate:0 0;filter:drop-shadow(0 calc(2*var(--gu)) 0 rgba(0,0,0,.55)) brightness(.9)}
.lz .lz-end:disabled{cursor:default;filter:drop-shadow(0 calc(3*var(--gu)) 0 rgba(0,0,0,.55)) grayscale(1) brightness(.62)}
@media (prefers-reduced-motion:reduce){.lz .lz-end.glow .gl::after,.lz .lz-pile.exhaust.in{animation:none}}
/* a narrow board (the page's middle widths): the game's side groups beside the fan would leave the cards 40 px apart, so the fan takes the whole width and
   the two groups stand in one row under it, as on a phone */
@container lz (max-width:820px){
  .lz .lz-hud{grid-template-areas:"hand hand hand" "left mid right";gap:4px 8px;margin-top:-1rem}
  .lz .lz-hl{flex-direction:row;gap:calc(20*var(--gu));width:auto;padding:0}
  .lz .lz-hl>.lz-pile{order:-1;align-self:center}
  .lz .lz-hr{flex-direction:row;align-items:center;width:auto;padding:0;justify-self:end}
  /* the one-row hud of a narrow board keeps its distance from the edges too: tighter gaps pay for the side padding (at 390 px the row had 14 px to spare) */
  .lz .lz-hud{column-gap:4px;padding-inline:clamp(12px,4cqi,26px)}
  .lz :is(.lz-hl,.lz-hr,.lz-hr .lz-piles){gap:calc(12*var(--gu))}
}

/* ---------- the hand: HandPosHelper's fan, scaled by --k (our card width / the game's 240 px card) ---------- */
.lz .hand{grid-area:hand;position:relative;display:block;height:calc(var(--cw) * 1.4067 + 3.6rem);min-height:0;padding:0;margin:0;overflow:visible;--k:.54;--cw:8.4rem}
/* touch-action:none: a touch that starts on a card is the board's (a drag), never a page scroll; no text selection, no image drag, no long-press menu.
   --fs scales a card that is flying in from the draw pile */
.lz .hand .card{--cw:8.4rem;position:absolute;left:50%;bottom:.7rem;margin-left:calc(var(--cw) / -2);z-index:calc(var(--i,0) + 1);cursor:grab;touch-action:none;-webkit-touch-callout:none;transform:translate(calc(var(--fx,0px) + var(--hx,0px) * var(--k) + var(--push,0px) * var(--k)),calc(var(--fy,0px) + var(--hy,0px) * var(--k))) rotate(var(--rot,0deg)) scale(calc(var(--fs,1) * var(--hs,1)));transition:transform .5s cubic-bezier(.16,1,.3,1),opacity .3s,filter .3s}
.lz .hand .card img{-webkit-user-drag:none}
/* hover: angle 0 and full size at once (the fan card is the game's 0.8 card, HoverScale is 1: 1.25), lifted clear of the fan; the return eases out over half a second */
.lz .hand .card.hov,.lz .hand .card:focus-visible{z-index:40;transform:translate(calc(var(--fx,0px) + var(--hx,0px) * var(--k)),calc(var(--fy,0px) - 1.5rem)) rotate(0deg) scale(1.25);transition:transform 0s,opacity .3s,filter .3s}
/* a card that is out of the hand (dragged, aiming, flying to the play pile): its ghost in <body> is what shows; the slot is invisible, takes no clicks and
   jumps straight to wherever the fan puts it, so the returning ghost has a fixed place to land. .busy: the other cards ignore the mouse while one is being
   dragged or aimed with the mouse, like NPlayerHand's holders */
.lz .hand .card.lifted{opacity:0!important;pointer-events:none;transition:none!important;animation:none!important}
.lz .hand.busy .card{pointer-events:none}
.lz .hand .card.dis{filter:brightness(.6) saturate(.7)}
.lz .hand .card.dis .energy span{color:#FF5555}
/* playable glow (NCardHighlight, #00F4FC): the highlight follows the card's own outline (the frame sprite's shape: --frame, set on the card root by cardHtml),
   not a rounded box. The frame is drawn black under the card and grown by four hard cyan copies (the outline) and a soft one (the glow) */
.lz .hand .card.can::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--frame) center/100% 100% no-repeat;filter:brightness(0) drop-shadow(calc(5*var(--u)) 0 0 #00F4FC) drop-shadow(calc(-1*calc(5*var(--u))) 0 0 #00F4FC) drop-shadow(0 calc(5*var(--u)) 0 #00F4FC) drop-shadow(0 calc(-1*calc(5*var(--u))) 0 #00F4FC) drop-shadow(0 0 calc(14*var(--u)) rgba(0,244,252,.55));animation:lzglow 1.6s ease-in-out infinite alternate;pointer-events:none}
@keyframes lzglow{from{opacity:.55}to{opacity:1}}
/* deal: each card rises in with a small overshoot, staggered */
.lz .hand .card.dealt{animation:lzdeal .4s cubic-bezier(.34,1.56,.64,1) both;animation-delay:var(--d,0s)}
@keyframes lzdeal{from{opacity:0;translate:0 40px}to{opacity:1;translate:0 0}}
/* illegal play: a quick shake */
.lz .hand .card.deny{animation:lzdeny .28s ease-in-out}
@keyframes lzdeny{0%,100%{translate:0 0}20%{translate:-6px 0}45%{translate:6px 0}70%{translate:-4px 0}}
.lz .hand .lz-empty{position:absolute;left:50%;top:50%;translate:-50% -50%;white-space:nowrap}
/* ---------- the card out of the hand: a fixed copy in <body>, moved by transform only (daily.js lzPose) ---------- */
.card.lz-ghost{position:fixed;left:0;top:0;margin:0;z-index:95;pointer-events:none;transform-origin:50% 50%;will-change:transform;transition:none;cursor:default}
.card.lz-ghost>.shadow{opacity:.4;translate:calc(10*var(--u)) calc(16*var(--u))}
/* NCardHighlight: the playable glow rides along; AnimFlash on entering the play zone (width 0.075 -> 0.15 in 0.1 s, back in 0.35 s cubic-out); brighter while an untargeted card is armed */
.card.lz-ghost.can::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--frame) center/100% 100% no-repeat;filter:brightness(0) drop-shadow(calc(5*var(--u)) 0 0 #00F4FC) drop-shadow(calc(-1*calc(5*var(--u))) 0 0 #00F4FC) drop-shadow(0 calc(5*var(--u)) 0 #00F4FC) drop-shadow(0 calc(-1*calc(5*var(--u))) 0 #00F4FC) drop-shadow(0 0 calc(14*var(--u)) rgba(0,244,252,.6));pointer-events:none}
.card.lz-ghost.can.armed::before{filter:brightness(0) drop-shadow(calc(8*var(--u)) 0 0 #00F4FC) drop-shadow(calc(-1*calc(8*var(--u))) 0 0 #00F4FC) drop-shadow(0 calc(8*var(--u)) 0 #00F4FC) drop-shadow(0 calc(-1*calc(8*var(--u))) 0 #00F4FC) drop-shadow(0 0 calc(24*var(--u)) rgba(0,244,252,.8))}
.card.lz-ghost.can.flash::before{animation:lzgflash .45s cubic-bezier(.215,.61,.355,1)}
@keyframes lzgflash{0%{scale:1}22%{scale:1.035;filter:brightness(0) drop-shadow(0 0 calc(4*var(--u)) #A0FFFE) drop-shadow(0 0 calc(10*var(--u)) #00F4FC) drop-shadow(0 0 calc(26*var(--u)) rgba(0,244,252,.8))}100%{scale:1}}
.card.lz-ghost.dis{filter:brightness(.6) saturate(.7)}
.card.lz-ghost.dis .energy span{color:#FF5555}
.card.lz-ghost.deny{animation:lzdeny .28s ease-in-out}
.card.lz-ghost.fly{z-index:90}
.card.lz-ghost.fly::before{display:none}
/* NTargetingArrow: 19 segment sprites and the head, placed by transform every frame; the sprites are grey and get the game's modulate (E61E1B over an enemy)
   by multiplying a colour into them under their own alpha */
.lz-arrow{position:fixed;inset:0;z-index:96;pointer-events:none;overflow:hidden}
.lz-arrow i{position:absolute;left:0;top:0;display:block;background:center/100% 100% no-repeat;transform-origin:50% 50%;will-change:transform}
.lz-arrow i.seg{width:148px;height:148px;margin:-74px 0 0 -74px;background-image:var(--seg)}
.lz-arrow i.head{width:183px;height:203px;margin:-101.5px 0 0 -91.5px;background-image:var(--head)}
.lz-arrow.hot i{background-color:#E61E1B;background-blend-mode:multiply;-webkit-mask:center/100% 100% no-repeat;mask:center/100% 100% no-repeat}
.lz-arrow.hot i.seg{-webkit-mask-image:var(--seg);mask-image:var(--seg)}
.lz-arrow.hot i.head{-webkit-mask-image:var(--head);mask-image:var(--head)}
/* the game hides the mouse cursor while the arrow is out */
html.lz-aiming,html.lz-aiming *{cursor:none!important}
/* the card's trail to the discard pile / into the player (svg path, dash animated from daily.js lzFlight) */
.lz-trail{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:89;pointer-events:none;overflow:visible;mix-blend-mode:screen;filter:blur(.6px)}
/* exhaust embers */
.lz-embers{position:fixed;width:0;height:0;z-index:91;pointer-events:none}
.lz-embers i{position:absolute;left:var(--x);top:var(--y);width:5px;height:5px;border-radius:50%;background:#ffb45a;box-shadow:0 0 8px 2px rgba(255,120,30,.8);opacity:0;animation:lzember .7s ease-out var(--d,0s) forwards}
@keyframes lzember{0%{opacity:0;translate:0 0;scale:1}15%{opacity:1}100%{opacity:0;translate:0 calc(var(--r) * -1);scale:.3}}

/* ---------- practice: the character picker (daily.js lzPickerHtml; the game's character select) ----------
   The portrait buttons are the game's char_select_<id> tiles (132x195) with its outline sprite (144x207) over the picked one; NCharacterSelectButton's states:
   saturation .2 / value .8 at rest, hover scale 1.1 at once in full colour and back over 0.5 s expo-out, the picked one in full colour with the gold outline
   breathing between .35 and 1 (a 1.25 s cosine). The character-select painting of the hovered one stands behind, cut into the room's dark like the game's screen */
.lz .lz-pick{position:relative;isolation:isolate;display:grid;align-items:end;min-height:21rem;overflow:hidden}   /* the board's own panel is its housing: no second box inside it */
.lz .lz-pick-art{position:absolute;inset:0;z-index:0;pointer-events:none}
/* the painting (25 Sep 2026, Bean: "character backgrounds that load on hover here are a little flitched, especially regents it has weird shapes on the right side"):
   the game's select screen for that character, whole (extract/pick_art.py, 16:9), standing on the picker's right edge at the picker's full height, so no edge of it
   shows inside the picker; its left part fades into the board's dark under the title and the tiles. One per character, all loaded with the picker; the hovered one
   fades in over the shown one (.on), which stays whole under it (.was) until it is in, then fades out (daily.js lzPickMount paintTo). The picker's corners are the
   room's (.lz-bg, 14 px) */
.lz .lz-pick{border-radius:14px}
.lz .lz-pick-paint{position:absolute;right:0;top:0;height:100%;width:auto;max-width:none;aspect-ratio:16/9;opacity:0;-webkit-mask:linear-gradient(90deg,transparent,#000 42%);mask:linear-gradient(90deg,transparent,#000 42%);transition:opacity .3s ease-out}
.lz .lz-pick-paint.on{z-index:1;opacity:1}
.lz .lz-pick-paint.was{opacity:1;transition:none}
.lz .lz-pick-in{position:relative;z-index:1;display:grid;gap:.45rem;max-width:47rem;padding:1.5rem 1.6rem 1.25rem}   /* wide enough for the six portraits on one row (Bean, 18 Sep 2026: "put all the char on one row") */
.lz .lz-pick-t{margin:0;font-family:var(--font-t);font-weight:700;font-size:1.55rem;line-height:1.1;color:#fff6e2;text-shadow:0 2px 0 #000,0 0 8px rgba(0,0,0,.7)}
.lz .lz-pick-lead{margin:0;font-size:.95rem;color:var(--muted);text-shadow:0 1px 0 rgba(0,0,0,.6)}
/* the day's count under the lead, small and quiet (daily.js lzPlaysLine: "2 of 3 puzzles left today") */
.lz .lz-pick-left{margin:-.2rem 0 0;font-size:.8rem;color:var(--dim,var(--muted));text-shadow:0 1px 0 rgba(0,0,0,.6)}
.lz .lz-pick-row{display:flex;flex-wrap:nowrap;gap:12px;padding:.7rem 0 .35rem}   /* one row always: the portraits shrink before they wrap (only under 480 px) */
.lz .lz-ct{position:relative;flex:1 1 0;min-width:0;max-width:6.4rem;aspect-ratio:132/195;padding:0;border:0;background:none;cursor:pointer;filter:saturate(.2) brightness(.8);transition:transform .5s cubic-bezier(.16,1,.3,1),filter .5s cubic-bezier(.16,1,.3,1)}
.lz .lz-ct img{display:block;width:100%;height:100%;object-fit:cover;border-radius:3px;box-shadow:0 5px 9px rgba(0,0,0,.65)}
.lz .lz-ct-txt{display:grid;place-items:center;width:100%;height:100%;border-radius:3px;background:#1d2a30;color:#fff6e2;font-family:var(--font-t);font-weight:700}
.lz .lz-ct:hover,.lz .lz-ct:focus-visible{transform:scale(1.1);filter:saturate(1) brightness(1.1);transition-duration:.05s;z-index:2;outline:0}
.lz .lz-ct.on{filter:saturate(1) brightness(1.1)}
/* the outline stands BEHIND the portrait (char_select_button.tscn OutlineLocal: show_behind_parent), so only its rim shows; drawn over it, the filled sprite turned the
   picked tile into a flat gold card at every peak of its breath (25 Sep 2026). The tile is the stacking context the -1 stays inside */
.lz .lz-ct{isolation:isolate}.lz .lz-ct-ol{z-index:-1}
.lz .lz-ct-ol{position:absolute;inset:-3.1% -4.5%;background:var(--gold);-webkit-mask:var(--ol) center/100% 100% no-repeat;mask:var(--ol) center/100% 100% no-repeat;opacity:0;pointer-events:none}
.lz .lz-ct.on .lz-ct-ol{opacity:1;animation:lzolb 1.25s ease-in-out infinite alternate}
.lz .lz-ct:focus-visible .lz-ct-ol{opacity:1;background:#fff6e2;animation:none}
@keyframes lzolb{from{opacity:.35}to{opacity:1}}
@media (max-width:480px){.lz .lz-pick-row{flex-wrap:wrap}.lz .lz-ct{flex:none;width:5.2rem}}
.lz .lz-pick-name{display:flex;align-items:baseline;flex-wrap:wrap;gap:.2rem .7rem;min-height:1.7rem;font-family:var(--font-t)}
.lz .lz-pick-name b{font-size:1.35rem;line-height:1.1;color:var(--cc,#fff6e2);text-shadow:0 2px 0 #000,0 0 6px rgba(0,0,0,.7)}
.lz .lz-pick-name span{font-size:.95rem;color:var(--muted);text-shadow:0 1px 0 rgba(0,0,0,.6)}
@media (max-width:640px){
  .lz .lz-pick{min-height:15rem}
  .lz .lz-pick-in{max-width:none;padding:1.1rem 1rem 1rem}
  .lz .lz-pick-art{opacity:.4}   /* the painting runs under the text on a phone: taken down, as before (on the layer, the paintings' own opacity is their fade) */
  .lz .lz-pick-row{gap:8px}
  .lz .lz-ct{width:min(5rem,calc((100% - 2 * 8px) / 3))}/* three portraits a row on a phone (the five characters + Any wrap to two rows) */
  .lz .lz-pick-t{font-size:1.3rem}
}
@media (prefers-reduced-motion:reduce){.lz .lz-ct,.lz .lz-ct:hover{transition:none;transform:none}.lz .lz-ct.on .lz-ct-ol{animation:none}.lz .lz-pick-paint{transition:none}}
/* the day's-three pop-up (daily.js lzLimitOpen): the result pop-up's plate, ribbon and inset (lethalresult.css), with the rest-site picture in the inset. It sits
   outside .lz (after the housing), so these rules are not under .lz. The ribbon's title is longer than "Lethal", so a size smaller */
.lz-limit .lr-banner h2{font-size:1.5rem;font-size:clamp(1rem,5.3cqw,1.6rem)}
.lz-limit .lr-mask{gap:12px}
.lz-limit .lz-limit-art{display:block;width:100%;height:auto;aspect-ratio:2/1;border-radius:6px;box-shadow:0 0 0 2px rgba(0,0,0,.45),0 4px 10px rgba(0,0,0,.45);animation:lrfade .4s ease-out .2s both}
.lz-limit .lz-limit-say{margin:0 0 2px;text-align:center;text-wrap:balance;font-size:.95rem;line-height:1.35;text-shadow:0 1px 0 rgba(0,0,0,.6)}
.lr-panel.lz-limit{--n:2;width:min(31rem,100%)}   /* a little wider than the result panel, for the picture */

/* pile contents under the hud */
.lz .lz-lists{display:grid;gap:8px}
.lz .lz-lists:empty{display:none}
.lz .lz-list{display:flex;gap:8px;align-items:flex-start;min-width:0}
.lz .lz-list>.dim{padding-top:6px;white-space:nowrap}
/* the pile's cards at a size you can read, over the board's whole width, 6 a row (Bean, 23 Sep 2026: "Why are these cards displayed so small, cant even read them",
   "show them bigger spanning the whole width of the box, 6 per row"; they were 86 px in one sideways-scrolling row). Each card is as wide as its column: --cw from the
   row's own width (the row is an inline-size container, cqi). A narrower board keeps them readable: 4 a row under 640 px of board, 3 under 420 (the lz container) */
.lz .lz-list .mini{container-type:inline-size;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:14px 12px;min-width:0;padding:4px 0 6px}
.lz .lz-list .mini>.card{--cw:calc((100cqi - 5 * 12px) / 6);justify-self:center}
@container lz (max-width:640px){.lz .lz-list .mini{grid-template-columns:repeat(4,minmax(0,1fr))}.lz .lz-list .mini>.card{--cw:calc((100cqi - 3 * 12px) / 4)}}
@container lz (max-width:420px){.lz .lz-list .mini{grid-template-columns:repeat(3,minmax(0,1fr))}.lz .lz-list .mini>.card{--cw:calc((100cqi - 2 * 12px) / 3)}}
/* the caption stands over the row, so the row has the board's whole width */
.lz .lz-list{flex-direction:column;gap:2px}.lz .lz-list>.dim{padding-top:0}.lz .lz-list .mini{align-self:stretch}

/* an animated creature's canvas is its whole frame box (a lunge reaches far past the still) and could push the page sideways at any width
   (seen on puzzle pcvmie at 1258 px); clip, not hidden, so no scroll container is made. The clip is the ROOM's (the canvases live there), not the whole board's:
   on .lz it also cut the pile views' outer cards, at rest (their cost orb and banner tips reach past the card) and grown on hover (Bean, 25 Sep 2026: "cards in draw
   pile on the lethal game are cut off by housing, this cant happen anywhere on site") */
.lz .lstage{overflow-x:clip}
/* the pile views' cards (daily.js lzLists): the game's pile grid hover, 0.8 to 1 (1.25 here, where the resting card is the 0.8 one), with the site's tilt; not links */
.lz .lz-list .card.lz-pc{--hov-scale:1.25;cursor:default}
/* ---------- phones: creatures smaller, the hud stacks, the fan becomes a scrollable row ---------- */
@media (max-width:640px){
  /* an animated creature's canvas is its whole frame box and reaches past the room on a phone; clip (not hidden: no scroll container) keeps the page from
     growing sideways */
  .lz .lstage{min-height:15rem;padding:3.2rem 3% 1rem}
  .lz .lstage .side.player{margin-left:0}.lz .lstage .side.enemy{margin-right:0}
  .lz .lstage .side .lz-body img.creature{max-height:8.5rem;max-width:36vw}
  .lz{--gu0:min(.03rem,.12vw)}
  /* the hud row is draw pile + orb on the left and End Turn + two piles on the right at the board's unit; under ~400 px the unit follows the viewport (.12vw)
     so the row still fits a 320 px phone */
  .lz .hand{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-end;height:auto;overflow-x:auto;overflow-y:hidden;gap:6px;padding:1.4rem 8px .5rem;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch}
  /* the row's rule for touch: pan-x leaves sideways swipes to the browser (the row scrolls, the press is cancelled) and gives every vertical swipe to the
     board, so swiping a card up plays it and the page never scrolls from a card; a lifted card keeps its slot in the row */
  /* position:relative, not static: the card's layers are absolutely placed inside it (a static card only held them while the deal animation ran) */
  .lz .hand .card{--cw:6.4rem;position:relative;left:auto;bottom:auto;margin:0;transform:none;touch-action:pan-x;scroll-snap-align:center;transition:transform .5s cubic-bezier(.16,1,.3,1),opacity .3s,filter .3s}
  .lz .hand .card:first-child{margin-left:auto}.lz .hand .card:last-child{margin-right:auto}
  .lz .hand .card.hov,.lz .hand .card:focus-visible{transform:translateY(-.6rem) scale(1.1)}
  .lz .hand .lz-empty{position:static;translate:0 0;margin:0 auto}
  .lz-num{font-size:1.7rem}
  .lz .lz-banner{font-size:2.2rem}
}
/* ---------- the Lethal banner's room (home page / hub, app/pages.js lethalBannerHtml) ----------
   One assembled scene (extract/rooms_compose.py -> src/img/rooms/lethal/ceremonial_beast_boss/banner.webp, 1200x562, ground line at .6543 of its height)
   sized so its ground line runs under the creatures' feet: they stand at bottom:10% of the stage (home.css .lb-side; 19% under 760 px), so the
   ground sits at 90% (81%) of the stage. Height = max(the height that puts the ground there with the top edge at or above the stage's, the height that
   fills the width), so top = min(0, 90cqh - .6543 * 46.83cqw). Sized by container query (the stage's own box); nothing else of home.css changes */
.lb-bg.lb-room{container-type:size}
.lb-bg.lb-room img{inset:auto;top:min(0px,calc(90cqh - 30.64cqw));left:50%;width:auto;height:max(137.6cqh,46.84cqw);max-width:none;translate:-50% 0;object-fit:fill;object-position:50% 50%}
@media (max-width:760px){.lb-bg.lb-room img{top:min(0px,calc(81cqh - 30.64cqw));height:max(123.8cqh,46.84cqw)}}

/* ===== app/lethalfx.css ===== */
/* ===================== Lethal: the board pieces app/lethalfx.js and app/lethalcard.js draw (docs/wave3/lethal-ui.md) =====================
   Engine cards in the hand (enchantment tab, live numbers, cost colours), the Defect's orb arc, the Regent's star counter, Osty, the power row's
   motion, the extra number / spark looks, the repeat pop of a card on the play pile, doom, block break. Colours and geometry are the game's
   (NCard, CardCostHelper, DynamicVar, NOrb, NStarCounter, NPower, NDamageNumVfx, NDoomVfx); sizes scale with the card's --u and the body's height. */

/* ---------- engine cards: the enchantment tab (card.tscn Enchantment: card_enchant_s at (-166,-116) in card space, 45 px higher without a Star cost, the icon at (14,9) 35x35;
   NCard.SetEnchantmentStatus tints the tab through the hsv shader h .25 s .4 v .6: the green sprite goes dark brown) ---------- */
.card .ench{position:absolute;left:calc(-16*var(--u));top:calc(50*var(--u));width:calc(72*var(--u));height:calc(54*var(--u));background:var(--tab) center/100% 100% no-repeat;filter:sepia(1) hue-rotate(-8deg) saturate(1.4) brightness(.42) drop-shadow(0 1px 0 rgba(0,0,0,.5));z-index:7;pointer-events:auto}
.card .ench.low{top:calc(95*var(--u))}
.card .ench img{position:absolute;left:calc(14*var(--u));top:calc(9*var(--u));width:calc(35*var(--u));height:calc(35*var(--u));object-fit:contain;filter:sepia(0) saturate(1) brightness(2.4)}
.card .ench span{position:absolute;left:calc(14*var(--u));top:calc(12*var(--u));font-family:var(--font-t);font-size:calc(16*var(--u));color:#FFF6E2;filter:brightness(2.4)}
/* the previewed numbers (DynamicVar.ToHighlightedString): green above the enchanted base, red below */
.card .desc .num.buf{color:#7FFF00}.card .desc .num.nerf{color:#FF5555}
/* the cost as the hand shows it (CardCostHelper.GetEnergyCostColor): red when it cannot be paid, green when lowered, energy blue when raised */
.card .energy.cost-no span{color:#FF5555;-webkit-text-stroke-color:#501717}
.card .energy.cost-down span{color:#7FFF00;-webkit-text-stroke-color:#1F5923}
.card .energy.cost-up span{color:#40FFFF;-webkit-text-stroke-color:#20595C}
/* a Forged blade re-drawn (a warm flash on the card) */
.lz .hand .card.smith{animation:lzsmith .5s ease-out}
@keyframes lzsmith{0%{filter:brightness(1.9) sepia(.5) drop-shadow(0 0 12px #FFC64B)}100%{filter:none}}
/* a card played again from the play pile (NCard.AnimMultiCardPlay: to transparent black over 0.2 s, a 0.2 s wait, back in from below at half size over 0.2 s) */
.card.lz-ghost.again{animation:lzagain .64s cubic-bezier(.34,1.56,.64,1) both}
@keyframes lzagain{0%{opacity:1;filter:brightness(1)}30%{opacity:0;filter:brightness(0)}62%{opacity:0;filter:brightness(0);translate:0 120px;scale:.5}100%{opacity:1;filter:brightness(1);translate:0 0;scale:1}}

/* ---------- the power row: NPower drops a new icon in from 24 px up (back-out, 0.5 s), FlashPower on a changed amount, a debuff amount in red, Artifact breaking ---------- */
.lz .lz-pow.de b{color:#FF5555}   /* StsColors.red: PowerModel.AmountLabelColor for a debuff (Poison and Doom keep cream) */
.lz .lz-pow.new{animation:lzpowin .5s cubic-bezier(.34,1.56,.64,1) both}
.lz .lz-pow.flash img,.lz .lz-pow.flash .lz-pow-txt{animation:lzpowflash .5s ease-out}
.lz .lz-pow.flash b{animation:lzpulse .35s ease-out}
.lz .lz-pow.break{animation:lzpowbreak .4s ease-in forwards}
.lz .lz-pow-txt{display:grid;place-items:center;width:100%;height:100%;border-radius:6px;background:#2a2a33;font-family:var(--font-t);font-size:.7rem;font-style:normal;color:#FFF6E2;text-transform:uppercase}
@keyframes lzpowin{0%{translate:0 -24px;opacity:0}100%{translate:0 0;opacity:1}}
@keyframes lzpowflash{0%{filter:drop-shadow(0 1px 0 rgba(0,0,0,.6)) brightness(2.2);scale:1.35}100%{filter:drop-shadow(0 1px 0 rgba(0,0,0,.6)) brightness(1);scale:1}}
@keyframes lzpowbreak{0%{rotate:0deg;opacity:1}30%{rotate:-14deg}60%{rotate:12deg}100%{rotate:0deg;opacity:.25;scale:.7}}

/* ---------- numbers and sparks beyond the card hit: heal (NHealNumVfx green), orb damage (cyan), direct damage (Haunt / Necro Mastery: pale, no swing), energy and Stars gained ---------- */
.lz-num.heal{color:#7FFF00;text-shadow:0 2px 0 #000,0 0 8px #074700;animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards}
.lz-num.orb{color:#5EFFFF;text-shadow:0 2px 0 #000,-2px 0 0 #003a40,2px 0 0 #003a40,0 -2px 0 #003a40,0 0 10px rgba(0,120,140,.8);animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards}
.lz-num.direct{color:#FFB6A3;font-style:italic;text-shadow:0 2px 0 #000,0 0 10px rgba(120,0,60,.9);animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards}
.lz-num.energy{color:#FFE73C;font-size:1.5rem;text-shadow:0 2px 0 #000,0 0 8px #5a4000;animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards}
.lz-num.star{color:#FFD86B;font-size:1.5rem;text-shadow:0 2px 0 #000,0 0 8px #5a3a00;animation:lznum .95s cubic-bezier(.2,.7,.3,1) forwards}
/* orb hits burst cyan without a slash; flat damage (Panache, Inferno, Sleight of Flesh ...) is a warm burst off the power that did it */
.lz .lz-slash.orb{width:60%;height:60%;margin-left:-30%;top:20%;border-radius:50%;background:radial-gradient(circle,rgba(200,255,255,.95),rgba(94,255,255,.55) 40%,transparent 70%);box-shadow:none;transform:scale(.3);animation:lzburst .3s ease-out forwards}
.lz .lz-slash.flat{width:56%;height:56%;margin-left:-28%;top:22%;border-radius:50%;background:radial-gradient(circle,rgba(255,240,200,.95),rgba(255,150,60,.55) 40%,transparent 70%);box-shadow:none;transform:scale(.3);animation:lzburst .3s ease-out forwards}
/* the name of what fired a card again or brought it back ("One-Two Punch", "Feral") over the play spot */
.lz-tag{position:absolute;translate:-50% -100%;font-family:var(--font-t);font-weight:700;font-size:1.15rem;line-height:1;color:#FFF6E2;text-shadow:0 2px 0 #000,0 0 8px rgba(0,0,0,.8),0 0 12px #FFA518;white-space:nowrap;pointer-events:none;animation:lztag .9s ease-out forwards;z-index:5}
.lz-tag.still{animation:none}
@keyframes lztag{0%{opacity:0;scale:.6}15%{opacity:1;scale:1.1}30%{scale:1}100%{opacity:0;translate:-50% -160%}}
/* NBlockBrokenVfx: the badge splits and the halves fall away */
.lz-bbreak{position:absolute;width:26px;height:36px;object-fit:contain;translate:-50% -50%;pointer-events:none;z-index:5;animation:lzbbl .7s ease-in forwards}
.lz-bbreak.r{animation-name:lzbbr}
.lz-bbreak.still{animation:none;opacity:0}
@keyframes lzbbl{0%{opacity:1;transform:translate(0,0) rotate(0)}100%{opacity:0;transform:translate(-34px,60px) rotate(-70deg)}}
@keyframes lzbbr{0%{opacity:1;transform:translate(0,0) rotate(0)}100%{opacity:0;transform:translate(34px,60px) rotate(70deg)}}

/* ---------- DoomPower.DoomKill (NDoomVfx): the enemy freezes on its hurt frame, dark smoke rises, a weak shake, then the body sinks into the ground (0.75 s expo-in after 0.75 s) ---------- */
.lz .lstage .side.enemy.doomed .lz-body img.creature,.lz .lstage .side.enemy.doomed .lz-body .ca-canvas{animation:none;filter:drop-shadow(0 6px 6px rgba(0,0,0,.55)) brightness(.55) contrast(1.15) saturate(.6)}
.lz .lstage .side.enemy.doomed .lz-body{animation:lzdoomshake .5s ease-out}
.lz .lstage .side.enemy.sunk .lz-body{animation:lzsink .75s cubic-bezier(.95,.05,.8,.04) forwards}
.lz .lstage .side.enemy.doomed .lz-intent,.lz .lstage .side.enemy.sunk .lz-intent{display:none}
.lz .lz-doomfx{position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;z-index:3}
.lz .lz-doomfx i{position:absolute;left:calc(50% + var(--x,0%));bottom:8%;width:16px;height:16px;margin-left:-8px;border-radius:50%;background:radial-gradient(circle,rgba(96,28,120,.95),rgba(40,0,60,.7) 45%,rgba(20,0,30,0) 70%);opacity:0;scale:var(--s,1);animation:lzdoomp 1.5s ease-out var(--d,0s) forwards}
@keyframes lzdoomshake{0%,100%{translate:0 0}20%{translate:-3px 0}45%{translate:3px 0}70%{translate:-2px 0}}
@keyframes lzsink{0%{translate:0 0;clip-path:inset(-20% -20% 0 -20%)}100%{translate:0 100%;clip-path:inset(-20% -20% 100% -20%)}}
@keyframes lzdoomp{0%{opacity:0;translate:0 0}15%{opacity:.9}100%{opacity:0;translate:0 calc(var(--r,90px) * -1)}}

/* ---------- the Defect's orbs on their arc (NOrbManager.TweenLayout, NOrb): --oc / --ocx the arc's centre inside the player's side, --ox / --oy per slot, --od the orb size ---------- */
.lz .lz-orbs{position:absolute;left:var(--ocx,50%);top:var(--oc,0px);width:0;height:0;pointer-events:none;z-index:4}
.lz .lz-orb-slot{position:absolute;left:var(--ox,0px);top:var(--oy,0px);width:var(--od,40px);height:var(--od,40px);translate:-50% -50%;pointer-events:auto;cursor:help;transition:left .45s ease-in-out,top .45s ease-in-out,opacity .25s linear}
.lz .lz-orb-slot img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.55))}
.lz .lz-orb-slot img.ring{opacity:.85}
.lz .lz-orb-slot.full img.ring{opacity:0}
.lz .lz-orb-slot.in img.orb{animation:lzorbin .5s cubic-bezier(.34,1.56,.64,1) both}
.lz .lz-orb-slot.flash img.orb{animation:lzorbflash .5s ease-out}
.lz .lz-orb-slot.flash::after{content:"";position:absolute;inset:-30%;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.75),rgba(255,255,255,0) 65%);animation:lzburst .5s ease-out forwards;pointer-events:none}
.lz .lz-orb-slot.going{opacity:0}
.lz .lz-orb-slot.dim img.orb{filter:drop-shadow(0 2px 0 rgba(0,0,0,.55)) brightness(.45)}
.lz .lz-orb-slot b{position:absolute;left:calc(100% - 4px);top:50%;translate:0 -50%;font-family:var(--font-t);font-weight:700;font-size:.95rem;line-height:1;color:#FFF6E2;text-shadow:0 0 2px #000,0 0 2px #000,0 1px 0 #000,1px 0 0 #000,-1px 0 0 #000,0 -1px 0 #000;white-space:nowrap}
.lz .lz-orb-slot b.ev{display:none;color:#5EFFFF}
.lz .lz-orb-slot.ev-on b.ev{display:block}
.lz .lz-orb-slot.ev-on:not(.t-dark) b.pv{display:none}
.lz .lz-orb-slot.t-dark b.pv{top:32%}.lz .lz-orb-slot.t-dark b.ev{display:block;top:70%}
.lz .lz-orb-slot.flash b{animation:lzpulse .35s ease-out}
@keyframes lzorbin{0%{scale:0;opacity:0}100%{scale:1;opacity:1}}
@keyframes lzorbflash{0%{filter:drop-shadow(0 2px 0 rgba(0,0,0,.55)) brightness(2.5);scale:1.45}100%{filter:drop-shadow(0 2px 0 rgba(0,0,0,.55)) brightness(1);scale:1}}
/* a bolt from an orb to the enemy, in the orb's colour */
.lz-bolt{position:absolute;height:7px;margin-top:-3px;transform-origin:0 50%;border-radius:4px;background:linear-gradient(90deg,transparent,var(--bc,#fff) 25%,#fff 55%,var(--bc,#fff) 80%,transparent);box-shadow:0 0 14px 3px var(--bc,#fff);mix-blend-mode:screen;pointer-events:none;animation:lzbolt .4s ease-out forwards;z-index:5}
.lz-bolt.t-lightning{--bc:#FFE93C}.lz-bolt.t-frost{--bc:#7FE8FF}.lz-bolt.t-dark{--bc:#B14CFF}.lz-bolt.t-plasma{--bc:#FF9A3C}.lz-bolt.t-glass{--bc:#C5F6FF}
.lz-bolt.still{animation:none;opacity:0}
@keyframes lzbolt{0%{scale:0 1;opacity:1}40%{scale:1 1;opacity:1}100%{scale:1 .2;opacity:0}}

/* ---------- the Regent's Stars (NStarCounter: energy_star + two turning layers, 30 / 60 deg/s, 5 / 10 at 0; cream count with the dark blue outline, red at 0; a gain flashes) ---------- */
.lz .lz-stars{position:relative;width:3.4rem;height:3.4rem;display:grid;place-items:center;margin-top:-.4rem;filter:drop-shadow(0 2px 0 rgba(0,0,0,.55))}
.lz .lz-stars img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;pointer-events:none}
.lz .lz-stars .rot{animation:lzspin 12s linear infinite}.lz .lz-stars .rot2{animation:lzspin 6s linear infinite}
.lz .lz-stars.zero .rot{animation-duration:72s}.lz .lz-stars.zero .rot2{animation-duration:36s}
.lz .lz-stars.zero img:not(.glow){filter:saturate(.5) brightness(.85)}
.lz .lz-stars .glow{opacity:0;scale:1.4;mix-blend-mode:screen}
.lz .lz-stars .n{position:relative;font-family:var(--font-t);font-weight:700;font-size:1.35rem;line-height:1;color:#FFF6E2;paint-order:stroke fill;-webkit-text-stroke:.22em #003E75;text-shadow:0 2px 0 rgba(0,0,0,.3)}
.lz .lz-stars.zero .n{color:#FF5555}
.lz .lz-stars.gain .l1{animation:lzstarflash .2s ease-out}
.lz .lz-stars.gain .glow{animation:lzstarglow .55s ease-out}
.lz .lz-stars.gain .n{animation:lzpulse .35s ease-out}
.lz .lz-stars.spend{animation:lzbump .3s ease-out}
@keyframes lzstarflash{0%{filter:brightness(2.2)}100%{filter:brightness(1)}}
@keyframes lzstarglow{0%{opacity:.9;scale:.8}100%{opacity:0;scale:1.9}}

/* ---------- Osty (NCombatRoom.PositionLocalPlayerOsty, Osty.cs OstyScaleToSize): to the right of the player and up, scale by max HP, its own bar and powers ---------- */
.lz .lz-osty{position:absolute;left:var(--px,100%);top:var(--py,100%);translate:-50% -100%;transform:scale(var(--os,1));transform-origin:50% 100%;display:flex;flex-direction:column;align-items:center;width:7rem;z-index:2;pointer-events:none;transition:transform .75s cubic-bezier(.34,1.56,.64,1),left .75s ease-out,top .75s ease-out}
.lz .lz-osty.none{display:none}
.lz .lz-osty .lz-body{position:relative;transform-origin:50% 100%}
.lz .lz-osty .lz-body img.creature{display:block;max-height:5.2rem;max-width:6.5rem;width:auto;object-fit:contain;filter:drop-shadow(0 4px 4px rgba(0,0,0,.55));animation:breathe 3.4s ease-in-out -0.7s infinite}
.lz .lz-osty .lz-shadow{left:20%;width:60%;height:.7rem;bottom:-.35rem}
/* Osty's height from lzOstyPlace (--oh: the game's size next to its owner); the side's creature rules would otherwise size it like a second hero */
.lz .lstage .side .lz-osty .lz-body img.creature{height:var(--oh,5.2rem);width:auto;max-height:none;max-width:none}
/* Osty's bar, shield and powers are the board's one UI size (lethal.css THE GAME'S COMBAT UI): the whole of Osty is scaled by --os, so its unit is divided by it */
.lz .lz-osty{--gu:calc(var(--gu0) / var(--os,1))}
.lz .lz-osty .lz-powers{min-height:0}
.lz .lz-osty.summon .lz-body{animation:lzostyin .75s cubic-bezier(.34,1.56,.64,1) both}
.lz .lz-osty .lz-body.lunge{animation:lzlunge .34s cubic-bezier(.3,0,.2,1)}
.lz .lz-osty .lz-body.hit{animation:lzhit .3s ease-out}
.lz .lz-osty .lz-body.hit img.creature{animation:breathe 3.4s ease-in-out -0.7s infinite,lzflash .3s ease-out}
.lz .lz-osty.dying .lz-body{animation:lzdie .45s ease-in forwards}
.lz .lz-osty.dead .lz-body{opacity:.2;translate:0 10px;rotate:-8deg}
.lz .lz-osty.dying .lz-body img.creature,.lz .lz-osty.dead .lz-body img.creature{filter:grayscale(1) brightness(.4);animation:none}
@keyframes lzostyin{0%{scale:0;opacity:0}100%{scale:1;opacity:1}}

/* ---------- phones ---------- */
@media (max-width:640px){
  .lz .lz-stars{width:2.6rem;height:2.6rem}.lz .lz-stars .n{font-size:1.05rem}
  .lz .lz-osty{width:5rem}.lz .lz-osty .lz-body img.creature{max-height:3.6rem;max-width:4.6rem}
  .lz .lz-orb-slot b{font-size:.75rem}
  .lz-tag{font-size:.95rem}
}
/* ---------- reduced motion: every piece lands in its end state ---------- */
@media (prefers-reduced-motion:reduce){
  .card.lz-ghost.again,.lz .hand .card.smith,.lz .lz-pow.new,.lz .lz-pow.flash img,.lz .lz-pow.flash b,.lz .lz-pow.break,.lz .lz-orb-slot.in img.orb,.lz .lz-orb-slot.flash img.orb,.lz .lz-orb-slot.flash::after,.lz .lz-orb-slot.flash b,
  .lz .lz-stars .rot,.lz .lz-stars .rot2,.lz .lz-stars.gain .l1,.lz .lz-stars.gain .glow,.lz .lz-stars.gain .n,.lz .lz-stars.spend,.lz .lz-osty.summon .lz-body,.lz .lz-osty .lz-body.lunge,.lz .lz-osty .lz-body.hit,.lz .lz-osty .lz-body img.creature,
  .lz .lstage .side.enemy.doomed .lz-body,.lz .lz-doomfx i,.lz-bolt,.lz-tag,.lz-bbreak{animation:none!important}
  .lz .lz-orb-slot,.lz .lz-osty{transition:none}
  .lz .lz-pow.break{opacity:.25}
  .lz .lstage .side.enemy.sunk .lz-body{translate:0 100%;clip-path:inset(-20% -20% 100% -20%)}
  .lz .lz-osty.dying .lz-body{opacity:.2;translate:0 10px;rotate:-8deg}
}

/* ===== app/lethalresult.css ===== */
/* ===== Lethal result pop-up (app/lethalresult.js, docs/wave3/lethal-result.md) =====
   Built from the game's reward screen and game-over summary:
   - scenes/screens/rewards_screen.tscn: reward_panel.png stretched whole behind the content (the game stretches it too: 1128x1436 drawn at
     526x640), reward_banner.png across the top edge overhanging both sides, the header in Kreon bold 44 px cream FFF6E2 with a 4A3C2A outline,
     and the darker inset (RewardContainerMask: the same panel texture flipped both ways at self_modulate .31) that holds the rows;
   - NRewardsScreen.AfterOverlayShown: the window fades in and rises 100 px over 0.5 s, ease-out Back;
   - NGameOverScreen / NScoreLine / score_line.tscn: summary lines of icon + Kreon bold label + right-aligned value with a half-black outline,
     each sliding in from 50 px left over 0.3 s (Spring), one after the other; the icons here are the statistics screen's (stats_swords,
     stats_stopwatch, stats_cards, stats_chain, stats_trophy);
   - scenes/screens/game_over_screen/badge.tscn + NBadge: the headline badge is the game's 64 px badge, a holder (badge_bronze / badge_silver /
     badge_gold) with the icon (badge_speedy, badge_perfect) laid over the same rect, arriving from 40 px below on a 0.25 s spring;
     badge_outline, dimmed, is the empty slot while the numbers are on their way;
   - buttons are the site's event plates (app/buttons.css), untouched.
   The overlay is a sibling of #lboard in the DOM (the board rebuilds its own children on every play) and covers the viewport under the top bar, the way the
   game's reward screen darkens the play area: the panel centres in it when it fits and the overlay itself scrolls when it does not (Bean, 17 Sep 2026: the
   verdict lives here and never asks the page to scroll; the ribbon overhangs the panel's top, so the panel must not clip). */
.lr-host{position:relative}
/* one rhythm for the whole panel (Bean, 17 Sep 2026: "a ton of stuff looks poorly spaced"): --gap between blocks, --pad inside a section, the ribbon
   hung a fixed 2.25rem over the top edge, the plates inset to the content box. The panel is meant to stay under 560 px on a desktop */
.lr-ov{position:fixed;inset:0;z-index:58;display:flex;flex-direction:column;align-items:center;overflow:auto;overscroll-behavior:contain;padding:calc(var(--tb-h,65px) + 2.4rem) 1rem 1rem;background:rgba(3,7,9,.74);animation:lrfade .25s ease-out both}
.lr-panel{--gap:10px;--pad:14px;--side:2.75rem;position:relative;isolation:isolate;flex:none;width:min(27.5rem,100%);margin:auto;padding:3.9rem 1.25rem var(--side);color:#FFF6E2;font-family:var(--font-t);outline:0;filter:drop-shadow(0 12px 16px rgba(0,0,0,.6));animation:lrpanel .5s cubic-bezier(.34,1.56,.64,1) both}
/* --side: the plates' inset from the panel's edge (1.25rem panel + 1.5rem .lr-btns); the space under the last plate is the same (Bean, 17 Sep 2026:
   "View the board" was riding the bottom edge) */
.lr-panel::before{content:"";position:absolute;inset:0;z-index:-1;background:url(/img/ui/reward_screen/reward_panel.webp) center/100% 100% no-repeat}
.lr-panel.lost::before{filter:saturate(.55) brightness(.82)}
/* the banner: 1499x270, hung over the top edge by a fixed 2.25rem */
.lr-banner{position:absolute;left:-1.6rem;right:-1.6rem;top:-2.25rem;aspect-ratio:1499/270;container-type:inline-size;background:url(/img/ui/reward_screen/reward_banner.webp) center/100% 100% no-repeat;filter:drop-shadow(0 4px 3px rgba(0,0,0,.45));animation:lrbanner .5s cubic-bezier(.22,1,.36,1) .12s both}
.lr-panel.lost .lr-banner{filter:grayscale(.6) brightness(.78) drop-shadow(0 4px 3px rgba(0,0,0,.45))}
/* the title sits on the ribbon's flat face: at the sprite's centre column the face runs from row 8 to 165 of 270, so its middle is 32% down (Bean, 17 Sep 2026: centre it exactly) */
.lr-banner h2{position:absolute;left:13%;right:13%;top:32%;translate:0 -50%;margin:0;text-align:center;white-space:nowrap;font-family:var(--font-t);font-weight:700;font-size:1.7rem;font-size:clamp(1.15rem,6.4cqw,1.95rem);line-height:1;letter-spacing:.02em;color:#FFF6E2;text-shadow:0 0 2px #4a3c2a,1px 0 0 #4a3c2a,-1px 0 0 #4a3c2a,0 1px 0 #4a3c2a,0 -1px 0 #4a3c2a,1px 1px 0 #4a3c2a,-1px -1px 0 #4a3c2a,1px -1px 0 #4a3c2a,-1px 1px 0 #4a3c2a,0 2px 0 #4a3c2a,3px 3px 0 rgba(0,0,0,.13)}
/* the day sticker (app/daymark.css .lr-day) stuck on the panel's top-left corner over the ribbon's tail, as it is stuck on the Lethal banner; it lands after the ribbon.
   The subtitle line is gone (Bean, 17 Sep 2026): the dialog's description is read out only (.lr-sr) */
.lr-panel>.daymark.lr-day{position:absolute;top:-.85rem;left:-.55rem;z-index:3;margin:0;animation:lrfade .3s ease-out .4s both}
.lr-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* the inset that holds the blocks: the panel texture again, flipped and darkened, as the game's RewardContainerMask. The texture's own edge is ragged
   (3.5% of its width transparent either side, the chipped corners reaching in to 4.6%), so the side padding is measured from there */
.lr-mask{position:relative;isolation:isolate;display:grid;gap:var(--gap);padding:var(--pad) 1.9rem var(--pad) 1.5rem}
.lr-mask::before{content:"";position:absolute;inset:0;z-index:-1;background:url(/img/ui/reward_screen/reward_panel.webp) center/100% 100% no-repeat;transform:scale(-1,-1);filter:brightness(.31)}
/* the stats: one row of small tiles (icon, value, label); five still fit one row at 375 px */
.lr-lines{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(3.9rem,1fr));gap:6px}
.lr-line{display:flex;flex-direction:column;align-items:center;gap:1px;padding:6px 2px 5px;border-radius:6px;background:rgba(0,0,0,.24);font-weight:700;line-height:1.1;text-shadow:0 0 2px rgba(0,0,0,.5),1px 1px 0 rgba(0,0,0,.5),-1px 1px 0 rgba(0,0,0,.5),1px -1px 0 rgba(0,0,0,.5),-1px -1px 0 rgba(0,0,0,.5);animation:lrline .3s cubic-bezier(.2,1.35,.4,1) both;animation-delay:calc(.3s + var(--i,0) * .08s)}
.lr-line img,.lr-line .lr-noico{flex:none;width:1.5rem;height:1.5rem;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.lr-line .v{font-size:1.15rem;font-variant-numeric:tabular-nums}
.lr-line .l{font-size:.66rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);text-shadow:none}
/* the line played (the board's play log style) and, behind a small toggle, the intended one */
.lr-linebox{padding-top:var(--gap);border-top:2px solid rgba(255,246,226,.13);animation:lrfade .3s ease-out both;animation-delay:calc(.4s + var(--n,4) * .08s)}
.lr-linebox h4,.lr-chart h4{margin:0 0 4px;font-family:var(--font-t);font-size:.66rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--dim)}
.lr-linebox .playlog{margin:0;font-size:.88rem}
.lr-tog{display:inline-block;margin:6px 0 0;padding:0;border:0;background:none;color:var(--gold);font:inherit;font-size:.82rem;text-decoration:underline;text-underline-offset:2px;cursor:pointer}
.lr-tog:hover,.lr-tog:focus-visible{color:var(--gold-x);outline:0}
.lr-sol{margin-top:6px}
/* the comparison block: the game-over badge with "Top 5%" and one sentence, then everyone's attempts at half height and the head count. The headline's
   height is reserved from the start, so the numbers arriving never move the panel */
.lr-cmpblock{padding-top:var(--gap);border-top:2px solid rgba(255,246,226,.13);animation:lrfade .3s ease-out .25s both}
.lr-head{position:relative;display:flex;align-items:center;gap:.6rem;min-height:2.8rem}
.lr-badge{position:relative;flex:none;width:2.6rem;height:2.6rem;filter:drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.lr-badge i{position:absolute;inset:0;background:center/contain no-repeat}
.lr-badge .h{background-image:url(/img/ui/game_over_screen/badge_outline.webp);opacity:.1}
.lr-badge.bronze .h{background-image:url(/img/ui/game_over_screen/badge_bronze.webp);opacity:1}
.lr-badge.silver .h{background-image:url(/img/ui/game_over_screen/badge_silver.webp);opacity:1}
.lr-badge.gold .h{background-image:url(/img/ui/game_over_screen/badge_gold.webp);opacity:1}
.lr-badge .g.speedy{background-image:url(/img/ui/game_over_screen/badge_speedy.webp)}
.lr-badge .g.perfect{background-image:url(/img/ui/game_over_screen/badge_perfect.webp)}
.lr-head.wait .lr-badge .h{animation:lrwait 1s ease-in-out infinite alternate}
.lr-head.in.ranked .lr-badge{animation:lrbadge .25s cubic-bezier(.2,1.35,.4,1) both}
.lr-head.in .lr-head-t,.lr-head.down .lr-head-t{animation:lrfade .3s ease-out both}
.lr-head-t{flex:1 1 auto;min-width:0;display:grid;gap:2px}
/* "Top 5%" at a section heading's size, not a display number (Bean, 17 Sep 2026) */
.lr-big{font-size:1.15rem;line-height:1.1;letter-spacing:.01em;color:var(--gold);font-variant-numeric:tabular-nums;text-shadow:0 0 2px #4a3c2a,1px 1px 0 #4a3c2a,-1px 1px 0 #4a3c2a,1px -1px 0 #4a3c2a,-1px -1px 0 #4a3c2a,0 2px 0 rgba(0,0,0,.55)}
.lr-say{font-size:.92rem;line-height:1.25}
.lr-say.quiet{font-size:.88rem;line-height:1.3;color:var(--muted);text-shadow:none}
/* the rest of the block: empty (and closed) until the API answers, then it opens; it stays closed when no answer comes (the headline says so) */
.lr-cmp{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s cubic-bezier(.22,1,.36,1)}
.lr-cmp.in{grid-template-rows:1fr}
.lr-cmp-in{min-height:0;overflow:hidden}
.lr-cmp.in .lr-cmp-in{padding-top:8px;animation:lrfade .35s ease-out both}
.lr-n{margin:4px 0 0;font-size:.82rem;line-height:1.3;color:var(--muted)}
.lr-cols{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px;height:2rem}
.lr-cols .c{display:flex;flex-direction:column;justify-content:flex-end;gap:2px;height:100%}
.lr-cols .c i{display:block;height:calc((100% - .8rem) * var(--h,0) / 100);min-height:2px;border-radius:2px 2px 0 0;background:linear-gradient(#4aa3a6,#2f7477)}
.lr-cols .c.me i{background:linear-gradient(var(--gold-x),var(--gold-d))}
.lr-cols .c span{font-size:.66rem;line-height:1;text-align:center;color:var(--muted)}
.lr-cols .c.me span{color:var(--gold-x);font-weight:700}
/* the defeat state: the rows alone */
.lr-next{margin:var(--gap) 0 0;text-align:center;font-size:.88rem;line-height:1.2;color:var(--muted)}
.lr-next b{color:#FFF6E2;font-variant-numeric:tabular-nums}
/* the plates keep to the content box (Bean, 17 Sep 2026: room between the buttons and the pop-up's edge), equal gaps between them */
.lr-btns{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:var(--gap);padding:0 1.5rem}
.lr-btns .btn{flex:1 1 auto}
.lr-next,.lr-btns{animation:lrfade .3s ease-out both;animation-delay:calc(.4s + var(--n,4) * .08s)}
.lr-panel .share-out{min-height:5.2rem;font-size:.85rem}
.lr-reopen{margin-top:4px}
@keyframes lrfade{from{opacity:0}}
@keyframes lrpanel{from{opacity:0;transform:translateY(100px)}}
@keyframes lrbanner{from{opacity:0;transform:translateY(-52px) scale(1.08)}}
@keyframes lrline{from{opacity:0;transform:translateX(-24px)}}
@keyframes lrbadge{from{opacity:0;transform:translateY(40px)}}
@keyframes lrwait{from{opacity:.06}to{opacity:.17}}
@media (max-width:640px){
  .lr-ov{padding:calc(var(--tb-h,65px) + 1.9rem) .6rem .8rem}
  .lr-panel{--side:1.7rem;width:100%;padding:3.2rem .8rem var(--side)}
  .lr-banner{left:-1rem;right:-1rem;top:-1.9rem}
  .lr-panel>.daymark.lr-day{top:-.7rem;left:-.2rem}
  .lr-mask{padding:12px 1.35rem 12px 1rem}
  .lr-btns{padding:0 .9rem}
  .lr-head{gap:.5rem;min-height:2.6rem}.lr-badge{width:2.4rem;height:2.4rem}.lr-big{font-size:1.05rem}.lr-say{font-size:.88rem}.lr-say.quiet{font-size:.84rem}
  .lr-lines{grid-template-columns:repeat(auto-fit,minmax(3.3rem,1fr));gap:4px}
  .lr-line{padding:5px 1px 4px}.lr-line .v{font-size:1rem}.lr-line .l{font-size:.55rem;letter-spacing:.04em}.lr-line img,.lr-line .lr-noico{width:1.3rem;height:1.3rem}
}
/* reduced motion: the pop-up is simply there */
.lr-ov.still,.lr-ov.still *{animation:none!important;transition:none!important}
@media (prefers-reduced-motion:reduce){.lr-ov,.lr-ov *{animation:none!important;transition:none!important}}

/* ===== app/modes.css ===== */
/* ===== Run modes (/modes): app/pages_potions.js, the "run modes: the main menu" block; docs/wave3/potions-epochs-modes.md, docs/wave4/wp3.md, docs/wave5/wp2.md =====
   Moved here from potions.css in wave 5 (22 Sep 2026, WP2) so the page has its own file; every rule below is the run modes page's. Bundled in name order, so it
   sorts after detailpage.css, enemyturns.css and factbox.css (the fact boxes it lays out) and before potions.css and timeline.css (the span grid rules,
   .dp-facts.spg, live in timeline.css: they serve the epoch page and this one). */
.md-menu{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--gap);margin:var(--stack) 0}
.md-tab{display:flex;flex-direction:column;align-items:center;gap:8px;padding:9px 9px 11px;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.1);color:var(--text);text-decoration:none;transition:transform .5s cubic-bezier(.16,1,.3,1),border-color .15s;-webkit-tap-highlight-color:transparent}
.md-tab img,.md-art img{display:block;width:100%;height:auto;aspect-ratio:380/288;object-fit:cover;border-radius:6px;box-sizing:border-box;border:2px solid #f4d2a9;box-shadow:0 3px 0 rgba(0,0,0,.5)}
.md-tab b{font-family:var(--font-t);font-weight:700;font-size:1.1rem;color:var(--gold);text-shadow:1px 1px 0 #333127,-1px 1px 0 #333127,1px -1px 0 #333127,-1px -1px 0 #333127,0 2px 3px rgba(0,0,0,.6)}
.md-tab:hover,.md-tab:focus-visible{transform:scale(1.025);transition-duration:.05s;border-color:var(--gold);text-decoration:none}
.md-tab:hover b{color:#fff3cf}
/* QoL (wave 6, 23 Sep 2026): a keyboard stop on a mode tab keeps the site's focus ring (style.css :focus-visible); a gold 1 px border and a 2.5 % scale were all it showed */
/* the section banner "How each mode plays" (banner.js secBanner, banner.css, its own margins) stands between the tabs and the first mode plate: the divider between
   the top of the page and the fine detail (wave 5; the overview audit's 2.7 counted one on every mode, there was none; Bean, 22 Sep 2026: "to begin fine detail we
   always need that one section as a divider that feels more solid"). The banner's tagline names the modes it heads */
/* a mode: its painting, the game's own description, every rule as a plate */
.md{margin-top:calc(var(--stack) + 4px);scroll-margin-top:calc(var(--tb-h) + 14px);border-radius:12px;background:rgba(0,0,0,.24);border:1px solid rgba(255,255,255,.08);outline:none}
.md-h{display:grid;grid-template-columns:14rem minmax(0,1fr);gap:18px;align-items:center;padding:16px var(--pad) 8px}
.md-art img{border-radius:8px;box-shadow:0 4px 0 rgba(0,0,0,.45)}
.md-t h2{margin:0 0 6px;font-size:1.75rem;line-height:1.1}
.md-desc{margin:0;font-size:1.12rem;line-height:1.45;color:#fff6e2}
/* THE RULES ARE THE ENEMY PAGE'S BOXES (wave 4, 21 Sep 2026; the wave's design law: pages_potions.js mdFact builds them with pages_acts.js factBox / factRow, the look
   is enemyturns.css .ew-fact, untouched). SINCE WAVE 5 (22 Sep 2026, WP2) the rows are the span grid (pages_potions.js epFactGrid, timeline.css .dp-facts.spg): a box is
   as wide as its value needs at every width, so a value is never cut ("Up to your high..." at 1345 px, "Rolled eac..." at 390 were; overview audit MO1), and the value
   itself is two or three words with the rule's sentence as its hover. They replaced the .md-rule plates (a ragged auto-fill grid: "Seed: Random every run." in a 170 px
   box, "Modifiers: None." on a row of its own) and their "In the code: ..." notes (.md-src): no developer words on a page. */
.md-facts{padding:10px var(--pad) 4px}
.md-facts .ew-facts{margin:0}
/* the Daily's modifier pools, in view under the boxes: a quiet caps label, then the modifiers' icons */
.md-pools{display:grid;gap:10px;padding:8px var(--pad) 4px}
.md-pool-l{display:block;margin-bottom:6px;font-family:var(--font-t);font-size:.7rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;line-height:1;color:var(--dim)}
.md-pool .md-mods{margin-top:0}
/* one fold per mode: every rule in full, label beside sentence (under it on a phone) */
.md .md-more{margin:6px var(--pad) 14px}
.md-all{display:grid;gap:10px;margin:8px 0 2px}
.md-all>div{display:grid;grid-template-columns:8.5rem minmax(0,1fr);gap:2px 16px;align-items:baseline}
.md-all dt{font-family:var(--font-t);font-size:.74rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--gold-x)}
.md-all dd{margin:0;max-width:78ch;font-size:.98rem;line-height:1.45;color:var(--text)}
.md-sub{margin:6px 0 0;display:grid;gap:3px}
.md-sub div{display:flex;flex-wrap:wrap;gap:0 6px}
.md-sub dt{font-family:var(--font-t);font-size:.82rem;letter-spacing:.06em;color:var(--gold-x)}
.md-sub dt::after{content:":"}
.md-sub dd{margin:0}
.md-mods{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.md-mods-l{flex-basis:100%;margin-top:6px;font-family:var(--font-t);font-size:.76rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.md-mods-l:first-child{margin-top:2px}
.md-mod{display:inline-flex;align-items:center;gap:6px;padding:3px 10px 3px 4px;border-radius:8px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.1);color:var(--text);font-family:var(--font-t);font-size:.9rem;text-decoration:none;transition:border-color .15s}
.md-mod img{width:1.9rem;height:1.9rem;object-fit:contain}
a.md-mod:hover,a.md-mod:focus-visible{border-color:var(--gold);color:#fff;text-decoration:none}
/* the character heads in the fold (who can play the mode): each is a link with the character's pop-up (data-tip, wave 5) */
.md-chars{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px}
.md-chars img{width:2.4rem;height:2.4rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6));transition:scale .5s cubic-bezier(.16,1,.3,1)}
.md-chars img.off{opacity:.35;filter:grayscale(1)}
.md-chars a:hover img{scale:1.12;transition-duration:.05s}
.md-badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
.md-badges a{display:inline-flex;align-items:center;gap:7px;padding:3px 10px 3px 4px;border-radius:8px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.1);color:var(--text);font-family:var(--font-t);font-size:.9rem;text-decoration:none}
.md-badges img{width:2rem;height:2rem;object-fit:contain}
.md-badges a:hover{border-color:var(--gold);color:#fff;text-decoration:none}
/* QoL (wave 6, 23 Sep 2026): on a touch screen every link on the page is at least 40 px on each side: the modifier and badge plates were 37 and 38 px tall, a character head
   36 px wide (its 2.4rem picture); the plates get a 40 px floor, the heads 2 px of room round the picture (nothing else moves) */
@media (hover:none) and (pointer:coarse){.md-mod,.md-badges a{box-sizing:border-box;min-height:40px}.md-chars a{display:inline-flex;padding:2px}}   /* the site's touch rule (style.css) */
.md-modes{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
.md-modes a{display:inline-flex;align-items:center;gap:8px;padding:3px 10px 3px 3px;border-radius:8px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.1);color:var(--text);font-family:var(--font-t);font-size:.9rem;text-decoration:none}
.md-modes img{width:3rem;height:auto;aspect-ratio:380/288;object-fit:cover;border-radius:3px;box-sizing:border-box;border:1px solid #f4d2a9}
.md-modes a:hover{border-color:var(--gold);color:#fff;text-decoration:none}
/* the run summary's score lines */
/* the five score lines are the same fact boxes: all five in one row, three over two on a narrower block, two per row on a phone (the fifth takes the last row).
   The values are the fewest words that still say the unit ("10 each", "1 per 100", "+10% each"; the line in full is the hover), so five fit one row at 1345 px
   and two fit a phone's row (wave 5) */
.md-score-b{container:mdscore/inline-size;padding:6px var(--pad) 16px}
.md-score .md-plates{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin:0}
.md-score .md-plates .ew-fact{min-width:0}
.md-score .md-plates .ew-fact-row{flex:1}
.md-score .md-plates .ew-fact-t{font-size:.98rem}
@container mdscore (max-width:60rem){
  .md-score .md-plates{grid-template-columns:repeat(6,minmax(0,1fr))}
  .md-score .md-plates>.ew-fact{grid-column:span 2}
  .md-score .md-plates.n5>.ew-fact:nth-child(n+4),.md-score .md-plates.n4>.ew-fact{grid-column:span 3}
}
@container mdscore (max-width:32rem){
  .md-score .md-plates{grid-template-columns:repeat(2,minmax(0,1fr))}
  .md-score .md-plates>.ew-fact,.md-score .md-plates.n5>.ew-fact:nth-child(n+4),.md-score .md-plates.n4>.ew-fact{grid-column:auto}
  .md-score .md-plates.n5>.ew-fact:last-child,.md-score .md-plates.n3>.ew-fact:last-child{grid-column:1/-1}
}
.md-score details.more{margin-top:12px}
.md-rank{margin:.4rem 0 .6rem;padding-left:1.3rem}
.md-rank li{margin:.3rem 0}
.md-rank b{color:#fff}
/* a tall sprite stays inside its icon slot: the Ascension flame is 88 x 128 and the fact icon's 92% height does not resolve, so it stood 52 px tall in a 42 px slot and
   hung over the box's lower edge on /modes. A square box with the sprite contained in it; a square sprite is unchanged (the epoch page has the same rule in timeline.css) */
.mdpage .ew-fact-i .ew-fact-3d .mi{aspect-ratio:1;object-fit:contain}
/* A 48 PX SPRITE IS NEVER DRAWN LARGER THAN ITS PIXELS (wave 4, overview audit MD3: the run summary's score_* signs are 48 x 48 and were drawn at 2.5 to 3.2rem,
   up to 1.56 times their size on Bean's 1.5x screen: blurry). On a dense screen they are held at 32 CSS px = 48 device px at 1.5x; on a 1x screen the rem size is
   already under 48 px. In a fact box the 3D wrapper is sized, not the image, so the rim and sheen layers (masks of the same sprite) still sit on it. */
@media (min-resolution:1.25dppx){
  .ew-fact-i:has(.mi.s48) .ew-fact-3d{width:35px;height:35px}   /* a descendant match: core.js wraps the sprite in its tilt layer while it is hovered */
}
@media (max-width:900px){
  .md-h{grid-template-columns:11rem minmax(0,1fr)}
}
@media (max-width:640px){
  .md-menu{grid-template-columns:repeat(2,minmax(0,1fr))}
  .md-h{grid-template-columns:1fr;gap:12px}
  .md-art img{max-width:15rem}
  .md-all>div{grid-template-columns:minmax(0,1fr)}
}

/* ===== app/multiplayer.css ===== */
/* ===== /multiplayer (wave 5, MULTIPLAYER stream, 22 Sep 2026; markup app/pages_multiplayer.js; docs/wave5/multiplayer.md) =====
   Every rule is scoped under .mppage. The page reuses the site's parts as they are: the hero grid (style.css .hero), the fact boxes (factbox.css), the section banner
   (banner.css), the housed tile (tilehousing.css), the small card grid (the detail page's .syn-cards sizes), the duo housing (character.css .cduo-*) and the plate button
   (buttons.css). What is new here: the lobby stage (four stills in two rows), the solo / co-op ladder strip, the HP scale plates, the icon rows in two columns, the room
   tiles with the rock, paper, scissors arms, the relic chip rows, the badge plates. Nothing moves on hover except a still's lift and the parts' own hover states. */

/* ---------- the hero: the lobby plate beside the lede and the boxes ---------- */
.mppage .mp-hero{grid-template-columns:minmax(14rem,23rem) minmax(0,1fr);align-items:stretch}
.mppage .mp-lobby{position:relative;display:flex;flex-direction:column;justify-content:flex-end;min-width:0;border-radius:14px;overflow:hidden;
  background:radial-gradient(90% 70% at 50% 40%,rgba(111,211,201,.13),transparent 70%),linear-gradient(rgba(0,0,0,.12),rgba(0,0,0,.4)),rgba(0,0,0,.25);border:1px solid rgba(255,255,255,.08)}
/* the stage: the stills stand on one floor line (the plate's caption band), the back pair smaller and higher up */
.mppage .mp-stage{position:relative;height:16.5rem;min-height:100%;flex:1 1 auto}
.mppage .mp-stage::after{content:"";position:absolute;left:8%;right:8%;bottom:1.8rem;height:1.6rem;border-radius:50%;background:radial-gradient(50% 50% at 50% 50%,rgba(0,0,0,.55),transparent 70%);pointer-events:none}
.mppage .mp-fig{position:absolute;bottom:1.9rem;display:block;height:12rem;filter:drop-shadow(0 10px 8px rgba(0,0,0,.6));transition:translate .35s cubic-bezier(.16,1,.3,1),filter .2s;z-index:2}
.mppage .mp-fig img{display:block;height:100%;width:auto;object-fit:contain;object-position:50% 100%}
.mppage .mp-fig.flip img{scale:-1 1}   /* the right pair faces its partner, as the duo housing mirrors the partner */
/* the two-column hero (over 1100 px): a narrow, tall stage, so the back pair stands higher and wide apart, each clear of the front pair's heads (Bean,
   25 Sep 2026, the Regent circled behind the Ironclad: "the regent is blocked here can we make this nicer please"); its own ground shadow under it */
.mppage .mp-fig.b1,.mppage .mp-fig.b2{height:10.8rem;bottom:8.6rem;z-index:1;filter:drop-shadow(0 8px 6px rgba(0,0,0,.55)) brightness(.86)}
.mppage .mp-fig.f1{left:-3%}.mppage .mp-fig.f2{right:-3%}
.mppage .mp-fig.b1{left:23%}.mppage .mp-fig.b2{right:12%}
.mppage .mp-stage::before{content:"";position:absolute;left:18%;right:10%;bottom:8.3rem;height:1.3rem;border-radius:50%;background:radial-gradient(50% 50% at 50% 50%,rgba(0,0,0,.42),transparent 70%);pointer-events:none}
.mppage .mp-fig:hover{translate:0 -6px;filter:drop-shadow(0 14px 10px rgba(0,0,0,.6)) drop-shadow(0 0 10px color-mix(in srgb,var(--c) 45%,transparent));z-index:3}
.mppage .mp-lobby-cap{display:flex;align-items:center;justify-content:center;gap:8px;padding:8px 12px 9px;border-top:1px solid rgba(255,255,255,.08);background:rgba(0,0,0,.3);font-family:var(--font-t);font-size:.86rem;letter-spacing:.04em;color:var(--muted);text-align:center}
.mppage .mp-lobby-cap .mi{width:1.15rem;height:1.15rem;flex:none;opacity:.85}
.mppage .mp-hero .infocol>.lead{margin:0 0 6px}
.mppage .mp-hero .infocol>.lead+.lead{margin-bottom:14px}
.mppage .mp-hero .infocol>.lead{max-width:none}

/* ---------- the sections: a body under each banner ---------- */
.mppage .mp-body{padding:16px 2px 4px}
.mppage .mp-body>p,.mppage .mp-note{margin:0 0 12px;max-width:72ch;line-height:1.5}
.mppage .mp-note a{color:var(--gold)}
/* one row: the 3D cell (the fact boxes' 2.7rem), a short head, the sentence */
.mppage .mp-row{display:flex;align-items:flex-start;gap:12px;min-width:0}
.mppage .mp-i3{flex:none;display:grid;place-items:center;width:2.7rem;height:2.7rem;margin-top:1px}
.mppage .mp-i3>.ew-fact-3d{width:100%;height:100%;cursor:default;--lift:6px;--hov-scale:1.1}
.mppage .mp-i3>.ew-fact-3d .mi{width:92%;height:92%}
.mppage .mp-i3>.ew-fact-3d :is(.shd,.rim,.sheen){inset:4%}
.mppage .mp-row-t{display:flex;flex-direction:column;gap:2px;min-width:0;line-height:1.45}
.mppage .mp-row-h{font-family:var(--font-t);font-size:1.02rem;color:#fff6e2;line-height:1.2}
.mppage .mp-row-x{color:var(--text)}
.mppage .mp-row-x a{color:var(--gold)}
.mppage .mp-grid2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 28px}
.mppage .mp-grid2 .mp-row{padding:10px 12px 10px 10px;border-radius:10px;background:rgba(0,0,0,.22);border:1px solid rgba(255,255,255,.06)}

/* ---------- How the map changes: the two ladders beside the rows ---------- */
.mppage .mp-mapgrid{display:grid;grid-template-columns:minmax(15rem,21rem) minmax(0,1fr);gap:16px 30px;align-items:stretch}
.mppage .mp-strip{display:flex;flex-direction:column;justify-content:center;gap:8px;padding:12px 12px 10px;border-radius:12px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);box-shadow:inset 0 1px 0 rgba(255,255,255,.04)}
.mppage .mpstrip{display:block;width:100%;height:auto;max-height:22rem}
.mppage .mps-node{fill:none;stroke:#cdbf9a;stroke-width:1.4;opacity:.5}
.mppage .mps-fixed{fill:#e9dcb4}
.mppage .mps-gone{fill:rgba(111,211,201,.1);stroke:rgba(111,211,201,.55);stroke-width:1;stroke-dasharray:3 3}
.mppage .mps-lab{font:600 12px var(--font-t);fill:var(--muted);letter-spacing:.02em}
.mppage .mps-lab.hi{fill:#fff6e2;font-size:13.5px}
.mppage .mp-strip-n{font-size:.84rem;line-height:1.35;color:var(--dim)}
.mppage .mp-strip-n a{color:var(--gold)}
.mppage .mp-rows{display:flex;flex-direction:column;justify-content:space-evenly;gap:12px;padding:2px 0}

/* ---------- Fights with friends: the scale plates ---------- */
.mppage .mp-scale{display:flex;flex-wrap:wrap;align-items:stretch;gap:8px;margin:0 0 16px}
.mppage .mp-scale-l{display:inline-flex;align-items:center;gap:8px;padding:6px 12px 6px 8px;border-radius:9px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);font-family:var(--font-t);font-size:.98rem;color:#fff6e2}
.mppage .mp-scale-l .mi{width:1.5rem;height:1.5rem;flex:none}
.mppage .mp-scale-k{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;min-width:5.6rem;padding:5px 12px 6px;border-radius:9px;
  background:linear-gradient(rgba(255,255,255,.05),rgba(0,0,0,.18)),rgba(255,96,88,.1);border:1px solid rgba(255,96,88,.35);box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 3px 0 rgba(0,0,0,.35)}
.mppage .mp-scale-k small{font-family:var(--font-t);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);line-height:1.1}
.mppage .mp-scale-k b{font-family:var(--font-d);font-size:1.25rem;line-height:1.1;color:#ff9a94;text-shadow:0 2px 0 rgba(0,0,0,.5)}

/* ---------- Rooms with friends: four tiles ---------- */
.mppage .mp-tiles{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.mppage .mp-tile{display:grid;grid-template-columns:8.5rem minmax(0,1fr);gap:0;min-width:0;border-radius:12px;overflow:hidden;background:rgba(0,0,0,.24);border:1px solid rgba(255,255,255,.08);box-shadow:0 4px 0 rgba(0,0,0,.35)}
.mppage .mp-tile-art{position:relative;min-height:9rem;display:grid;place-items:center;overflow:hidden;background:radial-gradient(80% 70% at 50% 60%,rgba(239,200,81,.12),transparent 72%),rgba(0,0,0,.3);border-right:1px solid rgba(255,255,255,.06)}
.mppage .mp-tile-img{display:block;width:100%;height:100%;max-height:9rem;object-fit:cover;object-position:50% 50%}
.mppage .mp-tile-img.ico{width:5rem;height:5rem;object-fit:contain;filter:drop-shadow(0 4px 4px rgba(0,0,0,.6))}
/* the arms rise from the tile's foot; the box shows the hands and the wrists, the rest is under the floor */
.mppage .mp-hands{position:absolute;inset:0;pointer-events:none}
.mppage .mp-hands img{position:absolute;bottom:-12.8rem;display:block;height:20rem;width:auto;filter:drop-shadow(0 4px 4px rgba(0,0,0,.6));transform-origin:50% 100%}
.mppage .mp-hands img:nth-child(1){left:-2%;rotate:-7deg;bottom:-13.4rem}
.mppage .mp-hands img:nth-child(2){left:50%;translate:-50% 0;z-index:1}
.mppage .mp-hands img:nth-child(3){right:-2%;rotate:7deg;bottom:-13.4rem}
.mppage .mp-tile-chest{grid-template-columns:11rem minmax(0,1fr)}
.mppage .mp-tile-t{display:flex;flex-direction:column;gap:6px;padding:12px 14px 12px;min-width:0}
.mppage .mp-tile-h{display:flex;align-items:center;gap:8px;font-family:var(--font-t);font-size:1.08rem;color:#fff6e2;line-height:1.2}
.mppage .mp-tile-h .mi{width:1.5rem;height:1.5rem;flex:none;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.mppage .mp-tile-t p{margin:0;line-height:1.45;font-size:.98rem}
.mppage .mp-tile-t p a{color:var(--gold)}
.mppage .mp-evlist{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}
.mppage .mp-ev{display:inline-flex;align-items:center;min-height:1.6rem;padding:0 9px;border-radius:7px;border:1px solid rgba(111,211,201,.4);background:rgba(0,0,0,.3);font-family:var(--font-t);font-size:.84rem;color:#bfeee9;text-decoration:none;white-space:nowrap}
.mppage .mp-ev:hover{border-color:#6fd3c9;color:#fff;text-decoration:none}

/* ---------- Relics for multiplayer ---------- */
.mppage .mp-relicrow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.mppage .mp-relic{display:flex;align-items:flex-start;gap:12px;min-width:0;padding:12px 12px 10px 10px;border-radius:12px;background:rgba(0,0,0,.24);border:1px solid rgba(255,255,255,.08)}
.mppage .mp-relic>.itemcell{flex:none}
.mppage .mp-relic-t{display:flex;flex-direction:column;gap:7px;min-width:0;padding-top:4px}
.mppage .mp-relic-t p{margin:0;font-size:.95rem;line-height:1.42}
.mppage .mp-relic-t p a{color:var(--gold)}
.mppage .mp-tag{align-self:flex-start}
.mppage .mp-relic.coop .mp-tag{--fc:#6fd3c9}
.mppage .mp-relic.solo .mp-tag{--fc:#b9cbd0}
.mppage .mp-tag .tagc-i{width:1.1rem;height:1.1rem;background-size:contain;background-position:center;background-repeat:no-repeat}
.mppage .mp-cutoff{margin-top:16px;padding:12px 14px 10px;border-radius:12px;background:rgba(0,0,0,.2);border:1px solid rgba(255,255,255,.06)}
.mppage .mp-cutoff p{margin:0 0 8px;font-size:.96rem;line-height:1.45}
.mppage .mp-cutoff-r{display:flex;flex-wrap:wrap;gap:6px 4px}
.mppage .mp-cutoff-r .relic{width:2.7rem;height:2.7rem}

/* ---------- Multiplayer cards: the small grid and the plate button ---------- */
.mppage .grid.cards.mp-cards{--cw:8.2rem;gap:16px 12px;padding:6px 0 4px}
.mppage .mp-cards .card{--hov-scale:1.32}
.mppage .mp-cta{display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px;margin-top:18px;padding-top:14px;border-top:1px solid rgba(255,255,255,.08)}
.mppage .mp-cta .fico{width:1.3em;height:1.3em;background:center/contain no-repeat;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.mppage .mp-cta-n{font-family:var(--font-t);font-size:.9rem;color:var(--dim)}

/* ---------- Best duos: the character page's housing, three pairs stacked ---------- */
.mppage .mp-duo{border-radius:12px;background:rgba(0,0,0,.2);border:1px solid rgba(255,255,255,.07)}
.mppage .mp-duo+.mp-duo{margin-top:14px}
.mppage .mp-duo .cduo-b{padding:10px 14px 16px}
.mppage .mp-duo-btns{display:flex;flex-wrap:wrap;justify-content:center;gap:8px 12px}

/* ---------- Lobby and seed: the badges ---------- */
.mppage .mp-badges-h{display:block;margin:18px 0 10px;font-family:var(--font-t);font-size:.78rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.mppage .mp-badges{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.mppage .mp-badge{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 10px 12px;text-align:center;border-radius:12px;text-decoration:none;color:var(--text);
  background:linear-gradient(rgba(255,255,255,.04),rgba(0,0,0,.2)),rgba(0,0,0,.24);border:1px solid rgba(255,255,255,.08);box-shadow:0 4px 0 rgba(0,0,0,.35);transition:border-color .15s,background-color .15s}
.mppage .mp-badge:hover{text-decoration:none;border-color:rgba(239,200,81,.55)}
.mppage .mp-badge img{display:block;width:4rem;height:4rem;object-fit:contain;filter:drop-shadow(0 4px 4px rgba(0,0,0,.6));transition:translate .3s cubic-bezier(.16,1,.3,1)}
.mppage .mp-badge:hover img{translate:0 -3px}
.mppage .mp-badge b{font-family:var(--font-t);font-size:1rem;color:#fff6e2;line-height:1.2}
.mppage .mp-badge span{font-size:.84rem;line-height:1.3;color:var(--muted)}

/* ---------- narrow ---------- */
/* up to 1100 px the column beside the lobby would be too narrow for the boxes: the hero is one column and the lobby is a line-up of the four on one floor */
@media (max-width:1100px){
  .mppage .mp-hero{grid-template-columns:1fr;align-items:start}
  .mppage .mp-stage{height:13rem;min-height:0}
  .mppage .mp-fig,.mppage .mp-fig.b1,.mppage .mp-fig.b2{height:10.5rem;bottom:2rem;filter:drop-shadow(0 10px 8px rgba(0,0,0,.6))}
  .mppage .mp-fig.b1,.mppage .mp-fig.b2{z-index:1}
  .mppage .mp-fig.f1{left:8%}.mppage .mp-fig.f2{right:8%}.mppage .mp-fig.b1{left:30%}.mppage .mp-fig.b2{right:30%}
  .mppage .mp-stage::after{bottom:1.4rem;height:1.4rem;left:4%;right:4%}
  .mppage .mp-stage::before{display:none}
  .mppage .mp-hero .infocol>.lead{max-width:72ch}}
@media (max-width:1000px){
  .mppage .mp-grid2{gap:12px 16px}
  .mppage .mp-relicrow{grid-template-columns:1fr}
  .mppage .mp-badges{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:900px){
  .mppage .mp-grid2{grid-template-columns:1fr}
  .mppage .mp-tiles{grid-template-columns:1fr}}
@media (max-width:760px){
  .mppage .mp-mapgrid{grid-template-columns:minmax(13rem,16rem) minmax(0,1fr);gap:14px 18px}}
@media (max-width:640px){
  .mppage .mp-body{padding:12px 0 2px}
  .mppage .mp-mapgrid{grid-template-columns:1fr}
  .mppage .mp-strip{max-width:24rem;width:100%;margin:0 auto}
  .mppage .mp-stage{height:11rem}
  .mppage .mp-fig,.mppage .mp-fig.b1,.mppage .mp-fig.b2{height:8.6rem;bottom:1.6rem}
  .mppage .mp-tile{grid-template-columns:6.6rem minmax(0,1fr)}
  .mppage .mp-tile-art{min-height:7.6rem}
  .mppage .mp-tile-chest{grid-template-columns:8.6rem minmax(0,1fr)}
  .mppage .mp-hands img{height:16rem;bottom:-10rem}.mppage .mp-hands img:nth-child(1),.mppage .mp-hands img:nth-child(3){bottom:-10.5rem}
  .mppage .mp-scale-l{flex:1 1 100%;justify-content:center}
  .mppage .mp-scale-k{flex:1 1 auto;min-width:4.6rem;padding:4px 8px 5px}
  .mppage .mp-relic{padding:10px 10px 8px 8px;gap:10px}
  .mppage .grid.cards.mp-cards{--cw:7.4rem;gap:14px 10px}
  .mppage .mp-badges{gap:8px}
  .mppage .mp-badge{padding:10px 6px}.mppage .mp-badge img{width:3.4rem;height:3.4rem}}
@media (max-width:640px) and (hover:none){.mppage .grid.cards.mp-cards{--cw:6rem}}
@media (max-width:420px){
  .mppage .mp-badges{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mppage .mp-tile{grid-template-columns:5.8rem minmax(0,1fr)}
  .mppage .mp-stage{height:10rem}
  .mppage .mp-fig,.mppage .mp-fig.b1,.mppage .mp-fig.b2{height:7.8rem;bottom:1.4rem}
  .mppage .mp-fig.f1{left:4%}.mppage .mp-fig.f2{right:4%}.mppage .mp-fig.b1{left:29%}.mppage .mp-fig.b2{right:29%}}
/* QoL pass (wave 6, docs/wave6/qol-glossary.md): on a touch screen the event chips are 40 px tall tap targets (24 px before; rows 6 px apart, so a pad would overlap) */
@media (hover:none) and (pointer:coarse){.mppage .mp-ev{min-height:40px}}

/* ===== app/patches.css ===== */
/* ---------- patch notes: date badge in .move rows, chapter accents ---------- */
.pdate{display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:3.4rem;padding:5px 6px;border-radius:8px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.1);font-family:var(--font-t);color:var(--gold);line-height:1.1;text-align:center}
.pdate b{font-size:1.3rem;color:#fff}.pdate span{font-size:max(.7rem,11px);letter-spacing:.06em;text-transform:uppercase;color:var(--dim);white-space:nowrap} /* 11px floor: .7rem is 10.5px at the phone root */
.pdate:hover{border-color:var(--gold);text-decoration:none}
.pn-row .mn a{color:#fff}.pn-chips{gap:6px;margin:4px 0 6px}
.pn-hist .mv{color:var(--text)}.pn-intro p{margin:.4rem 0 .8rem}
/* ----- the version page's items (wave 5, 22 Sep 2026; patches.js pnItemsHead / pnCardTile / pnTile; audit PV1, PV2): the page's banner heads the section, the chapter box
   under it has no head of its own; cards are the item page's small card grid (detailpage.css .syn-cards), which on a no-hover device would go one card per row with a
   caption it does not have here, so the version page keeps the directory's columns there; relics, potions and powers are the housed directory tiles. ----- */
.secban.pn-ban+.chap.pn-itemsec{margin-top:14px}
.chap.pn-itemsec>.chap-b{padding-top:14px}
.pn-itemsec .kick:first-child{margin-top:0}
@media (hover:none){.grid.cards.syn-cards.pn-cards{grid-template-columns:repeat(auto-fill,minmax(var(--cw),1fr));justify-items:center;gap:14px 10px}.pn-cards .syn-it{display:block}}
.ch-history{--acc:var(--blue)}.ch-pn-content{--acc:var(--teal)}.ch-pn-balance{--acc:var(--gold)}.ch-pn-bugfix{--acc:var(--green)}.ch-pn-ui{--acc:var(--purple)}.ch-pn-art{--acc:var(--orange)}.ch-pn-audio{--acc:var(--purple)}.ch-pn-wording{--acc:var(--muted)}.ch-pn-perf{--acc:var(--red)}.ch-pn-modding{--acc:var(--muted)}.ch-pn-issues{--acc:var(--red)}.ch-pn-notes{--acc:var(--blue)}
/* ----- the index, wave 4 WP6 (21 Sep 2026; patches.js pnRow): a row is its date, title, count chips and ONE row of item chips. .pn-chipsrow has a fixed height and wraps, so a
   chip that does not fit drops to a hidden second line whole (never half a chip; the 14 px row gap keeps that line clear of the clip's edge, the 3 px of padding, taken back
   by the margin, keeps a focus ring inside it). "All N items" stands beside the row, under it on a phone, and is exact whatever is hidden. ----- */
.pn-row>div{min-width:0}
.pn-items{--pnh:2.15rem;flex-wrap:nowrap;align-items:flex-start;gap:8px;margin-top:2px}
.pn-chipsrow{flex:1 1 0;min-width:0;display:flex;flex-wrap:wrap;gap:14px 8px;height:calc(var(--pnh) + 6px);margin:-3px;padding:3px;overflow:hidden}
.pn-items a{flex:none;box-sizing:border-box;max-width:100%;height:var(--pnh);padding-top:0;padding-bottom:0;white-space:nowrap}
.pn-items .pn-all{border-color:color-mix(in srgb,var(--gold) 45%,transparent);color:var(--gold-x)}
@media (max-width:640px){.pn-items{flex-direction:column;gap:6px}.pn-chipsrow{flex:none;align-self:stretch}}
.pn-items .pn-all::after{content:"";width:.42em;height:.42em;margin:0 1px 0 2px;border:solid currentColor;border-width:2px 2px 0 0;rotate:45deg}
.pn-old{margin:8px 0 0;font-size:.92rem}
@media (hover:none) and (pointer:coarse){.pn-items{--pnh:2.75rem}}
/* touch (wave 6 QoL, 23 Sep 2026): a row's title link was 21 px tall; it reaches 40 px without moving a line (the padding is taken back by the margin; the count chips
   under it are not links, the item chips over it are the row above's hidden second line) */
@media (hover:none) and (pointer:coarse){.pn-row .mn a{display:inline-block;padding-block:10px;margin-block:-10px}}

/* ===== app/plate.css ===== */
/* ===== THE GAME'S PLATE FOR SECTIONS FULL OF GAME ART (23 Sep 2026) =====
   Bean, 23 Sep 2026, beside a character page's "Ironclad card pool" chapter (the rounded box, the accent stripe at its left, the glyph in a grey square): "I would like to get
   rid of this box housing style. We can use something similar for info only sections, but anything that has heavy game imagery needs something that feels like it belongs in
   the game as the housing, specifically the second image ive attached. I like that style ... generally the second and third image I've attached is okay. Maybe just a bit
   darker to fit the site theme." The second image is the section banner (banner.css .secban: the game's settings tab as a nine-slice, the icon in its socket); the third the
   character page's relics and potions housings (character.css .cown).
   Then, beside a text chapter ("What to pick up"): "and we need to completely remove this styling from the site, the housing an left side color line". So EVERY
   chapter (.chap) wears the banner's plate (first only the ones holding game art did, a text chapter keeping the old box): the same sprite, rim, dark wash (the darker one, banner.css), ledge and socket, the title in the site's cream a step under the banner's
   size so the banner stays the one that opens the fine detail. The old box and its accent stripe are gone everywhere. No markup changes; the chapter's glyph (#, the
   star, the ?) gives way to the game's own icon: for what the chapter holds when it holds game art, else for its kind (a chapter that already has a game icon keeps it). The socket is
   drawn by the head's ::before (the rim) and ::after (the well), so the icon element can carry the art as its background. Cards still pop past the plate on hover (shelf.css:
   overflow stays visible; the shelf's side room is its own, the plate's border stands in for the old padding). */
.page section.chap{
  --sbw:20px;--sb:var(--acc,var(--gold));--pico:url(/img/packed/main_menu/submenu_history_icon.webp);
  overflow:visible;isolation:isolate;margin-left:-4px;margin-right:-4px;border-radius:0;background:none;
  border:var(--sbw) solid transparent;border-image:url(/img/ui/settings_tab_selected.webp) 40 fill / var(--sbw) / 0 round;filter:drop-shadow(0 5px 0 rgba(0,0,0,.5))}
.page section.chap::before{
  display:block;content:"";position:absolute;inset:calc(var(--sbw)*-.55);width:auto;z-index:-1;pointer-events:none;border-radius:6px;
  background:linear-gradient(rgba(255,255,255,.04),rgba(255,255,255,0) 38%,rgba(0,0,0,0) 62%,rgba(0,0,0,.22)),linear-gradient(rgba(0,0,0,.54),rgba(0,0,0,.54)),radial-gradient(14rem 100% at 0% 0%,color-mix(in srgb,var(--sb) 12%,transparent),transparent 70%)}
/* the head: the banner's head a step smaller, a hairline under it */
.page section.chap>.chap-h{
  position:relative;isolation:isolate;gap:14px;min-height:2.6rem;margin:calc(var(--sbw)*-.3) calc(var(--sbw)*-.25) 0;padding:2px 4px 10px 2px;border-bottom:1px solid rgba(255,255,255,.1)}
.page section.chap>.chap-h .chap-t h2{
  font-family:var(--font-t);font-weight:700;font-size:1.35rem;line-height:1.1;color:#fff6e2;letter-spacing:.01em;text-shadow:0 2px 0 rgba(0,0,0,.55),0 0 14px rgba(0,0,0,.35)}
/* the socket (banner.css .secban-ico's recipe at 2.9rem): the rim and the well are the head's pseudo elements, placed under the icon */
.page section.chap>.chap-h::before,
.page section.chap>.chap-h::after{
  --cut:8px;content:"";position:absolute;left:2px;top:calc(50% - 4px - 1.45rem);width:2.9rem;height:2.9rem;z-index:-2;pointer-events:none;
  clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut));
  background:linear-gradient(180deg,#86a7b3,#34515c 22%,#101d23 62%,color-mix(in srgb,var(--sb) 70%,#0c161b))}
.page section.chap>.chap-h::after{
  --cut:7px;left:4px;top:calc(50% - 4px - 1.45rem + 2px);width:calc(2.9rem - 4px);height:calc(2.9rem - 4px);z-index:-1;
  background:radial-gradient(70% 34% at 50% 96%,color-mix(in srgb,var(--sb) 40%,transparent),transparent 72%),radial-gradient(90% 80% at 50% 38%,#1a2f38,#0b151a)}
.page section.chap>.chap-h>.chap-ico{
  width:2.9rem;height:2.9rem;border-radius:0;background:none;font-size:0;color:transparent;filter:drop-shadow(0 2px 2px rgba(0,0,0,.65))}
.page section.chap>.chap-h>.chap-ico:not(:has(img)){background:var(--pico) 50% 50%/2rem 2rem no-repeat}
.page section.chap>.chap-h>.chap-ico img{display:block;width:2rem;height:2rem;object-fit:contain}
/* the game's icon: by the chapter's kind (a text chapter), then by what it holds (a chapter of game art; these come later and win) */
.page section.chap.ch-pick{--pico:url(/img/ui/emote/question.webp)}
.page section.chap.ch-notes,.page section.chap.ch-anti{--pico:url(/img/ui/emote/exclaim.webp)}
.page section.chap.ch-history{--pico:url(/img/stats/stats_clock.webp)}
.page section.chap.ch-table,.page section.chap.ch-moves{--pico:url(/img/ui/top_bar/top_bar_map.webp)}
.page section.chap.ch-syn,.page section.chap.ch-upg{--pico:url(/img/stats/stats_cards.webp)}
.page section.chap:has(.card){--pico:url(/img/stats/stats_cards.webp)}
.page section.chap:not(:has(.card)):has(.relic){--pico:url(/img/ui/game_over_screen/discovery_relic.webp)}
.page section.chap:not(:has(.card)):not(:has(.relic)):has(.potion){--pico:url(/img/stats/stats_potions_seen.webp)}
.page section.chap:not(:has(.card)):has(.itemcell>.power){--pico:url(/img/orbs/lightning_orb.webp)}
.page section.chap:has(.encstage){--pico:url(/img/ui/run_history/monster.webp)}
.page section.chap:has(.evt){--pico:url(/img/ui/run_history/event.webp)}
.page section.chap:has(.anc-spk){--pico:url(/img/ui/run_history/neow.webp)}
.page section.chap:has(.cduo-fig){--pico:url(/img/ui/top_panel/character_icon_random_character.webp)}
.page section.chap:has(.chist-art),.page section.chap:has(.gl-named){--pico:url(/img/packed/main_menu/submenu_history_icon.webp)}
.page section.chap:not(:has(.card)):not(:has(.chist-art)):has(.ep-slot){--pico:url(/img/stats/stats_clock.webp)}
.enpage section.chap:has(.gl-hw){--pico:url(/img/ui/card/card_enchant_s.webp)}
.afpage section.chap:has(.gl-afrel){--pico:url(/img/stats/stats_chain.webp)}
/* the body: the plate's border is its padding now */
.page section.chap>.chap-b{padding:12px 0 0}
.page section.chap>.shelf{padding-left:22px;padding-right:22px;scroll-padding-inline:22px;--sb-l:22px;--sb-r:22px}
@media (max-width:640px){
  .page section.chap{--sbw:16px}
  .page section.chap>.chap-h .chap-t h2{font-size:1.2rem}}

/* ===== app/potions.css ===== */
/* ===== Potions (the Potion Lab), the Timeline (epochs) and Run modes: app/pages_potions.js; docs/wave3/potions-epochs-modes.md =====
   Every measure below is the game's: potion_holder.tscn (60x60 holders, image over outline, hover x1.15 in .05 s and back in .5 s Expo-out, the outline in the pool's
   LabOutlineColor at .66, shared pools black at .5), top_bar (the potion tray plate top_bar_char_backdrop), timeline_screen (the 3 px E6C97A line with 64 px fades,
   era columns with the era glyph tinted FFCC66, name in Bitter italic E6C97A with a (3,2) black shadow, year in 86CEEB; slot_golden 272:168, slot_outline in F0C851
   pulsing .25..75 over about 1.26 s, epoch_card_back with an (8,8) shadow at .25 and a 2DE5FF glow), main_menu (submenu paintings 380x288 in their peach frame,
   hover x1.025, titles Kreon bold gold with a dark outline). */

/* ---------- potions list ---------- */
.fpick[data-art="potions"] .fpk[data-c="all"] .fpk-art{background-image:url(/img/ui/main_menu/submenu_potion_lab.webp);background-size:auto 124%;background-position:42% 30%}   /* the Potion Lab's own menu painting as the "All" portrait */
.fgrp-rar .fchip[data-v="special"]{--rc:#ee82ee}   /* the lab's fourth group: the Event and Token potions (the purple the timeline uses for a highlighted slot) */
.fgrp-use .fchip-i{width:1.15rem;height:1.15rem;background-size:contain;background-repeat:no-repeat;background-position:center}
.fgrp-use .fchip[data-v="drink"] .fchip-i{background-image:url(/img/ui/game_over_screen/discovery_potion.webp)}   /* a FULL bottle, the run summary's potion sign (Bean, 21 Sep 2026, on the potion page's Use icon: "full not empty"); it was the grey empty placeholder bottle */
.fgrp-use .fchip[data-v="throw"] .fchip-i{background-image:url(/img/ui/combat/targeting_arrow_head.webp);rotate:-90deg}
.chip.r-special{color:#ee82ee;border-color:color-mix(in srgb,#ee82ee 45%,transparent)}
/* the list has no rarity headings any more (wave 4, 21 Sep 2026: one continuous grid, Sort by rarity both ways) and the potion tile is the housed tile every item list
   uses: the eight sided frame, its rarity colours and gem are app/tilehousing.css; the potion PAGE's big showcase slot is the same frame scaled up (.pt-bigslot below) */
/* the pool colours: the lab's LabOutlineColor per character (NLabPotionHolder), used for the outline under the icon and the hover rim */
.ptcell[data-c="ironclad"],.ptpage[data-c="ironclad"]{--labc:#ff5555}
.ptcell[data-c="silent"],.ptpage[data-c="silent"]{--labc:#7fff00}
.ptcell[data-c="defect"],.ptpage[data-c="defect"]{--labc:#87ceeb}
.ptcell[data-c="necrobinder"],.ptpage[data-c="necrobinder"]{--labc:#ff78a0}
.ptcell[data-c="regent"],.ptpage[data-c="regent"]{--labc:#ffa518}
.ptcell .potion,.pt-show .potion{--rim-c:var(--labc,#bfe4ff)}
.ptcell{gap:6px}
.ptcell .nm{margin-top:2px}
/* the outline under the icon at rest (inside the .potion element, before its image): the game's outline sprite filled with the pool colour at .66, black at .5 for shared pools;
   it tilts with the icon and steps aside while the hover rim (the same sprite, lit) is up */
.potion .pt-ol{position:absolute;inset:6%;z-index:0;background:color-mix(in srgb,var(--labc,#000) 66%,transparent);-webkit-mask:var(--ol) center/contain no-repeat;mask:var(--ol) center/contain no-repeat;pointer-events:none;transition:opacity .25s}
.ptcell .potion .pt-ol,.pt-show .potion .pt-ol{background:color-mix(in srgb,var(--labc,#000) var(--ol-a,66%),transparent)}
.ptcell:not([data-c="ironclad"]):not([data-c="silent"]):not([data-c="defect"]):not([data-c="necrobinder"]):not([data-c="regent"]) .pt-ol,.ptpage:not([data-c="ironclad"]):not([data-c="silent"]):not([data-c="defect"]):not([data-c="necrobinder"]):not([data-c="regent"]) .pt-ol{--ol-a:50%}
.potion.hov .pt-ol,.potion.settle .pt-ol{opacity:0}
.potion .pt-ol~img{position:relative;z-index:1}
/* the game's holder hover: up x1.15 in .05 s, back over .5 s (the icons3d lift already does the tilt; the slot itself stays put) */
.ptcell:hover .nm{color:#fff}
/* the potion page's showcase slot: the list tile's eight sided frame (app/tilehousing.css .ih-slot + .ih-gem, markup from directories.js houseSlot), scaled up. Only sizes
   and the frame's OWN custom properties are set here (--rc the rarity colour, --cut the corner, --ih-top / --ih-mid / --ih-glow the hover light); the rim, the well, the
   clip and the gem's paint stay in tilehousing.css, so the page and the directory cannot drift apart. The rim is 5 px here (2.5 px on the tile), and the well's corner is
   the frame's corner minus .586 x the rim, which keeps the rim the same width along the cut corners. The old slot was the top bar's hand drawn tray sprite
   (Bean, 21 Sep 2026: "wonky and not perfectly symmetrical"). Hover changes colours only, never a size. */
.pt-show{padding:1.4rem 1rem 1.7rem}
.pt-bigslot{--rc:#7d8b91;display:grid;place-items:center}
.pt-bigslot[data-rar="common"]{--rc:var(--r-common)}
.pt-bigslot[data-rar="uncommon"]{--rc:var(--r-uncommon)}
.pt-bigslot[data-rar="rare"]{--rc:var(--r-rare)}
.pt-bigslot[data-rar="special"]{--rc:#ee82ee}
.pt-bigslot .ih-slot{--cut:34px;width:12.6rem;height:12.6rem;box-shadow:0 20px 22px -28px rgba(0,0,0,.8)}
.pt-bigslot .ih-slot::after{inset:5px;--cut:31px}
.pt-bigslot .potion{width:9.4rem;height:9.4rem}
.pt-bigslot .ih-gem{bottom:-.6rem;width:1.2rem;height:1.2rem;border-radius:2px}
.pt-bigslot .ih-slot:has(.hov){--ih-top:#d2e8ef;--ih-mid:#4f7380;--ih-glow:54%}
/* THE FACTS ARE THE ENEMY PAGE'S BOXES (wave 4, Bean 21 Sep 2026: info boxes look like the enemy page's Health / Gold boxes; pages_potions.js ptFacts builds them
   with pages_acts.js factBox / factRow, the look is enemyturns.css .ew-fact, untouched). Here only their LAYOUT under the hero: a grid instead of the wrapping flex
   row, so a row is always full and never ends on one stretched box: four or five boxes stand in one row, six as three over three; a middle width takes three per
   row (five = three over two, four = two over two), a phone two per row (the fifth box takes the last row). Sized by the block's own width (a container), never
   the window's: the rail folds away near 1000 px. */
.pt-factsw{container:ptfacts/inline-size;margin:var(--stack) 0 0}
.ptpage .pt-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0}
.ptpage .pt-facts.n3>.ew-fact:last-child,.ptpage .pt-facts.n5>.ew-fact:last-child{grid-column:1/-1}
@container ptfacts (min-width:36rem){
  .ptpage .pt-facts{grid-template-columns:repeat(6,minmax(0,1fr))}
  .ptpage .pt-facts>.ew-fact,.ptpage .pt-facts.n3>.ew-fact:last-child{grid-column:span 2}
  .ptpage .pt-facts.n4>.ew-fact,.ptpage .pt-facts.n5>.ew-fact:nth-child(n+4){grid-column:span 3}
}
@container ptfacts (min-width:56rem){
  .ptpage .pt-facts.n4{grid-template-columns:repeat(4,minmax(0,1fr))}
  .ptpage .pt-facts.n5{grid-template-columns:repeat(5,minmax(0,1fr))}
  .ptpage .pt-facts.n4>.ew-fact,.ptpage .pt-facts.n5>.ew-fact,.ptpage .pt-facts.n5>.ew-fact:nth-child(n+4){grid-column:auto}
}
.ptpage .pt-facts .ew-fact-row{flex:1}   /* the boxes of a row share one height: the icon and value stand in the middle of what is left under the label */
.ptpage .pt-facts .ew-fact-t b a{color:var(--gold-x)}
.ptpage .pt-facts .ew-fact-t b a:hover{color:#fff}
/* this potion's own art in the Use box ("that same potion you have as the icon but full not empty"): the sprite fills the icon cell like the heart and the gold */
.ptpage .ew-fact-3d .mi.pt-own{width:100%;height:100%}
/* the how text: a small paragraph in its own quiet box under the rules text (Bean on the card page: "a small paragraph below the card text in its own box") */
.ptpage .pt-how{margin:0;padding:10px 14px 11px;border-radius:10px;background:rgba(0,0,0,.2);border:1px solid rgba(255,255,255,.07);font-size:.98rem;line-height:1.5;color:var(--muted);max-width:none}
.ptpage .hero .gametext:has(+.pt-how){margin-bottom:10px}
/* "When to take it": one more box of the same component, the full row; its label stays the page's h2 (the old chapter's anchor) */
.ptpage .pt-pick{margin:10px 0 0}
.ptpage .pt-pick h2.ew-fact-h{margin:0;text-wrap:nowrap}
.ptpage .pt-pick .ew-fact-t{line-height:1.45;max-width:none}
/* the sibling potions on the page, as a belt */
.pt-belt{display:flex;flex-wrap:wrap;gap:10px 6px;padding:6px var(--pad) 16px}
.pt-belt .ptcell{width:6.4rem}
/* THE "UNLOCKED BY" PLATE (wave 5, 22 Sep 2026; pages_potions.js ptUnlockChap). Bean: "The "Unlocked by the trophies epoch" section has too much unneeded info. The
   Unlocked by the trophies epoch text should be on the left. Below that the "beat act 3 with the silent", on the right side the image of the epoch can be there."
   The chapter plate (style.css .chap, the gold accent of ch-upg) with ONE row inside: the lock in the chapter's icon well, the title and the requirement line at the
   left, the epoch's portrait in the timeline's golden slot (.ep-slot above, the ring pulsing on hover) at the right, standing in the middle of the row's height.
   The requirement is one readable line in the site's cream, never the dim small caps of a tagline (it is the plate's one fact). On a phone the slot is the small
   one (7rem) and the row keeps its two columns. */
.pt-unlock .pt-unl-in{display:flex;align-items:center;gap:12px 24px;padding:14px var(--pad) 16px}
.pt-unlock .pt-unl-t{display:flex;align-items:center;gap:12px;flex:1 1 auto;min-width:0}
.pt-unlock .chap-ico .chap-img{width:26px;height:26px;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.5))}
.pt-unlock .chap-t{min-width:0}
.pt-unlock h2{margin:0;font-size:1.35rem;line-height:1.2}
/* the epoch's name is the link (the fact boxes' own underline, so it reads as one: dp-facts .ew-fact-t b a) */
.pt-unlock h2 a{color:var(--gold-x);text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--gold) 55%,transparent);text-underline-offset:.16em}
.pt-unlock h2 a:hover,.pt-unlock h2 a:focus-visible{color:#fff;text-decoration-color:#fff}
.pt-unl-req{margin:5px 0 0;font-family:var(--font-t);font-size:1.02rem;line-height:1.3;color:#fff6e2}
.pt-unl-pic{flex:none}
.pt-unl-pic .ep-slot{width:10.2rem}
@media (max-width:640px){
  .pt-bigslot .ih-slot{--cut:28px;width:10.2rem;height:10.2rem}.pt-bigslot .ih-slot::after{inset:4px;--cut:25.6px}
  .pt-bigslot .potion{width:7.6rem;height:7.6rem}.pt-bigslot .ih-gem{bottom:-.5rem;width:1rem;height:1rem}
  .pt-unlock .pt-unl-in{gap:10px 14px;padding:12px 12px 14px}
  .pt-unlock h2{font-size:1.15rem}
  .pt-unl-req{font-size:.95rem}
  .pt-unl-pic .ep-slot{width:7rem;box-shadow:3px 3px 0 rgba(0,0,0,.28)}
}

/* ---------- the Timeline, the epoch page and the run modes ----------
   Moved out in wave 5 (22 Sep 2026, WP2): every .ep-* / .era-* rule (the slot the "Unlocked by" plate above draws, the epoch page, the span grid of the facts) is
   in app/timeline.css, every .md-* rule (the run modes page) in app/modes.css. Nothing of theirs stays here; the potion page's own sizes for the slot
   (.pt-unl-pic .ep-slot) stand above. */

/* ===== app/powers.css ===== */
/* ===== Powers list (app/pages.js pages.powers; docs/wave3/powers.md) =====
   The list uses the filter tiers of filters.css as they are (picker, strip, results header); only what Powers adds is here:
   the picker's "All" art and its two quiet pools (Shared, Enemies), and the Buff / Debuff plates in the strip, which can BOTH be
   off (every kind), so a pressed plate stays clickable, unlike the card page's Base / Upgraded pair. */

/* Tier 1 "All": powers have no compendium painting of their own, so the plate shows the section's h1 icon (H1_ICO.powers, the Strength
   sprite at its 256 px size) on the picker's dark plate */
.fpick[data-art="powers"] .fpk[data-c="all"] .fpk-art{background-image:url(/img/powers/full/strength_power.webp);background-size:74% auto;background-color:#22343c}
/* the quiet "Enemies" pool: the map's monster node icon, ringed in the debuff red; Shared keeps the chest from the relic list */
.fpk[data-c="enemy"]{--c:var(--red)}
.fpk[data-c="enemy"] .fpk-i{background-image:url(/img/ui/map/icons/map_monster.webp);background-size:120%}

/* the Buff / Debuff plates: a pressed plate can be pressed again to clear the kind, so it keeps the pointer and the hover lift */
.fstrip .pkind.upg-toggle.game button.on{cursor:pointer}
.fstrip .pkind.upg-toggle.game button.on:hover{transform:scale(1.025);transition-duration:.05s}
@media (prefers-reduced-motion:reduce){.fstrip .pkind.upg-toggle.game button.on:hover{transform:none}}

/* ===== A power page's "Rules and timing" chapter (app/pages.js powerNotesChap) =====
   Two or more rules are a list of one-sentence points (one rule is the chapter's lede): the chapter's own accent on the markers and a
   little more air between points than a plain list has. The column width is .chap-b's. */
.chap-b ul.pwnotes{margin:.35rem 0 .3rem}
.chap-b ul.pwnotes li{margin:.45rem 0;padding-left:.15rem}
.chap-b ul.pwnotes li::marker{color:var(--acc)}

/* ===== The power page (app/wp1pages.js powerPage; wave 4 overview, docs/wave4/wp1.md) =====
   The facts are the enemy page's boxes laid out by the card page's grid (factGrid, detailpage.css), the how box is .dp-how, the "applied by" blocks are the card page's
   synergy sections (.dp-syn, .syn-cards, .syn-it, .syn-why). Only what a POWER adds is here. */
/* the showcase: the power list's own eight sided frame (app/directories.js houseSlot + tilehousing.css), scaled up through the frame's custom properties the way the
   potion page does it (potions.css .pt-bigslot): green for a buff, red for a debuff, the list tile's colours. Never re-draw the frame here. */
.pw-show{padding:1.4rem 1rem 1.7rem}
.pw-bigslot{--rc:#8fd96b;display:grid;place-items:center}
.pw-bigslot[data-rar="debuff"]{--rc:var(--red)}
.pw-bigslot .ih-slot{--cut:34px;width:12.6rem;height:12.6rem;box-shadow:0 20px 22px -28px rgba(0,0,0,.8)}
.pw-bigslot .ih-slot::after{inset:5px;--cut:31px}
.pw-bigslot .power{width:8.2rem;height:8.2rem}
.pw-bigslot .ih-gem{--gem-hov:1.22;bottom:-.6rem;width:1.2rem;height:1.2rem;border-radius:2px}
.pw-bigslot .ih-slot:has(.hov){--ih-top:#d2e8ef;--ih-mid:#4f7380;--ih-glow:54%}
/* the panel takes the info column's height with the frame in its middle (the relic page's rule, detailpage.css): no empty band under a short panel */
.pwpage .hero>.showcase{align-self:stretch;justify-content:center}
/* THE FACTS STAND UNDER THE HERO AT FULL WIDTH, as on the potion page (docs/wave4/potions.md): inside the title column four boxes are 180 px each and "2 relics, 2
   potions, 9 enemies" breaks into three lines; under the hero a box is a quarter of the page and the hero's two halves come out about level (frame 245 px, title +
   game text + how box 205 to 295 px) */
.pw-factsw{margin:var(--stack) 0 0}
.pwpage .dp-facts .ew-fact-row{flex:1}   /* the boxes of a row share one height: icon and value stand in the middle of what is left under the label */
.pwpage .hero .dp-how{margin-bottom:0}
/* the Kind box: the word in the frame's colour (the list tile's green / red) */
.dp-facts .ew-fact-t b.pw-kind.pw-buff{color:#8fd96b}
.dp-facts .ew-fact-t b.pw-kind.pw-debuff{color:var(--red)}
/* THE APPLIED BY VALUE (wave 5, wp1pages.js pwAppliedFact): "22 cards, 9 enemies, 2 relics" as far as the box holds it. Each group after the first is a span
   carrying the box width it needs (w<px>, 8 px steps, the text's width plus the box's fixed 99 px), and it hides while its box is narrower than that: the box is
   a size container here (the grid track fixes its width, so nothing is circular). The value stays one whole line at every width (Bean: no cut text, one line
   per box); the hover names every group. At 1345 a four-box row is 245 px (two groups), a three-box row 330 (three); at 1000 a three-box row is 225 (one). */
.pwpage .dp-cell{container-type:inline-size}
@container (max-width:199.9px){.pw-ab.w200{display:none}}
@container (max-width:207.9px){.pw-ab.w208{display:none}}
@container (max-width:215.9px){.pw-ab.w216{display:none}}
@container (max-width:223.9px){.pw-ab.w224{display:none}}
@container (max-width:231.9px){.pw-ab.w232{display:none}}
@container (max-width:239.9px){.pw-ab.w240{display:none}}
@container (max-width:247.9px){.pw-ab.w248{display:none}}
@container (max-width:255.9px){.pw-ab.w256{display:none}}
@container (max-width:263.9px){.pw-ab.w264{display:none}}
@container (max-width:271.9px){.pw-ab.w272{display:none}}
@container (max-width:279.9px){.pw-ab.w280{display:none}}
@container (max-width:287.9px){.pw-ab.w288{display:none}}
@container (max-width:295.9px){.pw-ab.w296{display:none}}
@container (max-width:303.9px){.pw-ab.w304{display:none}}
@container (max-width:311.9px){.pw-ab.w312{display:none}}
@container (max-width:319.9px){.pw-ab.w320{display:none}}
@container (max-width:327.9px){.pw-ab.w328{display:none}}
@container (max-width:335.9px){.pw-ab.w336{display:none}}
@container (max-width:343.9px){.pw-ab.w344{display:none}}
@container (max-width:351.9px){.pw-ab.w352{display:none}}
/* THE SECTION BANNER "Where it comes from" (wave 5, banner.js secBanner; wp1pages.js pwBanner) stands between the facts and the blocks; its socket holds the power's
   own icon, drawn like the Kind box's (the sprite has its own outline; no extra ring) */
.pwpage .secban.sb-pw .secban-ico img{width:2.3rem;height:2.3rem}
@media (max-width:640px){.pwpage .secban.sb-pw .secban-ico img{width:1.9rem;height:1.9rem}}
/* THE BLOCKS (app/wp1pages.js powerAppliedHtml decides the rows in the markup): .pw-blocks is a two column grid; .pw-full takes the whole row; .pw-lead is the row of
   a SMALL cards block (one to three cards) and its neighbour, the next block or the Notes chapter: a third and two thirds for one or two cards, three fifths and two fifths for three.
   The grid stretches a row's two housings to one height. One column when the page is narrow. */
.pw-blocksw{margin:var(--stack) 0 0}
@supports (container-type:inline-size){.pw-blocksw{container:pwb/inline-size}}
.pw-blocks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap)}
.pw-blocks+.pw-blocks{margin-top:var(--gap)}
.pw-blocks>.chap{margin:0;min-width:0}
.pw-blocks>.chap.pw-full{grid-column:1/-1}
/* the narrow housing is never narrower than its own title and its row of cards (a 43rem page gave it 228 px: the title broke under its icon, two tiles stood in a column) */
.pw-blocks.pw-lead[data-c="1"]{grid-template-columns:minmax(16.5rem,1fr) minmax(0,2fr)}
.pw-blocks.pw-lead[data-c="2"]{grid-template-columns:minmax(17.5rem,1fr) minmax(0,2fr)}
.pw-blocks.pw-lead[data-c="3"]{grid-template-columns:minmax(25.5rem,3fr) minmax(0,2fr)}
/* two LONG blocks side by side (Strength: 18 tiles beside 49 enemies) only match while the page is wide; narrower, the chips wrap to twice the rows, so each takes the whole row */
@supports (container-type:inline-size){@container pwb (max-width:56rem){.pw-blocks>.chap.pw-big{grid-column:1/-1}}}
/* a pair whose heights only match on a wide page (wave 5, wp1pages.js: the narrow estimates, three tiles to a row, differ by more than 100 px): each block takes the
   whole row once four tiles stop fitting a half column (4 x 6.2rem + gaps inside the housing's padding = a 57rem page). Vulnerable at 1000 px: four tiles wrapped to
   two rows beside nine chips and the stretched pair left 131 px of empty housing */
@supports (container-type:inline-size){@container pwb (max-width:57rem){.pw-blocks>.chap.pw-split{grid-column:1/-1}}}
/* the lead's cards stand in ONE row, a little smaller (7.4rem; three of them fit three fifths of a 45rem page), in the middle of their housing. Only where there is a
   pointer: without hover the detail stream lays a card and its caption one to a row (detailpage.css), which these columns must not break */
@media (hover:hover){
  .pw-lead[data-c] .grid.cards.syn-cards{--cw:7.4rem;gap:16px 10px;padding:2px 0 0}
  .pw-lead[data-c="1"] .grid.cards.syn-cards{grid-template-columns:minmax(0,1fr)}
  .pw-lead[data-c="2"] .grid.cards.syn-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px 8px}
  .pw-lead[data-c="3"] .grid.cards.syn-cards{grid-template-columns:repeat(3,minmax(0,1fr))}
}
/* the lead row's right column holding a short block AND the Notes chapter (wave 5, wp1pages.js stackN): the two stack with the grid's gap, the Notes fill what is left */
.pw-lead>.pw-stack{display:flex;flex-direction:column;gap:var(--gap);min-width:0}
.pw-lead>.pw-stack>.chap{margin:0;min-width:0}
.pw-lead>.pw-stack>.chap:last-child{flex:1 1 auto}
.pw-lead>.pw-lead-a{display:flex;flex-direction:column}
.pw-lead>.pw-lead-a .dp-syn-b{flex:1 1 auto;display:grid;align-content:center}
.pw-lead>.pw-lead-a .grid.icons.pw-tiles{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 8px}
.pw-lead>.pw-lead-a .pw-tiles>*{flex:0 0 6.6rem;min-width:0}
@media (max-width:640px){.pw-blocks,.pw-blocks.pw-lead[data-c]{grid-template-columns:minmax(0,1fr)}}
@supports (container-type:inline-size){@container pwb (max-width:46rem){.pw-blocks.pw-lead[data-c="3"]{grid-template-columns:minmax(0,1fr)}}
  @container pwb (max-width:40rem){.pw-blocks,.pw-blocks.pw-lead[data-c]{grid-template-columns:minmax(0,1fr)}}}
/* the lead's cards wrap into the directory's columns on a narrow page ONLY where there is a pointer (wave 5 fix): on a touch phone the same columns squeezed a card's
   caption into a 90 px track (Accelerant at 390 px read "Poison / is / triggered / 1 / additional / time."); without hover the detail stream's own row of card and
   caption stands, as in every other cards block */
@media (max-width:640px) and (hover:hover){.pw-lead[data-c] .grid.cards.syn-cards{grid-template-columns:repeat(auto-fill,minmax(var(--cw),1fr))}}
@media (hover:hover){@supports (container-type:inline-size){@container pwb (max-width:46rem){.pw-lead[data-c="3"] .grid.cards.syn-cards{grid-template-columns:repeat(auto-fill,minmax(var(--cw),1fr))}}
  @container pwb (max-width:40rem){.pw-lead[data-c] .grid.cards.syn-cards{grid-template-columns:repeat(auto-fill,minmax(var(--cw),1fr))}}}}
/* the housed tiles of "Relics and potions that apply it" / "Powers that apply it": the directory's own columns (auto-fill keeps the empty tracks, so four tiles in a
   whole row stay tile sized at its left) */
.grid.icons.pw-tiles{grid-template-columns:repeat(auto-fill,minmax(6.2rem,1fr));gap:14px 8px;padding:4px 0 2px}
.pw-chips{padding:4px 0 2px}
@media (max-width:760px){
  .pw-bigslot .ih-slot{--cut:28px;width:10.2rem;height:10.2rem}.pw-bigslot .ih-slot::after{inset:4px;--cut:25.6px}
  .pw-bigslot .power{width:6.6rem;height:6.6rem}.pw-bigslot .ih-gem{bottom:-.5rem;width:1rem;height:1rem}
}/* QoL pass (wave 6, docs/wave6/qol-glossary.md): the power page's own icon (the hero and the fact row) is no link and shows no tip, so it wears no hand cursor
   (style.css gives every .power a pointer; it looked clickable and did nothing) */
.pwpage .power[data-notip]:not(a .power){cursor:default}

/* ===== app/profile.css ===== */
/* ===== PROFILE (route profile; wave 6, COMMUNITY stream; app/profile.js) =====
   Bean, 23 Sep 2026: "a basic, clean profile page ... That's it, should be super simple for now." The account card, the two daily games' numbers, the two build lists.
   html[data-auth] (set before the first paint) shows the signed-in page or the sign-in prompt, both in the markup. */
.pfpage .pf-in,.pfpage .pf-out{display:none}
html[data-auth="in"] .pfpage .pf-in{display:block}
html:not([data-auth="in"]) .pfpage .pf-out{display:block}

.pf-card{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:14px 18px;margin:0 0 28px;padding:18px 20px;border-radius:12px;
  background:linear-gradient(rgba(25,43,51,.9),rgba(14,25,31,.92));box-shadow:0 0 0 2px rgba(122,106,78,.45),0 5px 0 rgba(0,0,0,.45)}
.pf-card .acct-av.pf-av{width:72px;height:72px;box-shadow:0 0 0 3px #b8903d,0 3px 0 3px rgba(0,0,0,.45)}
.pf-id{display:flex;flex-direction:column;gap:6px;min-width:0}
.pf-name{font-family:var(--font-t);font-weight:700;font-size:1.5rem;line-height:1.1;color:var(--gold)}
.pf-steam{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;font-size:.92rem;color:var(--muted)}
.pf-steam .acct-steam{width:18px;height:18px}
.pf-slink{font-family:var(--font-t);font-weight:700}
.pf-slink::after{content:"›";margin-left:.3em}
.pf-acts{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:10px}
.pf-del{grid-column:1/-1;padding:14px 16px;border-radius:10px;background:rgba(120,20,20,.18);box-shadow:inset 0 0 0 1px rgba(255,85,85,.35)}
.pf-del[hidden]{display:none}
.pf-del p{margin:0 0 12px;line-height:1.5;color:#f3ead9}
.pf-delb{display:flex;flex-wrap:wrap;gap:10px}
.pf-del .pf-msg{margin:10px 0 0;color:var(--muted);font-size:.9rem}
.pf-del .pf-msg:empty{display:none}

.pf-sec{margin:0 0 28px}
.pf-games{display:grid;grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));gap:14px}
.pf-game{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:rgba(0,0,0,.28);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08)}
.pf-gi{flex:none;width:56px;height:56px;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.5))}
.pf-gb{display:flex;flex-direction:column;gap:6px;min-width:0;flex:1}
.pf-gn{font-family:var(--font-t);font-weight:700;font-size:1.12rem;color:#f3ead9}
.pf-nums{display:flex;gap:22px;margin:0}
.pf-nums div{display:flex;flex-direction:column-reverse;gap:3px}
.pf-nums dt{font-size:.74rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}
.pf-nums dd{margin:0;font-family:var(--font-t);font-weight:700;font-size:1.6rem;line-height:1;color:var(--gold)}
.pf-play{align-self:flex-start;font-family:var(--font-t);font-weight:700;font-size:.9rem}
.pf-play::after{content:"›";margin-left:.3em}

.pf-list .pf-empty{margin:0;padding:14px 16px;border-radius:10px;background:rgba(0,0,0,.22);color:var(--muted);line-height:1.5}
.pf-rows{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none}
.pf-row{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 16px;padding:11px 16px;border-radius:10px;background:rgba(0,0,0,.28);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08);color:#f3ead9;text-decoration:none;transition:background .12s,box-shadow .12s}
.pf-row:hover{background:rgba(255,235,190,.07);box-shadow:inset 0 0 0 1px rgba(245,198,91,.4);text-decoration:none}
.pf-rt{font-family:var(--font-t);font-weight:700;font-size:1.05rem;color:var(--gold);min-width:0;overflow-wrap:anywhere}
.pf-rm{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:.88rem;color:var(--muted)}
.pf-rc{font-weight:700}
.pf-row[data-c="ironclad"] .pf-rc{color:#ff7a5c}
.pf-row[data-c="silent"] .pf-rc{color:#7ed48a}
.pf-row[data-c="defect"] .pf-rc{color:#7fc7f0}
.pf-row[data-c="necrobinder"] .pf-rc{color:#d99cf2}
.pf-row[data-c="regent"] .pf-rc{color:#f0cf7a}
.pf-more{margin:10px 0 0}
@media (max-width:640px){
  .pf-card{grid-template-columns:auto 1fr;padding:16px}
  .pf-card .acct-av.pf-av{width:56px;height:56px}
  .pf-name{font-size:1.25rem}
  .pf-acts{grid-column:1/-1;justify-content:flex-start}
}

/* ===== app/qolhome.css ===== */
/* ===== wave 6, QoL pass: home, search, 404, about / contact, footer, site navigation (23 Sep 2026; docs/wave6/qol-home-search.md, qolhome.js) ===== */

/* NO JUMP WHILE A PAGE ARRIVES: the column is at least one screen tall, so the footer starts below the fold. Before, on every page the app draws in the
   browser (the single file, the dev page, the static site's search and 404) the footer was painted high up the empty column and then shoved down when the
   page arrived (a layout shift of 0.6 to 0.8 of the screen); a short page now keeps its footer at the bottom of the window. */
#main{min-height:calc(100vh - var(--tb-h) - 1.2rem)}

/* A SECTION ANCHOR CLEARS THE STICKY TOP BAR: a link or an address to a heading (cards/bash#synergies, about#The_daily_puzzle) put it under the 65 px bar.
   :where() keeps this at zero specificity, so every page's own scroll margin (glossary, events, characters, the filter strip's cards) still wins. */
:where(#main [id]){scroll-margin-top:calc(var(--tb-h) + 12px)}

/* THE SEARCH BOX'S LIST: the row that opens every result, and the word when nothing matches (qolhome.js qsSuggFoot / qsSuggNone) */
.sugg a.sugg-all{justify-content:center;color:var(--gold);font-family:var(--font-t);font-weight:700;font-size:.95rem;background:rgba(0,0,0,.22)}
.sugg a.sugg-all:hover,.sugg a.sugg-all.sel{color:#fff}
.sugg .sugg-none{padding:10px 14px;color:var(--muted);font-size:.95rem}
.sugg a.sugg-page img{object-fit:contain}
.sugg a.sel::after{content:none}   /* the arrow-picked row is .sel, which is also the dropdown wrapper's class (style.css .sel::after draws its chevron): no chevron in the list */

/* THE RESULTS PAGE: the whole row opens the result (the name alone was a 24 px tall target), and says so on hover */
.move.srow{position:relative;transition:border-color .12s,background-color .12s}
.move.srow .mn>a:first-child::after{content:"";position:absolute;inset:0;border-radius:inherit}
.move.srow:hover{border-color:rgba(239,200,81,.4);background:rgba(0,0,0,.36)}
.srpage .sr-more{margin:12px 2px 0;color:var(--muted);font-size:.95rem}

/* TOUCH TARGETS (a coarse pointer, as style.css's touch block): the footer's links were 36 px tall, its brand 29, the home page's "All daily games" /
   "All patch notes" 21, the first crumb 26 px wide; each grows its tap area, the layout does not move */
@media (hover:none) and (pointer:coarse){
  .foot-col a{padding:11px 0}
  .foot-brand{display:inline-block;padding:6px 0}
  .sechead .sh-more{padding:10px 0 10px 12px;margin:-10px 0}
  .crumbs a{padding:10px 8px;margin:0 -8px}
  .sitepage .ew-fact-t a{padding:9px 0}
  .foot-bar a{display:inline-block;padding:12px 0;margin:-12px 0}
}

/* ===== app/rail.css ===== */
/* ===== the rail's open / close toggle, the icon strip, the drawer scrim (docs/wave3/rail.md) =====
   Base rail, drawer and breakpoint rules stay in style.css; this file holds what the toggle added. State: html[data-rail="closed"] (set before
   first paint by the inline script in shell.html, kept in localStorage 'sts2.rail') shrinks --rail-w to --rail-w-closed on desktop only, so the
   layout column, the rail's own width and the footer offset follow without knowing about it. Under 981px the attribute is ignored: the rail is the
   drawer there and the toggle closes it. */

/* ---------- the toggle: part of the panel, not an object on it (Bean, 17 Sep 2026: the first version, the game's bright gold paginator arrow,
   "doesn't really fit this section"). A small chip in the panel's own tones on the first group heading's line: the heading colour (#a89a78) for the
   chevron and the hairline, the panel's dark for the face; quiet at rest, and gold only on hover / focus, the same gold wash and outline the active
   node carries. The chevron is the game's little_arrow sprite (packed/common_ui, a white ">" with a black outline) used as a luminance mask, so only
   its white stroke is painted, in currentColor; mirrored it points left = close, as drawn it points right = open ---------- */
/* the head is the panel's header band: flush with the panel's top and side edges (negative margins undo the rail's 14 / 8 / 6 px padding), a shade lighter than
   the panel with a gold hairline under it, sticky so the nodes scroll beneath it. Home fills the whole band (Bean, 17 Sep 2026: "a button that has authority at
   the top ... needs to occupy the entire top of the left side nav"): the rest site's campfire, the title face a size up, cream. Hover only: the band warms up, the
   word turns gold and the fire grows a little; there is no selected state on the home page. The open/close chip sits at the right end of the first group
   heading's line (.railrow). The 32px button is the chip's hit area, ::before the 22px chip, ::after the 12px chevron */
.railhead{position:sticky;top:-14px;z-index:3;display:flex;margin:-14px -8px 14px -6px;border-radius:12px 12px 0 0;background:#241e16}
/* Home is a button, not a label (Bean, 17 Sep 2026: "the text should be centered and feel more like a button"): a raised plate the width of the panel, icon and word centred
   as one group, a light top edge, no gold outline and no hard lip (Bean: "remove the gold outline", then of the 4 px lip: "this isn't a proper dropshadow, this is just 2 different colored lines"), a soft drop shadow falling onto the nodes below; hover warms it and lifts the lip, a press pushes it in. Still no selected state. */
.railhome{flex:1 1 auto;min-width:0;display:flex;align-items:center;justify-content:center;gap:9px;padding:11px 14px 13px;border-radius:12px 12px 0 0;color:#f3e6c4;font-family:var(--font-t);font-weight:700;font-size:1.22rem;letter-spacing:.03em;text-decoration:none;text-shadow:0 2px 0 rgba(0,0,0,.5);
  background:linear-gradient(#54462f,#3b3122);box-shadow:inset 0 1px 0 rgba(255,236,190,.22),0 3px 6px rgba(0,0,0,.45),0 8px 18px rgba(0,0,0,.55);border-bottom:0;
  transition:background .5s cubic-bezier(.16,1,.3,1),color .5s cubic-bezier(.16,1,.3,1),translate .5s cubic-bezier(.16,1,.3,1),box-shadow .5s cubic-bezier(.16,1,.3,1)}
.railhome .rh-ico{flex:none;width:22px;height:22px;fill:currentColor;stroke:#17110a;stroke-width:1.5;stroke-linejoin:round;paint-order:stroke;filter:drop-shadow(0 2px 0 rgba(0,0,0,.5));transition:scale .5s cubic-bezier(.16,1,.3,1)}
.railhome:hover{background:linear-gradient(#6a5735,#483b26);color:var(--gold-x);text-decoration:none;box-shadow:inset 0 1px 0 rgba(255,236,190,.32),0 4px 8px rgba(0,0,0,.45),0 12px 22px rgba(0,0,0,.55);transition-duration:.05s}
.railhome:hover .rh-ico{scale:1.12;transition-duration:.05s}
.railhome:active{translate:0 1px;box-shadow:inset 0 2px 0 rgba(0,0,0,.45),0 1px 3px rgba(0,0,0,.45),0 4px 10px rgba(0,0,0,.5);transition-duration:.03s}
.railhome:focus-visible{outline:2px solid #fff;outline-offset:-3px}
.railrow{display:flex;align-items:center;justify-content:space-between;margin:0 0 9px}
.rail .railrow .hx{margin:0 0 0 14px}
.railtog{pointer-events:auto;position:relative;flex:none;width:32px;height:32px;margin:-6px -3px -6px 0;padding:0;border:0;border-radius:9px;background:none;color:#a89a78;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:color .5s cubic-bezier(.16,1,.3,1)}
.railtog::before{content:"";position:absolute;inset:5px;border-radius:6px;border:1px solid rgba(168,154,120,.32);background:rgba(0,0,0,.22);box-shadow:inset 0 1px 0 rgba(255,235,190,.05);transition:border-color .5s cubic-bezier(.16,1,.3,1),background .5s cubic-bezier(.16,1,.3,1)}
.railtog::after{content:"";position:absolute;inset:10px;background:currentColor;-webkit-mask:var(--spr-arrow,url(/img/packed/common_ui/little_arrow.webp)) center/contain no-repeat;mask:var(--spr-arrow,url(/img/packed/common_ui/little_arrow.webp)) center/contain no-repeat;mask-mode:luminance;transform:scaleX(-1);transition:transform .2s}
.railtog:hover,.railtog:focus-visible{color:var(--gold-x);transition-duration:.05s}
.railtog:hover::before,.railtog:focus-visible::before{border-color:rgba(245,198,91,.5);background:rgba(245,198,91,.14);transition-duration:.05s}
.railtog:active::before{background:rgba(245,198,91,.26)}
.railtog:focus-visible{outline:2px solid #fff;outline-offset:-3px}
/* nodes fade out under the button once the rail is scrolled (scroll-driven, so nothing shows at rest; without support the band stays off) */
.railhead::before{display:none;content:"";position:absolute;z-index:-3;left:-6px;right:-8px;top:-14px;height:calc(100% + 30px);border-radius:12px 12px 0 0;background:linear-gradient(#2d2922 0,#2b2721 58%,rgba(43,39,33,0));opacity:0;pointer-events:none}
@supports (animation-timeline:scroll()){.railhead::before{animation:railheadfade 1s linear both;animation-timeline:scroll(nearest block);animation-range:0px 28px}}
@keyframes railheadfade{from{opacity:0}to{opacity:1}}
@keyframes nodepulse-strip{0%,100%{scale:1.2}50%{scale:1.32}}

/* ---------- desktop: the closed rail is an icon strip ---------- */
@media (min-width:981px){
  /* no native scrollbar on the rail (Bean, 17 Sep 2026: "shouldn't be so wide and default ... extremely thin or not visible at all"): the wheel, touch and the keyboard still
     scroll it, and a node cut by the bottom edge shows there is more. No gutter to reserve any more, so nothing moves whether or not the nodes overflow. */
  html[data-rail="closed"]{--rail-w:var(--rail-w-closed)}
  /* same left offsets as the open rail (border 2 + padding 6 + node border 2 + node padding 8), so no icon moves sideways when the rail closes:
     --rail-w-closed 68px = border 2 + padding 6 + node (2 + 8 + icon 32 + 8 + 2) + padding 6 + border 2 */
  html[data-rail="closed"] .rail{padding-right:6px}
  /* every child is exactly one node wide (2 + 8 + 32 + 8 + 2), whatever the scrollbar takes: the highlight stays symmetric around the icon and, while
     the panel is still shrinking, the nodes already have their final width, so the icons never slide */
  html[data-rail="closed"] .rail>*{width:52px}
  html[data-rail="closed"] .rail>.railhead{width:auto;margin:-14px -6px 8px -6px}
  html[data-rail="closed"] .railtog{margin:0}
  html[data-rail="closed"] .railhome{padding:11px 0 13px;gap:0}
  html[data-rail="closed"] .railrow{justify-content:center;margin-bottom:2px}
  html[data-rail="closed"] .rail .railrow .hx{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip-path:inset(50%)}
  html[data-rail="closed"] .railhome .lbl,html[data-rail="closed"] .mapnode .tag{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
  html[data-rail="closed"] .railtog::after{transform:none}
  html[data-rail="closed"] .railhead::before{right:0}
  /* headings become the pencil-dot divider between groups; the text stays for screen readers and crawlers (font-size 0, not display:none) */
  html[data-rail="closed"] .rail .hx{width:24px;height:0;margin:8px 14px;padding:0;overflow:hidden;font-size:0;line-height:0;letter-spacing:0;border-top:3px dotted rgba(122,106,78,.75)}
  html[data-rail="closed"] .rail .railhead+.hx{margin:0;border:0}
  /* labels and counts leave the flow but stay in the link: the link is still focusable, named by its aria-label, and gets a title from core.js */
  html[data-rail="closed"] .mapnode{padding-right:8px;gap:0;justify-content:center}
  /* the icon is all that is left of the node, so it is drawn a little larger (scale keeps its centre, nothing moves); the active node's pulse follows */
  html[data-rail="closed"] .mapnode .ico{scale:1.2}
  html[data-rail="closed"] .mapnode.on .ico{animation-name:nodepulse-strip}
  html[data-rail="closed"] .mapnode .lbl,html[data-rail="closed"] .mapnode .n{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
}
/* ---------- the 0.2 s change: only the rail's own width moves. The layout column and the footer offset snap once (one reflow of the page, not one per
   frame: /cards has 577 cards), the rail rides above the page while it shrinks over it. html.rail-anim is set by core.js for the change only, so a
   saved state, a re-render and a resize across the breakpoint never animate. Opening: the children are laid out at their final width (--rail-inner,
   measured by core.js) from the first frame, so labels do not re-wrap while the panel grows; closing: the strip layout applies at once and the panel
   wipes down to it. prefers-reduced-motion: no rule here applies, the change is instant ---------- */
@media (min-width:981px) and (prefers-reduced-motion:no-preference){
  html.rail-anim .rail{transition:width .2s cubic-bezier(.3,.7,.2,1);z-index:50}
  html.rail-anim:not([data-rail="closed"]) .rail>*{width:var(--rail-inner,auto)}
}

/* ---------- 980px and under: the drawer. The scrim is a real element (created by core.js on first use) under the drawer and the top bar: it dims the
   page, takes the outside click and swallows wheel / touch scrolling of the page behind ---------- */
.railscrim{display:none}
@media (max-width:980px){
  .railscrim{display:block;position:fixed;inset:0;z-index:54;background:rgba(0,0,0,.5);opacity:0;visibility:hidden;transition:opacity .2s,visibility 0s .2s;touch-action:none}
  .railscrim.on{opacity:1;visibility:visible;transition:opacity .2s,visibility 0s}
  .rail.open{box-shadow:inset 0 0 40px rgba(0,0,0,.45),6px 0 24px rgba(0,0,0,.5)}
}
/* touch: a 44px target for the toggle inside the drawer (the arrow keeps its size) */
@media (hover:none) and (pointer:coarse){.railhome{padding:12px 14px 11px 13px}.railtog{width:44px;height:44px;margin:-8px -7px -8px 0}.railtog::before{inset:8px}.railtog::after{inset:15px}}

/* ---------- the featured node: Daily puzzles (SECTIONS flag 'feat', core.js). Bean, 17 Sep 2026: "highlighted ... in a way that the below page listings aren't".
   A warm gold plate at rest (the listings are flat until hovered), gold label, a small "Today" tag; the active state (.on) adds its usual outline on top.
   The tag says Today, never a puzzle number: the rail is pre-rendered on the static export and a number would go stale ---------- */
.mapnode.feat{margin:6px 0 4px;padding-top:8px;padding-bottom:8px;border-color:rgba(245,198,91,.42);background:linear-gradient(90deg,rgba(245,198,91,.2),rgba(245,198,91,.07) 70%,rgba(245,198,91,.03));box-shadow:inset 0 1px 0 rgba(255,235,190,.08),0 0 12px rgba(240,180,0,.1)}
.mapnode.feat .lbl{color:var(--gold-x);font-weight:700}
.mapnode.feat:hover{background:linear-gradient(90deg,rgba(245,198,91,.3),rgba(245,198,91,.12) 70%,rgba(245,198,91,.06))}
.mapnode.feat.on{border-color:rgba(245,198,91,.8)}
/* the tag rides on the plate's top edge like a ribbon, so the label keeps its one line */
.mapnode .tag{position:absolute;top:-8px;right:8px;z-index:2;font:700 .58rem/1 var(--font-t);letter-spacing:.09em;text-transform:uppercase;color:#241600;background:var(--gold);border-radius:999px;padding:3px 7px 2px}
@media (min-width:981px){html[data-rail="closed"] .mapnode.feat{margin:2px 0 4px}}
/* the dotted map path joins the nodes of a group; a group with a single node (Play: Daily puzzles) has nothing to join, and the stub showed behind its icon */
.mapnodes:has(>li:only-child)::before{display:none}

/* THE RAIL AND THE TOP BAR STAY PUT ACROSS PAGE LOADS (Bean, 20 Sep 2026: "it shouldnt fade out or move from where you currently have it"; 21 Sep 2026: "all the icons on it
   disappear, it lags for a second", "Everything in the top bar and left nav should be static when changing tabs"). On the static site every click is a page load. What keeps the
   frame of the site still across it (wave 4, measured frame by frame with docs/wave4/scratch/shell/nav.mjs):
   - the new page's FIRST frame is already the whole frame: the rail icons, the marker, the toggle chevron, the brand icon and the button plates travel inside the stylesheet
     (app/shellsprites.css, tools/gen_shellsprites.py) instead of being image files fetched after the first paint; the top bar's day number and states are written before the
     first paint into boxes of a fixed size (shell.html data-tbstate, app/topbar.css); the rail's scroll is put back before the first paint (ssr.js RAIL_RESTORE, core.js railKeep);
   - the browser itself holds the old page on screen until that first frame exists (paint holding), so old and new frame are the same picture: 0 differing pixels in the bar.
   NO CROSS-PAGE VIEW TRANSITION ANY MORE. The 20 Sep build carried the rail over as its own view-transition layer (@view-transition + view-transition-name). Filmed, that layer
   was the glitch: Chrome dropped the transition on about every other load ("ViewTransition opt-in disabled": the rule sat in the external stylesheet, which is often still loading
   when <body> is inserted), and when it did run, the rail and the bar were shown for 3 to 4 frames as snapshot textures whose text is anti-aliased differently from the live page
   (every glyph edge in the bar flickered: mean difference 0.79 against 0 without it), and the old rail cross-faded into a new one whose icons had not arrived yet. Do not bring it back. */

/* ===== app/rankings.css ===== */
/* ===== THE RANKINGS (route rankings; wave 6, RANKINGS stream; app/rankings.js; docs/wave6/rankings.md) =====
   Every section is the site's plate (plate.css section.chap, the game's icon in its socket: an <img> inside .chap-ico); the viewer's numbers are the enemy page's
   fact boxes (dpFact / factGrid); buttons are buttons.css plates; the rank badges of the top three are the game's own run-badge tiles (game_over_screen/badge_gold,
   _silver, _bronze) and the switch on the profile is the game's checkbox. Scoped under .rkpage / .rk-pf (this file bundles after plate.css and profile.css). */
.rkpage .rk-in{display:none}
html[data-auth="in"] .rkpage .rk-in{display:block}
/* signed out: the slim banner instead of the "Your place" plate (rankings.js rkOutBarHtml); the look of .rk-off, the Steam button at the right end */
.rkpage .rk-outbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;margin:0 0 18px;padding:10px 12px 10px 16px;border-radius:10px;background:rgba(0,0,0,.3);box-shadow:inset 0 0 0 1px rgba(255,255,255,.1)}
.rkpage .rk-outbar p{flex:1 1 14rem;margin:0;line-height:1.5;color:#e9e1cf}
.rkpage .rk-outbar .acct-signin{flex:none;margin-left:auto}
html[data-auth="in"] .rkpage .rk-outbar,.rkpage .rk-outbar[hidden]{display:none}
/* the lookup (25 Sep 2026; rankings.js THE LOOKUP): the row also takes a Steam profile link. The row is a size container: wide, one line (the words, the box, Sign in
   with Steam at the right end); narrower, the words and Sign in on top and the box under them; a phone, each on its own line. The answer line sits under it all */
.rkpage .rk-outbar{container-type:inline-size}
.rkpage .rk-ob-in{flex:1 1 100%;min-width:0;display:grid;grid-template-columns:minmax(0,1fr);grid-template-areas:"t" "s" "f";gap:10px 16px;align-items:center}
.rkpage .rk-ob-in>p{grid-area:t}
.rkpage .rk-ob-in>.acct-signin{grid-area:s;justify-self:end}
.rkpage .rk-look{grid-area:f;display:flex;gap:8px;min-width:0}
@container (min-width:400px){.rkpage .rk-ob-in{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"t s" "f f"}}
@container (min-width:760px){.rkpage .rk-ob-in{grid-template-columns:auto minmax(15rem,1fr) auto;grid-template-areas:"t f s"}.rkpage .rk-look{justify-self:end;width:100%;max-width:26rem}}
.rkpage .rk-look-in{flex:1 1 auto;min-width:0;height:2.45rem;padding:0 12px;border:0;border-radius:8px;background:rgba(0,0,0,.42);box-shadow:inset 0 0 0 1px rgba(255,255,255,.18);color:#f3ead9;font:inherit;font-size:.95rem}
.rkpage .rk-look-in::placeholder{color:#a79f8e;opacity:1}
.rkpage .rk-look-in:focus-visible{outline:2px solid var(--gold-x);outline-offset:1px}
.rkpage .rk-look-in[aria-invalid="true"]{box-shadow:inset 0 0 0 1px rgba(241,55,62,.85)}
.rkpage .rk-look-in[readonly]{opacity:.7}
.rkpage .rk-look-go{flex:none}
.rkpage .rk-outbar .rk-lkmsg{flex:1 1 100%;margin:0;font-size:.92rem;line-height:1.45;color:#e9e1cf}
.rkpage .rk-outbar .rk-lkmsg:empty{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}   /* a live region: always in the page, out of sight while empty */
/* the looked-up player's "Your place" plate: the signed-in plate's parts (.rk-me, .rk-msg, .rk-facts), shown to signed-out visitors only */
.rkpage .rk-lk[hidden],html[data-auth="in"] .rkpage .rk-lk{display:none}
.rkpage .rk-me .rk-av.rk-lkav{width:48px;height:48px}
.rkpage .rk-lk h2:focus{outline:none}
.rkpage button.rk-notyou{padding:2px 0;border:0;background:none;cursor:pointer;text-align:left}
/* the bar under the podium shows for a looked-up player too (the rule below hides it for everyone signed out) */
html:not([data-auth="in"]) .rkpage.rk-lkon .rk-bar:not([hidden]){display:block}
html:not([data-auth="in"]) .rkpage .rk-you{display:none}
.rkpage .ptitle-row .rk-demo{align-self:center;padding:4px 10px 3px;border-radius:999px;font-family:var(--font-t);font-weight:700;font-size:.78rem;letter-spacing:.08em;text-transform:uppercase;
  color:#f3dcff;background:rgba(110,58,154,.45);box-shadow:inset 0 0 0 1px rgba(238,130,238,.55)}
.rkpage .rk-demo[hidden]{display:none}
.rkpage .rk-off{margin:0 0 18px;padding:12px 16px;border-radius:10px;background:rgba(0,0,0,.3);box-shadow:inset 0 0 0 1px rgba(255,255,255,.1);color:var(--muted);line-height:1.5}
.rkpage .rk-off[hidden]{display:none}
.rkpage .rk-off:not([hidden]){display:flex;align-items:center;gap:12px}   /* the words, then the retry icon (buttons.css .retry-i) at the right end */
.rkpage .rk-off-t{flex:1;min-width:0}
.rkpage section.chap{margin-bottom:22px}
.rkpage .chap-ico img{display:block;width:2rem;height:2rem;object-fit:contain}
.rkpage section.chap>.chap-b{max-width:none}   /* style.css caps .chap-b at 78ch for reading; boards and panels use the whole plate (the paragraphs keep their own cap below) */
.rkpage .rk-ask-t p,.rkpage .rk-msg p{max-width:78ch}

/* ---- your place ---- */
.rkpage .rk-me{display:flex;align-items:center;gap:12px 14px;flex-wrap:wrap;margin:0 0 12px}
.rkpage .rk-me .acct-av.rk-meav{width:48px;height:48px}
.rkpage .rk-me-t{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1 1 12rem}
.rkpage .rk-me-t .acct-nm,.rkpage .rk-me-t .rk-lk-nm{font-family:var(--font-t);font-weight:700;font-size:1.2rem;line-height:1.1;color:var(--gold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rkpage .rk-me-s{font-size:.9rem;color:var(--muted)}
.rkpage .rk-me-hide{flex:none;font-family:var(--font-t);font-weight:700;font-size:.9rem;color:var(--dim);text-decoration:none}
.rkpage .rk-me-hide:hover{color:var(--gold-x)}
.rkpage .rk-me-hide[hidden]{display:none}
.rkpage .rk-msg{display:flex;flex-wrap:wrap;align-items:center;gap:10px 12px;margin:0 0 6px}
.rkpage .rk-msg[hidden]{display:none}
.rkpage .rk-msg p{flex:1 1 100%;margin:0;line-height:1.5;color:#e9e1cf}
.rkpage .rk-msg .btn .acct-steam,.rkpage .rk-ask-go .acct-steam{width:18px;height:18px;margin-right:8px;vertical-align:-3px}
.rkpage .rk-facts[hidden]{display:none}
.rkpage .rk-facts .rk-pos{margin-left:.45em;font-family:var(--font-t);font-weight:700;color:var(--gold-x)}

/* ---- the one leaderboard: the Base / Upgraded plate pair (buttons.css .upg-toggle.game) as its tablist, one list at a time ---- */
.rkpage .rk-tabs{display:flex;flex-wrap:wrap;gap:8px 12px;margin:2px 0 12px}
.rkpage .rk-tabs button{width:auto;min-width:6.75rem;height:3.27rem;aspect-ratio:auto;padding:0 1.15rem .1rem 1.45rem;white-space:nowrap}   /* the plate's height, as wide as its words */
.rkpage .rk-tabs button.on:focus-visible::after{filter:brightness(.6) sepia(1) saturate(3);opacity:1}   /* the chosen tab still shows keyboard focus (arrow keys) */
.rkpage .rk-tabs button[hidden],.rkpage .rk-bd[hidden]{display:none}
.rkpage .rk-why{margin:12px 0 0;font-size:.9rem;line-height:1.45;color:var(--muted)}

/* ---- the podium (Bean, 25 Sep 2026: "The leaderboard should be better and more illustrative and fun"; rankings.js THE PODIUM; the judged prototype
   docs/wave6/scratch/rkpod/cards/). The top three are the site's own card (style.css .card: every offset is the game's, in --u), colourless frame; the sprites
   are set here so the runtime markup names no picture. The stage is a size container: the cards take a share of its width (cqw), so one podium fits every
   window; under 560 px of stage 1st stands alone on top and 2nd and 3rd sit side by side under it. ---- */
.rkpage .rk-stage{position:relative;isolation:isolate;container-type:inline-size;margin:0 0 14px;border-radius:12px;border:3px solid #2a2520;box-shadow:0 8px 0 #0a0806;overflow:hidden;background:#05080a}
.rkpage .rk-stage[hidden]{display:none}
/* each board's room: the Architect's study (Architect damage), the overgrowth rest site with its campfire (Hours), the glory hall (Achievements) */
.rkpage .rk-room{position:absolute;inset:-2%;background:center 38%/cover no-repeat;z-index:-2}
.rkpage .rk-stage[data-room="architect"] .rk-room{background-image:url(/img/rooms/bg/the_architect_event_encounter_0.webp);filter:brightness(.8) saturate(1.05)}
.rkpage .rk-stage[data-room="rest"] .rk-room{background-image:url(/img/rooms/rest_sites/overgrowth/overgrowth_rest_site_bg.webp);background-position:center 62%;filter:brightness(1.9) saturate(1.1)}
.rkpage .rk-stage[data-room="glory"] .rk-room{background-image:url(/img/rooms/bg/glory_2.webp);filter:brightness(.75) saturate(1.05)}
.rkpage .rk-pit{display:none}
.rkpage .rk-stage[data-room="rest"] .rk-pit{display:block;position:absolute;left:50%;bottom:10px;width:min(230px,32cqw);aspect-ratio:419/277;translate:-50% 0;z-index:-1;background:url(/img/rooms/rest_sites/overgrowth/overgrowth_rest_site_fire.webp) center/contain no-repeat;filter:brightness(1.6)}
.rkpage .rk-stage[data-room="rest"] .rk-pit::after{content:"";position:absolute;left:12%;right:12%;bottom:30%;height:150%;background:radial-gradient(closest-side at 50% 70%,#ffd27a,#ff8a2a 55%,#c2410c);
  -webkit-mask:url(/img/rooms/rest_sites/overgrowth/fire_light.webp) center bottom/100% 100% no-repeat;mask:url(/img/rooms/rest_sites/overgrowth/fire_light.webp) center bottom/100% 100% no-repeat;mix-blend-mode:screen;opacity:.9;animation:rkFire 1.6s ease-in-out infinite alternate}
@keyframes rkFire{from{opacity:.65;scale:1 .94}to{opacity:1;scale:1.03 1.05}}
.rkpage .rk-stage[data-room="rest"] .rk-pod{padding-bottom:84px}
.rkpage .rk-stage[data-room="rest"] .rk-slot.p1{margin-bottom:46px}
.rkpage .rk-stage::after{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:radial-gradient(75% 85% at 50% 42%,transparent 45%,rgba(5,8,10,.6)),linear-gradient(transparent 62%,rgba(5,8,10,.55));box-shadow:inset 0 2px 14px rgba(0,0,0,.5)}

/* 2nd, 1st, 3rd; 1st bigger, raised and glowing */
.rkpage .rk-pod{list-style:none;margin:0;padding:40px 16px 30px;display:flex;justify-content:center;align-items:flex-end;gap:0 min(46px,4.5cqw)}
.rkpage .rk-slot{position:relative;display:flex;justify-content:center}
.rkpage .rk-slot.p1{order:2;z-index:2;margin-bottom:30px;--d:.34s;--fx:0px;--fr:0deg}
.rkpage .rk-slot.p2{order:1;--d:.17s;--fx:230px;--fr:16deg}
.rkpage .rk-slot.p3{order:3;--d:0s;--fx:-230px;--fr:-16deg}
.rkpage .rk-lift{position:relative;animation:rkBob 5.2s ease-in-out infinite alternate;animation-delay:calc(var(--d) * -7)}
.rkpage .p2 .rk-lift{rotate:-3deg}
.rkpage .p3 .rk-lift{rotate:3deg}
@keyframes rkBob{from{translate:0 0}to{translate:0 -6px}}
.rkpage .rk-pc{--cw:min(13rem,25cqw);--hov-scale:1.06;--tilt-x:10deg;--tilt-y:12deg;cursor:default}
.rkpage .rk-slot.p1 .rk-pc{--cw:min(16rem,30cqw)}
/* the gold glow behind 1st: the game's card flash sprite (card_template/card_flash) as a mask, filled gold, breathing */
.rkpage .rk-glow{position:absolute;left:-11%;right:-11%;top:-7%;bottom:-7%;z-index:0;pointer-events:none;background:radial-gradient(closest-side,#fff3c4,#f3cf5c 60%,#e0a33a);filter:blur(7px);
  -webkit-mask:url(/img/packed/card_template/card_flash.webp) center/100% 100% no-repeat;mask:url(/img/packed/card_template/card_flash.webp) center/100% 100% no-repeat;opacity:.7;animation:rkGlow 2.6s ease-in-out infinite alternate}
@keyframes rkGlow{from{opacity:.42;scale:.98}to{opacity:.78;scale:1.03}}
/* 1st shimmers now and then like a rare card: a light sweep masked to the frame ring (the mask of the site's hover sheen, style.css .card .sheen) */
.rkpage .rk-shine{position:absolute;left:0;top:0;width:calc(300*var(--u));height:calc(422*var(--u));z-index:3;pointer-events:none;mix-blend-mode:screen;
  background:linear-gradient(112deg,transparent 38%,rgba(255,246,214,.5) 50%,transparent 62%) 0 0/300% 100% no-repeat;animation:rkShine 6s ease-in-out 1.6s infinite;background-position:130% 0;
  -webkit-mask-image:var(--frame),linear-gradient(#000,#000);-webkit-mask-size:100% 100%,calc(252*var(--u)) calc(190*var(--u));-webkit-mask-position:0 0,calc(24*var(--u)) calc(202*var(--u));-webkit-mask-repeat:no-repeat;-webkit-mask-composite:source-out;
  mask-image:var(--frame),linear-gradient(#000,#000);mask-size:100% 100%,calc(252*var(--u)) calc(190*var(--u));mask-position:0 0,calc(24*var(--u)) calc(202*var(--u));mask-repeat:no-repeat;mask-composite:subtract}
@keyframes rkShine{0%{background-position:130% 0}28%,100%{background-position:-30% 0}}
.rkpage .rk-pc.hov .rk-shine{display:none}
/* the flash when a card lands (the same sprite, over the card) */
.rkpage .rk-flash{position:absolute;left:-6%;right:-6%;top:-4%;bottom:-4%;z-index:8;pointer-events:none;background:url(/img/packed/card_template/card_flash.webp) center/100% 100% no-repeat;opacity:0;mix-blend-mode:screen}
/* dealt in from the bottom: 3rd, 2nd, then 1st */
.rkpage .rk-pod.deal .rk-slot{animation:rkDeal .8s cubic-bezier(.16,1,.3,1) both;animation-delay:var(--d)}
.rkpage .rk-pod.deal .rk-flash{animation:rkFlash .9s ease-out both;animation-delay:calc(var(--d) + .38s)}
.rkpage .rk-pod.deal .p1 .rk-flash{animation-duration:1.2s}
@keyframes rkDeal{from{opacity:0;transform:translate(var(--fx),190px) rotate(var(--fr)) scale(.5)}35%{opacity:1}to{opacity:1;transform:none}}
@keyframes rkFlash{0%{opacity:0}18%{opacity:.85}100%{opacity:0}}

/* the card's parts: the frame by board (Architect damage the Attack frame, Hours the Skill frame, Achievements the Power frame); banner, portrait border and plaque
   in the medal's colours: 1st the Rare gold, 2nd the Common grey (style.css data-rar), 3rd bronze (the banner turned to copper); the run badge in the cost gem */
.rkpage .rk-pc[data-frame="attack"]{--frame:url(/img/ui/card/card_frame_attack_s.webp);--pbord:url(/img/ui/card/card_portrait_border_attack_s.webp)}
.rkpage .rk-pc[data-frame="skill"]{--frame:url(/img/ui/card/card_frame_skill_s.webp);--pbord:url(/img/ui/card/card_portrait_border_skill_s.webp)}
.rkpage .rk-pc[data-frame="power"]{--frame:url(/img/ui/card/card_frame_power_s.webp);--pbord:url(/img/ui/card/card_portrait_border_power_s.webp)}
.rkpage .rk-pc .frame,.rkpage .rk-pc .shadow{background-image:var(--frame)}
.rkpage .rk-pc .pborder{background-image:var(--pbord)}
.rkpage .rk-pc .banner{background-image:url(/img/ui/card/card_banner.webp)}
.rkpage .rk-pc .plaque{background-image:url(/img/ui/card/card_portrait_border_plaque_s.webp)}
.rkpage .rk-pc[data-rar="bronze"] .banner,.rkpage .rk-pc[data-rar="bronze"] .pborder,.rkpage .rk-pc[data-rar="bronze"] .plaque{filter:hue-rotate(198deg) saturate(1.25) brightness(.72)}
.rkpage .rk-pc[data-rar="bronze"]{--tout:#5A3514}
.rkpage .rk-pc[data-medal="gold"]{--eout:#6B4B00}
.rkpage .rk-pc[data-medal="silver"]{--eout:#0E4A57}
.rkpage .rk-pc[data-medal="bronze"]{--eout:#5A3514}
.rkpage .rk-pc[data-medal="gold"] .rk-pcrk{background-image:url(/img/ui/game_over_screen/badge_gold.webp)}
.rkpage .rk-pc[data-medal="silver"] .rk-pcrk{background-image:url(/img/ui/game_over_screen/badge_silver.webp)}
.rkpage .rk-pc[data-medal="bronze"] .rk-pcrk{background-image:url(/img/ui/game_over_screen/badge_bronze.webp)}
.rkpage .rk-pc .energy.rk-pcrk{left:calc(-24*var(--u));top:calc(-24*var(--u));width:calc(84*var(--u));height:calc(84*var(--u));filter:drop-shadow(0 calc(3*var(--u)) 0 rgba(0,0,0,.4))}
.rkpage .rk-pc .energy.rk-pcrk span{font-size:calc(38*var(--u));translate:0 calc(-1*var(--u))}
/* the avatar is the art (Steam's picture, else the game's profile icon; an open place: the game's gold question mark on a warm glow) */
.rkpage .rk-pc .portrait{background:radial-gradient(60% 70% at 50% 50%,#23343b,#141b1f)}
.rkpage .rk-pcav{position:absolute;inset:0;background:var(--av,none) 50% 45%/cover no-repeat,url(/img/ui/profile/profile_icon_1.webp) 50% 50%/calc(96*var(--u)) no-repeat}
.rkpage .rk-pcav.no{filter:drop-shadow(0 calc(4*var(--u)) 0 rgba(0,0,0,.45))}
.rkpage .rk-pco .portrait{background:radial-gradient(55% 75% at 50% 55%,rgba(239,200,81,.35),transparent 70%),#1d2226}
.rkpage .rk-pco .rk-pcav{background:url(/img/ui/run_history/event.webp) 50% 50%/calc(120*var(--u)) no-repeat;filter:drop-shadow(0 calc(4*var(--u)) 0 rgba(0,0,0,.45))}
.rkpage .rk-pco .title{color:#e9dcc0}
/* the name on the banner: clear of the badge at its left end; rankings.js rkFit steps a long one down (long, xlong, xxl), never under 11 px, then the ellipsis */
.rkpage .rk-pc .title{padding:0 calc(6*var(--u)) 0 calc(22*var(--u));font-size:max(11px,calc(26*var(--u)))}
.rkpage .rk-pc .title.long{font-size:max(11px,calc(22*var(--u)))}
.rkpage .rk-pc .title.xlong{font-size:max(11px,calc(18*var(--u)))}
.rkpage .rk-pc .title.xxl{font-size:max(11px,calc(15.5*var(--u)));-webkit-text-stroke:.28em var(--tout,#4D4B40)}
.rkpage .rk-pcn{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.3em .12em;margin:-.3em 0}
/* the place word on the plaque (1st, 2nd, 3rd) */
.rkpage .rk-pc .plaque span{font-size:max(9px,calc(17*var(--u)))}
/* the number as the card text, the words under it */
.rkpage .rk-pc .desc .tx{display:flex;flex-direction:column;align-items:center;gap:calc(5*var(--u))}
.rkpage .rk-pcv{font-family:var(--font-t);font-weight:700;font-size:calc(50*var(--u));line-height:1;letter-spacing:.01em;color:#EFC851;paint-order:stroke fill;-webkit-text-stroke:.14em #2E2005;text-shadow:0 .07em 0 rgba(0,0,0,.35);font-variant-numeric:tabular-nums;white-space:nowrap}
.rkpage .rk-pcv.l{font-size:calc(40*var(--u))}
.rkpage .rk-pcv.xl{font-size:calc(32*var(--u))}
.rkpage .rk-pcu{font-size:max(11px,calc(21*var(--u)));line-height:1.1}
.rkpage .rk-pco .rk-pcu{color:#e9dcc0;font-size:max(11px,calc(22*var(--u)))}
.rkpage .rk-pc .sticker{right:calc(-14*var(--u));top:calc(-14*var(--u));font-size:max(11px,calc(24*var(--u)))}
/* loading: the card parts in grey, breathing */
.rkpage .rk-slot.ghost .rk-lift{animation:none}
.rkpage .rk-pcg{animation:rkPulse 1.3s ease-in-out infinite alternate}
.rkpage .rk-pcg .frame,.rkpage .rk-pcg .pborder,.rkpage .rk-pcg .banner,.rkpage .rk-pcg .plaque{filter:grayscale(1) brightness(.42)!important}
.rkpage .rk-pcg .portrait{background:#101518}
.rkpage .rk-pcg .desc .tx{display:flex;flex-direction:column;align-items:center;gap:calc(14*var(--u));width:100%}
.rkpage .rk-pcg .desc i{display:block;height:calc(26*var(--u));width:60%;border-radius:calc(6*var(--u));background:rgba(255,255,255,.07)}
.rkpage .rk-pcg .desc i+i{width:40%;height:calc(16*var(--u))}
@keyframes rkPulse{from{opacity:.55}to{opacity:.9}}
/* a narrow stage (phones): 1st on its own row, 2nd and 3rd side by side under it */
@container (max-width:560px){
  .rkpage .rk-pod{flex-wrap:wrap;gap:22px 14px;padding:28px 8px 22px}
  .rkpage .rk-slot.p1{order:0;flex:1 0 100%;margin-bottom:0}
  .rkpage .rk-slot.p2{order:1;--fx:60px}
  .rkpage .rk-slot.p3{order:2;--fx:-60px}
  .rkpage .rk-pc{--cw:min(9.5rem,43cqw)}
  .rkpage .rk-slot.p1 .rk-pc{--cw:min(12.5rem,56cqw)}
  .rkpage .p2 .rk-lift{rotate:-2deg}
  .rkpage .p3 .rk-lift{rotate:2deg}
  .rkpage .rk-stage[data-room="rest"] .rk-slot.p1{margin-bottom:0}
  .rkpage .rk-stage[data-room="rest"] .rk-pod{padding-bottom:64px}
  .rkpage .rk-stage[data-room="rest"] .rk-pit{width:170px;bottom:4px}}

/* ---- the viewer's bar under the podium (signed in only): their place, then the gap to the row above as the game's health bar ---- */
.rkpage .rk-bar{margin:0 0 12px}
.rkpage .rk-bar[hidden],html:not([data-auth="in"]) .rkpage .rk-bar{display:none}
.rkpage .rk-bar-in{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;padding:9px 16px 9px 10px;border-radius:10px;background:rgba(239,200,81,.1);box-shadow:inset 0 0 0 1px rgba(239,200,81,.55)}
.rkpage .rk-bar-rk{flex:none;min-width:3.4rem;text-align:center;font:700 1.55rem/1 var(--font-t);color:var(--gold);text-shadow:0 2px 0 rgba(0,0,0,.45);font-variant-numeric:tabular-nums}
.rkpage .rk-bar-rk small{font-size:.62em;margin-left:1px}
.rkpage .rk-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
.rkpage .rk-bar .rk-av{width:2.75rem;height:2.75rem}
.rkpage .rk-bar-t{flex:1 1 10rem;min-width:0;display:flex;flex-direction:column;gap:2px}
.rkpage .rk-bar-t>b{display:flex;align-items:center;gap:8px;min-width:0;font-weight:700;color:#f3ead9;font-size:1.05rem}
.rkpage .rk-bar-nm{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rkpage .rk-bar-t>span{font-size:.92rem;color:var(--muted)}
.rkpage .rk-bar-go{flex:0 1 auto;display:flex;flex-direction:column;align-items:flex-end;gap:5px;margin-left:auto}
.rkpage .rk-bar-gl{font-size:.9rem;color:#e9e1cf}
.rkpage .rk-bar-gl b{font-family:var(--font-t);color:var(--gold)}
.rkpage .rk-bar-out{background:rgba(0,0,0,.28);box-shadow:inset 0 0 0 1px rgba(255,255,255,.1);padding-left:14px}
.rkpage .rk-bar-in.ghost{background:rgba(0,0,0,.24);box-shadow:none;min-height:3.9rem}
.rkpage .rk-bar-in.ghost .rk-av{background:rgba(255,255,255,.06);box-shadow:none}
.rkpage .rk-bar-in.ghost .rk-bar-t i{display:block;height:.7rem;width:9rem;max-width:100%;border-radius:4px;background:rgba(255,255,255,.08)}
.rkpage .rk-bar-in.ghost .rk-bar-t i+i{width:5rem;margin-top:5px}
/* the game's health bar (scenes/combat/health_bar.tscn, as lethal.css draws it): the dark back, the fill in its pointed strip, the numbers over it; red, Block blue on Hours */
.rkpage .rk-hp{--gu:1.2px;position:relative;display:block;width:17rem;max-width:100%;height:calc(16*var(--gu))}
.rkpage .rk-hp::before{content:"";position:absolute;inset:0 var(--gu);border:0 solid transparent;border-width:0 calc(9*var(--gu));border-image:url(/img/ui/combat/hp/bg.webp) 0 9 fill/0 calc(9*var(--gu)) stretch;pointer-events:none}
.rkpage .rk-hp .strip{position:absolute;inset:calc(3*var(--gu)) calc(5*var(--gu));overflow:hidden;clip-path:polygon(0 50%,calc(5*var(--gu)) 0,calc(100% - 5*var(--gu)) 0,100% 50%,calc(100% - 5*var(--gu)) 100%,calc(5*var(--gu)) 100%)}
.rkpage .rk-hp .strip>i{position:absolute;left:0;top:calc(-4*var(--gu));bottom:calc(-4*var(--gu));width:var(--fw,0%);--c1:#F1373E;--c2:#CC2F35;--c3:#A5262B;background:linear-gradient(var(--c1) 0 56.25%,var(--c2) 56.25% 62.5%,var(--c3) 62.5%);animation:rkFill 1.1s cubic-bezier(.16,1,.3,1) .5s both}
.rkpage .rk-hp.blk .strip>i{--c1:#3B6FA3;--c2:#325E8A;--c3:#284C70}
@keyframes rkFill{from{width:0}}
.rkpage .rk-hp .lbl{position:absolute;left:50%;top:50%;translate:-50% -52%;z-index:2;font-family:var(--font-t);font-weight:700;font-size:calc(17*var(--gu));line-height:1;letter-spacing:calc(.5*var(--gu));color:#FFF6E2;white-space:nowrap;paint-order:stroke fill;-webkit-text-stroke:calc(5*var(--gu)) #900000;text-shadow:calc(3*var(--gu)) calc(3*var(--gu)) 0 rgba(0,0,0,.25);font-variant-numeric:tabular-nums}
.rkpage .rk-hp.blk .lbl{-webkit-text-stroke-color:#1B3045}

/* ---- the list from 4th: each row's back filled as far as its number reaches against 1st (rankings.js rkRowHtml --pct) ---- */
.rkpage .rk-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}
.rkpage .rk-list[hidden]{display:none}
.rkpage .rk-row{position:relative;isolation:isolate;display:grid;grid-template-columns:2.4rem 2.35rem minmax(0,1fr) auto;align-items:center;gap:12px;min-height:3rem;padding:5px 14px 5px 6px;border-radius:8px;background:rgba(0,0,0,.26);overflow:hidden}
.rkpage .rk-row::before{content:"";position:absolute;left:0;top:0;bottom:0;width:var(--pct,0%);z-index:-1;background:linear-gradient(90deg,rgba(239,200,81,0),rgba(239,200,81,.07));box-shadow:inset -2px 0 0 rgba(239,200,81,.16)}
.rkpage .rk-row.rk-ghost::before{display:none}
.rkpage .rk-row.me{background:rgba(239,200,81,.1);box-shadow:inset 0 0 0 1px rgba(239,200,81,.55)}
.rkpage .rk-rank{display:grid;place-items:center;width:2.25rem;height:2.25rem;font-family:var(--font-t);font-weight:700;font-size:1.08rem;line-height:1;color:var(--muted);font-variant-numeric:tabular-nums}
.rkpage .rk-row.top1 .rk-rank,.rkpage .rk-row.top2 .rk-rank,.rkpage .rk-row.top3 .rk-rank{background:center/contain no-repeat;font-size:1.05rem;filter:drop-shadow(0 2px 0 rgba(0,0,0,.45))}
.rkpage .rk-row.top1 .rk-rank{background-image:url(/img/ui/game_over_screen/badge_gold.webp);color:#3a2600;text-shadow:0 1px 0 rgba(255,240,190,.6)}
.rkpage .rk-row.top2 .rk-rank{background-image:url(/img/ui/game_over_screen/badge_silver.webp);color:#0d2830;text-shadow:0 1px 0 rgba(220,250,255,.55)}
.rkpage .rk-row.top3 .rk-rank{background-image:url(/img/ui/game_over_screen/badge_bronze.webp);color:#fff1de;text-shadow:0 1px 1px rgba(0,0,0,.6)}
.rkpage .rk-av{display:block;flex:none;width:2.35rem;height:2.35rem;border-radius:50%;background:var(--av,none) center/cover no-repeat,#1c2a30 var(--spr-avatar) center/118% no-repeat;box-shadow:0 0 0 2px rgba(184,144,61,.8),0 2px 0 2px rgba(0,0,0,.4)}
.rkpage .rk-name{display:flex;align-items:center;gap:6px;min-width:0;font-weight:700;color:#f3ead9;overflow:hidden}
.rkpage .rk-name{white-space:nowrap}
.rkpage .rk-nm{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}   /* the name itself ellipsizes (a flex box does not), the You tag stays whole */
.rkpage .rk-you-tag{flex:none;padding:2px 6px 1px;border-radius:5px;font-family:var(--font-t);font-size:.7rem;letter-spacing:.06em;text-transform:uppercase;color:#241600;background:var(--gold)}
.rkpage .rk-val{font-family:var(--font-t);font-weight:700;font-size:1.02rem;color:var(--gold);font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}
.rkpage .rk-gap{list-style:none;height:12px;display:flex;align-items:center;justify-content:center}
.rkpage .rk-gap span{width:40px;height:4px;background:radial-gradient(circle,rgba(255,255,255,.35) 1.5px,transparent 2px) 0 50%/10px 4px repeat-x}
.rkpage .rk-ghost .rk-name i,.rkpage .rk-ghost .rk-val i{display:block;height:.7rem;border-radius:4px;background:rgba(255,255,255,.08)}
.rkpage .rk-ghost .rk-name i{width:62%}
.rkpage .rk-ghost .rk-val i{width:3.2rem}
.rkpage .rk-ghost .rk-av{background:rgba(255,255,255,.06);box-shadow:none}
.rkpage .rk-foot{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin:12px 0 0}
.rkpage .rk-foot:empty{display:none}
.rkpage .rk-count{flex:1 1 auto;margin:0;font-size:.9rem;color:var(--dim)}
.rkpage .rk-empty{display:flex;flex-direction:column;align-items:flex-start;gap:10px;flex:1 1 100%;padding:12px 14px;border-radius:10px;background:rgba(0,0,0,.22)}
.rkpage .rk-empty p{margin:0;line-height:1.5;color:var(--muted)}
.rkpage .rk-foot .acct-signin{font-size:.88rem}
/* reduced motion: the podium stands still (no deal, bob, glow, shimmer, fire or bar fill; rankings.js skips the count-up) */
@media (prefers-reduced-motion:reduce){
  .rkpage .rk-lift,.rkpage .rk-glow,.rkpage .rk-pcg,.rkpage .rk-hp .strip>i,.rkpage .rk-shine,.rkpage .rk-pit::after,.rkpage .rk-pod.deal .rk-slot,.rkpage .rk-pod.deal .rk-flash{animation:none}}

/* ---- how it works ---- */
.rkpage .rk-howl{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:10px}
@media (min-width:1100px){.rkpage .rk-howl{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:22px}}
.rkpage .rk-howl li{display:flex;align-items:flex-start;gap:12px;line-height:1.5;color:#e9e1cf}
.rkpage .rk-how-i{flex:none;width:30px;height:30px;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(0,0,0,.5))}
.rkpage .rk-howl .acct-steam.rk-how-i{background-size:contain}
.rkpage .rk-priv[hidden]{display:none}

/* ---- want more rankings: the Architect beside the words ---- */
.rkpage .rk-ask-b{display:flex;align-items:center;gap:8px 26px}
.rkpage .rk-ask-art{flex:none;order:2;width:clamp(160px,24%,230px);height:auto;margin:-6px 0 -10px;filter:drop-shadow(0 6px 10px rgba(0,0,0,.55))}
.rkpage .rk-ask-t{flex:1 1 auto;min-width:0}
.rkpage .rk-ask-t p{margin:0 0 12px;line-height:1.55;color:#e9e1cf}
.rkpage .rk-ask-go{margin-top:4px}
@media (max-width:640px){
  .rkpage .rk-ask-b{flex-direction:column;align-items:stretch}
  .rkpage .rk-ask-art{order:0;align-self:center;width:150px;margin:0 0 -4px}
  .rkpage .rk-row{grid-template-columns:2rem 2.1rem minmax(0,1fr) auto;gap:9px;padding-right:10px}
  .rkpage .rk-list .rk-av{width:2.1rem;height:2.1rem}
  .rkpage .rk-bar-go{flex:1 1 100%;align-items:stretch;margin-left:0}
  .rkpage .rk-bar-gl{align-self:flex-start}
  .rkpage .rk-hp{width:100%}
  .rkpage .rk-rank{width:2rem;height:2.1rem}
  .rkpage .rk-me-hide{flex-basis:100%}}

/* ---- the profile's switch ---- */
.rk-pf .rk-pfbox{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:14px 16px;border-radius:12px;background:rgba(0,0,0,.28);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08)}
.rk-pf .rk-tog{display:inline-flex;align-items:center;gap:12px;padding:4px 6px 4px 2px;border:0;border-radius:8px;background:none;color:#f3ead9;font:700 1.05rem/1.2 var(--font-t);cursor:pointer}
.rk-pf .rk-tog:disabled{cursor:default;opacity:.6}
.rk-pf .rk-tog:focus-visible{outline:2px solid var(--gold-x);outline-offset:2px}
.rk-pf .rk-tick{flex:none;width:32px;height:32px;background:url(/img/ui/checkbox_unticked.webp) center/contain no-repeat;filter:drop-shadow(0 2px 0 rgba(0,0,0,.45));transition:scale .5s cubic-bezier(.16,1,.3,1)}
.rk-pf .rk-tog[aria-checked="true"] .rk-tick{background-image:url(/img/ui/checkbox_ticked.webp)}
.rk-pf .rk-tog:not(:disabled):hover .rk-tick{scale:1.08;transition-duration:.05s}
.rk-pf .rk-pfmsg{margin:0;color:var(--muted);line-height:1.5;font-size:.95rem}

/* the podium card and a row's avatar + name link to the player's page (Bean, 25 Sep 2026); never underlined, the name lights up */
.rkpage a.rk-pc{display:block;color:inherit;text-decoration:none}
.rkpage a.rk-pc:focus-visible{outline:2px solid var(--gold);outline-offset:4px;border-radius:12px}
.rkpage .rk-plink{display:contents;color:inherit;text-decoration:none}
.rkpage .rk-plink:hover,.rkpage .rk-plink:focus-visible{text-decoration:none}
.rkpage .rk-plink .rk-nm{transition:color .15s}
.rkpage .rk-plink:hover .rk-nm,.rkpage .rk-plink:focus-visible .rk-nm{color:#fff}
.rkpage .rk-plink:hover .rk-av{box-shadow:0 0 0 2px var(--gold)}
/* the player page (players/<id>) */
.rkplayer .rk-pl .rk-me{margin-bottom:16px}
.rkplayer .rk-pl .rk-lkav{width:64px;height:64px}
.rkplayer .rk-pl .rk-lk-nm{font-size:1.45rem}
.rkplayer .rk-plback{margin:18px 0 0}

/* ===== app/reveal.css ===== */
/* ===== pages arrive as one piece (wave 4, shell stream; app/reveal.js, docs/wave4/shell.md) =====
   Bean, 21 Sep 2026: "I don't like that pages load in all the assets so abruptly ... wait until they are all loaded in in the background and fade them in over a
   0.75s period if we must."
   - html.pf-hold: the page column waits, invisible, while the pictures of its first screen load and decode (reveal.js; about 0.65 s at most). The class is only ever
     set by script (the pre-paint line in shell.html, or reveal.js on a route change), so a page without script is simply visible; and if the script that should lift
     it never runs, the pf-safe animation shows the column by itself after 2.6 s.
   - html.pf-in: the column fades in ONCE, as one piece, over 0.32 s (0.75 s until 22 Sep 2026). This replaces the old 0.28 s "pagein" rise of .page, which started before any picture was there.
   - img.pf-wait / img.pf-show: a picture further down that was not loaded yet stays invisible until it has decoded, then fades in over the same 0.75 s instead of
     snapping in (a picture that arrives within a moment, from the cache, is just shown).
   The rail, the top bar and the footer are never part of this: they are static. Reduced motion: nothing is held and nothing fades (reveal.js does not run it; the
   global rule in style.css also flattens the durations). */
.page{animation:none}
html.pf-hold #main{opacity:0;visibility:hidden;animation:pf-safe .01s linear 2.6s forwards}   /* visibility too: the column is then PAINTED for the first time when the fade starts (see pf-in below), which is when the browser should time the page's largest paint */
/* pf-pre: the frames between the hold and the fade (reveal.js lift). The column is drawn for the first time here, all its pictures with it, at an opacity nobody can see, so that
   work is not taken out of the fade: filmed without it, the first visible frame of the fade was already at a third of its opacity (a pop, then the rest of a fade) */
html.pf-pre #main{opacity:.02;will-change:opacity;animation:pf-safe .01s linear 1s forwards}
/* the curve starts slowly on purpose: the browser is still busy with the new page in the first tenth of a second (measured: the main thread stalls 50 to 100 ms there), and with
   a fast start a stalled frame showed as a jump of a third of the opacity. With a slow start the same stall costs a few hundredths. */
html.pf-in #main{will-change:opacity;animation:pf-in .32s cubic-bezier(.42,0,.3,1) both}   /* .75 s until 22 Sep 2026 (Bean: "The fading in feels pretty slow") */
#main img.pf-wait{opacity:0}
#main img.pf-show{transition:opacity .32s cubic-bezier(.42,0,.3,1)}   /* a transition, not an animation: a creature's own breathe / floaty animation keeps running, and the picture lands on its own opacity */
@keyframes pf-in{from{opacity:.02}to{opacity:1}}   /* .02, not 0: Chrome does not count a picture painted under opacity 0 as painted, and the largest paint of the page was only recorded when the fade had ENDED (about 0.85 s late); from .02 it is recorded when the fade starts */
@keyframes pf-safe{to{opacity:1;visibility:visible}}
@media (prefers-reduced-motion:reduce){html.pf-hold #main,html.pf-pre #main{opacity:1;visibility:visible;animation:none}html.pf-in #main{animation:none}#main img.pf-show{transition:none}#main img.pf-wait{opacity:1}}

/* ===== app/seedfinder.css ===== */
/* ===== THE SEED FINDER (app/seedfinder.js, docs/wave6/seedfinder.md) =====
   The site's own parts: the character-select portraits (filters.css .fpick), the chip look (.fchip) for the version and the unlock toggles, the dark
   dropdown of the lists' Sort (.fsort .sel) for the look of the page's own dropdowns (.sf-dd), the section plates (plate.css), the game's map, menu and
   boss sprites as icons. Everything is scoped under .sfpage. */
.sfpage .sf-lede{max-width:60rem;margin:.35rem 0 0;color:var(--muted);font-size:1.02rem;line-height:1.5}
.sfpage .fpick.pillrow{margin-bottom:10px}
.sf-opts{display:flex;flex-wrap:wrap;align-items:center;gap:10px 26px;margin:0 0 14px}
.sf-asc{display:inline-flex;align-items:center;gap:10px;font-family:var(--font-t);font-size:.74rem;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
.sf-li{width:1.7rem;height:1.7rem;object-fit:contain}
/* multiplayer: your place in the lobby and the other players' characters (app/seedfinder.js sfLobHtml), labelled like Ascension */
.sf-lob{display:flex;flex-wrap:wrap;align-items:center;gap:10px 26px;margin:-2px 0 14px}
.sf-lobi{display:inline-flex;align-items:center;gap:10px;min-width:0;font-family:var(--font-t);font-size:.74rem;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
.sf-lobi .sf-ddb{min-width:9.5rem}
.sf-lobme .sf-ddb{min-width:11.5rem}

/* the dropdowns: a button with the lists' Sort look (filters.css .fsort) and its own list, always under it (Bean, 23 Sep 2026: "Dropdowns need to always
   open downward"; app/seedfinder.js sfDd*) */
.sf-dd{position:relative;display:inline-flex;min-width:0}
.sf-ddb{position:relative;display:flex;align-items:center;width:100%;min-width:0;min-height:42px;margin:0;padding:0 38px 0 13px;border:2px solid #0a1216;border-radius:9px;background:#0f1c22;box-shadow:inset 0 2px 0 rgba(0,0,0,.35);color:#fff6e2;font-family:var(--font-t);font-size:1rem;line-height:1.2;text-align:left;cursor:pointer;transition:border-color .12s}
.sf-ddb::after{content:"";position:absolute;right:15px;top:50%;width:8px;height:8px;margin-top:-6px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);rotate:45deg;transition:rotate .15s,margin .15s}
.sf-dd.open>.sf-ddb::after{rotate:225deg;margin-top:-2px}
.sf-ddv{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
/* the picked thing's picture in the button (Bean, 24 Sep 2026: "same with all the dropdowns style them like that") */
.sf-ddb.wi{gap:9px;padding-left:7px}
.sf-ddb .sf-ddic{width:2rem;height:1.9rem}
.sf-ddb .sf-ddi{width:1.9rem;height:1.9rem}
.sf-ddb .sf-ddi:is(.k-cards,.k-events,.k-acts){width:2rem;height:1.5rem}
.sf-ddb:hover{border-color:var(--line-l)}
.sf-ddb:focus-visible,.sf-dd.open>.sf-ddb{border-color:color-mix(in srgb,var(--teal) 45%,#0a1216);outline:0;box-shadow:inset 0 2px 0 rgba(0,0,0,.35),0 0 0 3px rgba(63,216,207,.14)}
.sf-row.set>.sf-rv .sf-ddb{border-color:color-mix(in srgb,var(--gold) 55%,#0a1216);color:var(--gold-x)}
.sf-ddn .sf-ddb{min-width:4.4rem;padding-right:34px}
.sf-ddn .sf-ddb::after{right:13px}
.sf-ddp{position:absolute;left:0;top:calc(100% + 6px);z-index:40;display:flex;flex-direction:column;min-width:100%;width:max-content;max-width:min(30rem,calc(100vw - 16px));border:2px solid #0a1216;border-radius:10px;background:#0f1c22;box-shadow:0 14px 30px rgba(0,0,0,.65),0 0 0 1px rgba(255,255,255,.07);overflow:hidden}
.sfpage .sf-ddq{flex:none;margin:8px 8px 2px;padding:8px 11px 7px;border:2px solid #0a1216;border-radius:7px;background:#08131a;box-shadow:inset 0 2px 0 rgba(0,0,0,.4);color:#fff;font-family:var(--font-b);font-size:max(.95rem,16px);-webkit-appearance:none;appearance:none}
.sfpage .sf-ddq::placeholder{color:var(--dim);opacity:1}
.sfpage .sf-ddq:focus{outline:0;border-color:color-mix(in srgb,var(--teal) 50%,#0a1216)}
.sf-ddl{position:relative;max-height:min(27rem,64vh);overflow-y:auto;overscroll-behavior:contain;padding:4px 0 6px;outline:0}
/* a row (Bean, 24 Sep 2026: "the dropdown entries should be a bit bigger and have the relic icon on the left"): the thing's picture in a fixed column, its name,
   its hover plate beside the list (core.js placeTip, [data-tipside]) */
.sf-ddo{display:flex;align-items:center;gap:12px;min-height:2.9rem;padding:8px 16px;color:#e9dcc0;font-family:var(--font-t);font-size:1.05rem;line-height:1.25;cursor:pointer}
.sf-ddo.wi{min-height:3.4rem;padding:5px 16px 5px 10px}
.sf-ddt{display:flex;align-items:baseline;gap:10px;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.sf-ddt small{overflow:hidden;text-overflow:ellipsis;color:var(--dim);font-size:.88rem;font-weight:400}
.sf-ddic{display:flex;flex:none;align-items:center;justify-content:center;width:3.3rem;height:2.8rem}
.sf-ddi{display:block;width:2.8rem;height:2.8rem;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.55))}
/* the wide pictures (a card's art, an event's or an act's room) as small framed thumbnails */
.sf-ddi:is(.k-cards,.k-events,.k-acts){width:3.3rem;height:2.5rem;object-fit:cover;border-radius:5px;box-shadow:0 0 0 1px rgba(255,255,255,.14),0 2px 3px rgba(0,0,0,.55);filter:none}
.sf-ddi.any{opacity:.55;filter:grayscale(.6) drop-shadow(0 2px 1px rgba(0,0,0,.55))}
.sf-ddo.act{background:rgba(63,216,207,.15);color:#fff}
.sf-ddo[aria-selected="true"]{color:var(--gold-x);font-weight:700}
.sf-ddo[aria-selected="true"] small{font-weight:400}
.sf-ddg{padding:12px 16px 5px;font-family:var(--font-t);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.sf-dd0{margin:0;padding:9px 14px;color:var(--dim)}
.sf-ddgr[hidden],.sf-ddo[hidden],.sf-dd0[hidden]{display:none}
/* the plate holding an open list sits over the plates after it */
.sfpage section.chap:has(.sf-dd.open){z-index:6}

/* everything unlocked, in the unlocks fold's old housing (Bean, 23 Sep 2026: "The "your unlocks" sections isnt needed. Instead, in that same housing just say
   "The seed generation function only works if you have everything unlocked in game."") */
.sfpage .sf-unl{display:flex;align-items:center;gap:10px;margin:0 0 6px;padding:9px 14px;border:1px solid rgba(255,255,255,.1);border-radius:10px;background:rgba(0,0,0,.24);font-family:var(--font-t);font-size:1.02rem;line-height:1.35;color:var(--text)}
.sf-ui{flex:none;width:1.8rem;height:1.8rem;object-fit:contain}

/* what to look for: one plate per act, one tile per field (Bean, 23 Sep 2026: "the selections on the What to look for section is like so unbelievably
   squished and annoying to look at ... lets break it up a bit and make it a more enjoyable (but clear) for the user") */
/* style.css caps .chap-b at 78ch for reading; the form and the seeds use the whole plate */
.sfpage section.chap>.chap-b{max-width:none}
.sf-found>.chap-b,.sf-look>.chap-b{container:sfbox/inline-size}
.sf-how>.chap-b>*{max-width:78ch}
.sf-wh{margin:calc(var(--stack) + 4px) 0 0}
.sfpage section.chap>.chap-h .chap-t h3{margin:0;font-family:var(--font-t);font-weight:700;font-size:1.35rem;line-height:1.1;color:#fff6e2;letter-spacing:.01em;text-shadow:0 2px 0 rgba(0,0,0,.55),0 0 14px rgba(0,0,0,.35)}
.sf-fs{display:grid;grid-template-columns:repeat(auto-fill,minmax(15rem,1fr));gap:12px}
.sf-f{display:flex;flex-direction:column;gap:10px;min-width:0;padding:12px 12px 14px;border:1px solid rgba(255,255,255,.07);border-radius:10px;background:rgba(0,0,0,.24)}
.sf-f:has(.sf-row.set){border-color:color-mix(in srgb,var(--gold) 32%,transparent);background:linear-gradient(rgba(239,200,81,.07),rgba(0,0,0,.24) 70%)}
.sf-fl{display:flex;align-items:center;gap:10px;min-height:2.2rem;font-family:var(--font-t);font-size:1.08rem;font-weight:700;line-height:1.15;color:#fff6e2}
.sf-fi{flex:none;width:2.2rem;height:2.2rem;object-fit:contain;filter:drop-shadow(0 2px 1px rgba(0,0,0,.5))}
/* the map's room icons carry wide empty margins (their art fills 52 to 68% of the square): drawn larger so every tile's icon reads the same size */
.sf-f-fights .sf-fi,.sf-f-events .sf-fi{scale:1.6}
.sf-f-boss .sf-fi,.sf-f-elites .sf-fi{scale:1.4}
.sf-f-chest .sf-fi{scale:1.55}
.sf-rows{display:grid;gap:10px;min-width:0}
.sf-row{display:grid;gap:8px;min-width:0}
.sf-rv{display:flex;align-items:center;gap:8px;min-width:0}
.sf-rv>.sf-dd{flex:1 1 auto}
.sf-n{display:flex;flex-wrap:wrap;align-items:center;gap:6px 9px;color:var(--muted);font-size:.95rem}
.sf-x{position:relative;flex:none;width:34px;height:34px;padding:0;border:1px solid rgba(255,255,255,.14);border-radius:7px;background:rgba(0,0,0,.3);cursor:pointer}
.sf-x::before,.sf-x::after{content:"";position:absolute;left:50%;top:50%;width:12px;height:2px;margin:-1px 0 0 -6px;border-radius:1px;background:var(--muted);rotate:45deg}
.sf-x::after{rotate:-45deg}
.sf-x:hover{border-color:rgba(255,255,255,.5)}.sf-x:hover::before,.sf-x:hover::after{background:#fff}
.sf-x:focus-visible,.sf-more:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
.sf-more{justify-self:start;padding:2px 0;border:0;background:none;color:var(--teal);font-family:var(--font-t);font-size:.9rem;cursor:pointer}
.sf-more:hover{color:#fff}
.sfpage .sf-sub{margin:18px 0 10px;padding-top:14px;border-top:1px solid rgba(255,255,255,.09);font-family:var(--font-t);font-size:1.12rem;font-weight:700;color:var(--gold)}
.sf-go{display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px;margin:18px 0 0;padding:14px 16px;border:1px solid rgba(255,255,255,.1);border-radius:12px;background:rgba(0,0,0,.3)}
.sf-cap{display:inline-flex;align-items:center;gap:10px;color:var(--muted);font-size:.95rem}
.sf-stat{flex:1 1 auto;margin:0;color:var(--muted);font-size:.95rem;font-variant-numeric:tabular-nums;white-space:nowrap}   /* one line (Bean: "this cant take up 2 lines"): beside the controls, or under them when it does not fit */
@media (max-width:480px){.sf-stat{font-size:.84rem}}
/* .btn's display outranks the hidden attribute: Stop shows only while a search runs */
.sfpage .sf-stop[hidden],.sfpage .sf-cap[hidden]{display:none}

/* the seeds */
.sf-none{margin:0;color:var(--dim)}
.sf-hits{display:grid;gap:14px}
.sf-hit{padding:12px 14px 14px;border:1px solid rgba(255,255,255,.08);border-radius:10px;background:rgba(0,0,0,.28)}
.sf-hit-h{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 12px}
.sfpage code.sf-seed{padding:0;border:0;background:none;font-family:ui-monospace,'Cascadia Mono',Consolas,'Courier New',monospace;font-size:1.75rem;font-weight:700;letter-spacing:.09em;color:var(--gold-x);-webkit-user-select:all;user-select:all}
.sf-mk{color:var(--teal);font-size:.92rem}
.sf-who{margin-left:auto;color:var(--dim);font-size:.85rem}
.sf-ras{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px 18px}
@container sfbox (max-width:759px){.sf-ras{grid-template-columns:minmax(0,1fr)}}
.sf-ra{min-width:0}
.sf-ra-h{display:flex;align-items:baseline;gap:8px;margin:0 0 6px;padding-bottom:4px;border-bottom:1px solid rgba(255,255,255,.08);font-family:var(--font-t);font-size:1rem}
.sf-ra-h b{color:var(--gold)}
.sf-ra-h a{color:var(--text)}
.sf-dl{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px 10px;align-items:start;margin:0}
.sf-dl dt{display:flex;align-items:center;gap:5px;padding-top:1px;font-family:var(--font-t);font-size:.76rem;letter-spacing:.08em;text-transform:uppercase;color:#a89a78;white-space:nowrap}
.sf-dl dt[data-hint]{cursor:help}
.sf-dl dt[data-hint] span{text-decoration:underline dotted;text-underline-offset:3px}
.sf-dl dt.hit span{color:var(--gold-x)}
.sf-di{width:1.3rem;height:1.3rem;object-fit:contain}
.sf-dl dd{min-width:0;margin:0;font-size:.93rem;line-height:1.35}
.sf-ol{margin:0;padding:0 0 0 1.3em}
.sf-ol li::marker{color:var(--dim);font-size:.85em}
.sf-e{color:var(--text);text-decoration:none}
a.sf-e:hover{text-decoration:underline}
.sf-e.maybe{color:var(--dim);font-style:italic}
.sf-e.hit,.sf-rel.hit .sf-rn,.sf-cd.hit{color:var(--gold-x);font-weight:700}
.sf-boss{display:flex;align-items:center;gap:6px;min-width:0}
.sf-bi{width:1.9rem;height:1.9rem;object-fit:contain;flex:none}
.sf-offs{display:grid;gap:1px}
.sf-rel{display:flex;align-items:center;gap:6px;min-width:0}
.sf-rel .relic,.sf-rel .potion{width:2.2rem;height:2.2rem}
.sf-rel .iconlink{display:inline-flex;flex:none}
.sf-rn{min-width:0}
.sf-rew{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px}
.sf-gold{display:inline-flex;align-items:center;gap:4px;color:var(--gold)}
.sf-gi{width:1.25rem;height:1.25rem;object-fit:contain}
.sf-cds{display:flex;flex:1 1 100%;flex-wrap:wrap;gap:4px}
.sf-cd{--rc:var(--r-common);padding:1px 7px 2px;border:1px solid color-mix(in srgb,var(--rc) 55%,transparent);border-radius:6px;background:rgba(0,0,0,.3);color:var(--text);font-size:.88rem;text-decoration:none}
.sf-cd.r-uncommon{--rc:var(--r-uncommon)}.sf-cd.r-rare{--rc:var(--r-rare)}
a.sf-cd:hover{border-color:var(--rc)}
.sf-var{display:flex;flex:1 1 100%;flex-wrap:wrap;align-items:center;gap:4px 8px;margin:4px 0 0;font-size:.85rem;color:var(--dim)}
.sf-var>span:first-child{flex:1 1 100%}

/* look up a seed, how to play it */
.sf-lookrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin:0 0 12px}
.sfpage .sf-in{flex:1 1 14rem;max-width:24rem;min-width:0;margin:0;padding:8px 12px 7px;border:2px solid #0a1216;border-radius:9px;background:#0f1c22;box-shadow:inset 0 3px 0 rgba(0,0,0,.4);color:#fff;font-family:ui-monospace,'Cascadia Mono',Consolas,'Courier New',monospace;font-size:1.15rem;letter-spacing:.07em;text-transform:uppercase;-webkit-appearance:none;appearance:none}
.sfpage .sf-in::placeholder{color:var(--dim);letter-spacing:0;text-transform:none;font-family:var(--font-b);font-size:1rem;opacity:1}
.sfpage .sf-in:focus{border-color:var(--teal);outline:0;box-shadow:inset 0 3px 0 rgba(0,0,0,.4),0 0 0 3px rgba(63,216,207,.2)}
.sf-howl{margin:0 0 8px;padding-left:1.4em;line-height:1.6}
.sf-howl li::marker{color:var(--gold)}
.sf-note{margin:6px 0 0;color:var(--dim);font-size:.9rem;line-height:1.45}

@media (max-width:640px){
  .sfpage code.sf-seed{font-size:1.45rem}
  .sf-who{flex:1 1 100%;margin-left:0}
  .sf-fs{grid-template-columns:minmax(0,1fr)}
}
@media (hover:none) and (pointer:coarse){.sf-x{width:40px;height:40px}.sf-more{padding:8px 0}.sf-ddo:not(.wi){padding:11px 16px}}

/* the path (app/seedfinder.js sfPathHtml; Bean, 24 Sep 2026: "Could we make it so the user could technically pick the first 5 card rewards in a row? and
   relics?"): the seed's Act 1 map the way the game draws it (sfMapSvg) beside the rooms in order, each room's icon on a disc of the map's paper */
.sf-path{margin:0 0 14px;padding:0 0 14px;border-bottom:1px solid rgba(255,255,255,.08)}
.sfpage .sf-ph{display:flex;align-items:center;gap:6px;margin:0 0 10px;font-family:var(--font-t);font-size:1rem;font-weight:700;color:var(--gold)}
.sf-pw{display:grid;grid-template-columns:minmax(0,25rem) minmax(0,1fr);gap:14px 22px;align-items:start}
@container sfbox (max-width:599px){.sf-pw{grid-template-columns:minmax(0,1fr)}.sf-map{justify-self:center;width:100%;max-width:24rem}}
.sf-map{min-width:0}
.sf-mapsvg{display:block;width:100%;height:auto}   /* the game's scroll brings its own edges and glow (sfMapSvg) */
.sf-mn{font-family:var(--font-t);font-size:60px;font-weight:700}
.sf-pl{min-width:0}
.sf-steps{display:grid;gap:9px;margin:0;padding:0;list-style:none}
.sf-st{display:flex;align-items:flex-start;gap:10px;min-width:0}
.sf-sti{display:flex;flex:none;align-items:center;justify-content:center;width:2.3rem;height:2.3rem;border-radius:50%;background:radial-gradient(#c2a47f,#a78a67 70%);box-shadow:inset 0 0 0 1px rgba(40,35,29,.5),0 2px 3px rgba(0,0,0,.45)}
.sf-stim{width:2.3rem;height:2.3rem;object-fit:contain;scale:1.45}
.sf-stb{flex:1 1 auto;min-width:0;padding-top:2px}
.sf-stt{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 8px;font-size:.95rem;line-height:1.3}
.sf-stt>b{font-family:var(--font-t);font-size:.74rem;font-weight:400;letter-spacing:.09em;text-transform:uppercase;color:#a89a78}
.sf-stk{color:var(--text)}
.sf-str{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;margin-top:4px}
.sf-str .sf-cds{flex:1 1 auto}
.sf-rk{color:var(--dim);font-size:.82rem}
.sf-rk.hit{color:var(--gold)}
.sf-pn{margin:12px 0 0;padding-left:1.2em;color:var(--muted);font-size:.9rem;line-height:1.45}
.sf-pn li::marker{color:var(--gold)}
.sf-nopath{margin:0 0 12px;color:var(--dim)}
.sf-free{margin:12px 0 0;color:var(--muted);font-size:.9rem}
/* Avoid, at the top of a result (Bean, 24 Sep 2026 evening): one row a thing, its floor on the left like the path's rooms */
.sf-avoid{margin:0 0 14px;padding:10px 14px 12px;border:1px solid color-mix(in srgb,var(--red) 38%,transparent);border-radius:10px;background:color-mix(in srgb,var(--red-d) 16%,transparent)}
.sfpage .sf-avoid .sf-ph{margin:0 0 8px;color:var(--red)}
.sf-avh{display:inline-flex;align-items:center;gap:6px;cursor:help}
.sf-avl{display:grid;gap:7px;margin:0;padding:0;list-style:none}
.sf-avl li{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 12px;min-width:0;font-size:.95rem;line-height:1.4}
.sf-avl li>b{flex:none;min-width:4.4rem;font-family:var(--font-t);font-size:.74rem;font-weight:400;letter-spacing:.09em;text-transform:uppercase;color:#a89a78}
.sf-avl li>span{flex:1 1 14rem;min-width:0}
.sf-avl .sf-rel{display:inline-flex;vertical-align:middle;gap:4px;margin:-3px 0}
.sf-avl .sf-rel .relic{width:1.7rem;height:1.7rem}
/* the card rewards' order, before each row's dropdown */
.sf-ord{flex:none;min-width:2.3rem;font-family:var(--font-t);font-size:.82rem;letter-spacing:.06em;color:var(--dim)}
.sf-row.set .sf-ord{color:var(--gold)}
/* card rewards: the Any order toggle (the site's chip) at the tile's right, and its line under the rows */
.sf-anyo{margin-left:auto;min-height:1.8rem;padding:3px 10px 2px;font-size:.84rem;white-space:nowrap}
.sf-anyl{margin:2px 0 0;color:var(--dim);font-size:.86rem;line-height:1.35}
.sf-f-elite .sf-fi{scale:1.4}

/* ===== app/shelf.css ===== */
/* ---------- cards inside a housing: chapters, shelves, pools ----------
   Bean, 17 Sep 2026: "on hover have them go overtop of the outer housing ... that's what makes the cards feel like they are popping out of the screen", and
   the first card of a shelf must not touch the housing. A hovered card grows 15 % and tilts; two things cut it off:
   1. .chap{overflow:hidden} (only there so the accent stripe follows the rounded corners). Any chapter that holds a card stops clipping, and its stripe becomes
      a background layer, which follows the corners by itself.
   2. every .shelf: overflow-x:auto makes it a scroll container, and a scroll container clips at its padding box on all four sides. So the shelf carries the pop
      room as padding: taken back above with a negative margin (the header above does not move), real below (a scrollbar, when there is one, stays inside the
      housing), and reaching past the housing left and right.
   Touch devices have no hover pop, so they only get the side padding. Everywhere a card sits in a box, this file is the rule; do not re-clip. */
.shelf,.lz .hand{--sb-l:4px;--sb-r:4px}   /* the scrollbar track's insets (below): always the shelf's own side padding */
/* a shelf whose cards fit (core.js fitShelves marks it .fits) does not scroll, so it does not clip: the hovered card's bottom edge and shadow show whole (Bean, 18 Sep 2026:
   "the bottom of cards in this sort of housing across the site have the bottom outline cutoff"). The padding stays, so the housing's height does not change. */
.shelf.fits{overflow:visible;scroll-snap-type:none}
.chap>.shelf{padding:10px calc(var(--pad) + 10px) 16px;scroll-padding-inline:calc(var(--pad) + 10px);--sb-l:calc(var(--pad) + 10px);--sb-r:calc(var(--pad) + 10px)}
@media (hover:hover){
  .chap:has(.card){overflow:visible;background:linear-gradient(var(--acc,var(--gold)),var(--acc,var(--gold))) 0 0/5px 100% no-repeat,rgba(0,0,0,.26)}
  .chap:has(.card)::before{display:none}
  .shelf{padding:34px 18px 34px;margin:-24px -18px 0;scroll-padding-inline:18px;--sb-l:18px;--sb-r:18px}
  .shelf.mt{margin-top:-10px}
  .chap>.shelf{padding:34px calc(var(--pad) + 22px) 28px;margin:-24px -12px 8px;scroll-padding-inline:calc(var(--pad) + 22px);--sb-l:calc(var(--pad) + 22px);--sb-r:calc(var(--pad) + 22px)}   /* 8 px of the bottom room is margin, so the scrollbar (drawn at the box's bottom edge) sits off the housing's border. The bottom padding is the pop room of a SCROLLING shelf (a 9.5rem card grows ~16 px down, the tilt a little more); a shelf that fits does not clip at all (.fits above) */
}

/* ---------- the shelf's scrollbar ----------
   Bean, 17 Sep 2026, on the card pool preview: "scroll bar is entering the side of the box, needs to be fixed, scroll bars like this should also be less tall". The shelf reaches
   12-18 px past its housing on both sides (the pop room above), and a native scrollbar spans the scroll container's whole width, so its arrow button sat on the housing's border.
   Every horizontal card shelf (card and power and keyword pages' related cards, the character page's starting deck and card pool preview, the epoch unlock rows, the guides'
   card rows) and Lethal's phone-width hand now draw an 8 px bar with no buttons, a dark track and a slate thumb in the site's chrome, and the track is inset by the shelf's own
   side padding (--sb-l / --sb-r, set with the padding above and in app/character.css for the pool preview's fade), so it starts under the first card and ends under the last,
   never on the border. Chromium and WebKit draw the ::-webkit-scrollbar parts; Chromium 121+ ignores those parts on any element whose scrollbar-width or scrollbar-color is not
   auto (style.css sets scrollbar-color on html, and it inherits), so both go back to auto inside the @supports block. Firefox has no scrollbar parts: it keeps
   scrollbar-width:thin (about 8 px, no buttons) with scrollbar-color, without the inset. */
.shelf,.lz .hand{scrollbar-width:thin;scrollbar-color:var(--line-l) rgba(0,0,0,.35)}
.lz .hand{--sb-l:8px;--sb-r:8px}
@supports selector(::-webkit-scrollbar){
  .shelf,.lz .hand{scrollbar-width:auto;scrollbar-color:auto}
  .shelf::-webkit-scrollbar,.lz .hand::-webkit-scrollbar{height:8px;width:8px;background:transparent}
  .shelf::-webkit-scrollbar-button,.lz .hand::-webkit-scrollbar-button{display:none;width:0;height:0}
  .shelf::-webkit-scrollbar-track,.lz .hand::-webkit-scrollbar-track{background:rgba(0,0,0,.35);border-radius:4px;margin:0 var(--sb-r) 0 var(--sb-l);box-shadow:inset 0 1px 0 rgba(0,0,0,.25)}
  .shelf::-webkit-scrollbar-thumb,.lz .hand::-webkit-scrollbar-thumb{background:var(--line-l);border-radius:4px;border:0}
  .shelf::-webkit-scrollbar-thumb:hover,.lz .hand::-webkit-scrollbar-thumb:hover{background:#6a8e9b}
  .shelf::-webkit-scrollbar-corner,.lz .hand::-webkit-scrollbar-corner{background:transparent}
}

/* ===== app/shellfix.css ===== */
/* ===== wave 6 shell fixes (COMMUNITY stream, for the lead, 23 Sep 2026; app/shellfix.js) =====
   1. Skip to content: the first tab stop of every page (the first child of the top bar, shell.html), out of sight until it has keyboard focus, then the site's
      button plate (app/buttons.css .btn.sm) at the top left, over the bar. Its picture is in app/shellsprites.css, so it is whole the moment it shows.
   2. The footer's site map has five columns since the Community column (Builds, Tier lists) joined: five across on a wide screen, three below 1100 px, two on a
      phone (style.css keeps the 700 px rule; it is repeated here because this file comes later in the bundle). */
.topbar .skiplink.btn{position:absolute;left:max(var(--gutter,16px),env(safe-area-inset-left,0px));top:-80px;z-index:90;opacity:0;pointer-events:none;transition:none}
.topbar .skiplink.btn:focus,.topbar .skiplink.btn:focus-visible{top:10px;opacity:1;pointer-events:auto}
#main:focus{outline:none}
.foot-cols{grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:1100px){.foot-cols{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:700px){.foot-cols{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ===== app/shellsprites.css ===== */
/* stamp:4c1f76059ef2 GENERATED by tools/gen_shellsprites.py from SECTIONS (app/core.js) and the source sprites; do not edit, run the script (docs/wave4/shell.md).
   The frame of the site paints whole in its first frame: these pictures travel inside the render-blocking stylesheet instead of arriving after the first paint. */
:root{--spr-btn-l:url(data:image/webp;base64,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);--spr-btn-m:url(data:image/webp;base64,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);--spr-btn-r:url(data:image/webp;base64,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);--spr-btno-l:url(data:image/webp;base64,UklGRpgDAABXRUJQVlA4TIwDAAAvN8AbEE0oattIUqb9tfwJ7wkhov8TACgJSE3QfbvwabbUXmz74B3kAMmNJDmSZPorvSSzhnjtHvlFULK1bW0jPd8PwmCxqdijHjKOmRbRY1wKr6BXQDm9Ahxyt93sFFcYLOnX900AQfFD8DxD8cOD8s9J7/qQD/fhCM+Dx/OO3kTAy3meF4jwnMWbePBQAXAGgPjEmxmgVFgaADZrAgADGMLAGgC+pYAzCo961FAGgGSIpOfglDc0VaPNAOgA2LSBuADAOgCCNKXgAIg4+s3/gBwKy6FwCtBXEU6np4I9LdXxiy2f2ZeDl0OSAF6EBi9nADgAHFYzHwIaJAngVA34T7N5G02GlQGQFi+hSqme2NVaEg8FTENEGQAdAMd2sKpRJQDU8D90qDNLgAKwE6NMhD2d8040ekwXKgyABFjAfawedaZCNIAKgDXsdlCVaQAK23CwuYkmYVqR2dfaVLvtCNO6JZoU0FIAHHbPGCPKAKjhNsSDDVQ5rO44OEQJ9JQ50Fhz6ECNacckwgBQABRuYzqDshKAdXc2T1YYgU5HAA/kWF0zqHACp5VBlLliY9G4jSyvtwkoDQ0x3XQTVU6AFjZtOmOI6QeUeWuAMx7BtO3TzodwlJPZdcZjlAIcvIWyyCRDgAKAD9AWdTjaagkSriTQiyoqaUnuZkG65WYOoHf8AzU1u+Ves2tMzW75f2h2zd+v6TVxCTqd/opfWHcHY5SzwwtqV4e3fRg6uz5spfRMUsC2hYujLgm2YWFls9VhRA8nzmn9LTmjHu50AEoFJ47BsLvUYYxqATiFy7DENKsAlHMCxwSAqBhhBiaTySTnrPPS4kfzykphBU5gMmBhXpIAODi0eQAUgJQDFUVRb2DAi4u9ECBQAB7CeMA3JWgAa3aMsZuVBAASYNTjqFyugGtW+AGlZYcAAgWgWQCLlFMAbh+cllaFoZHhgLl5BIyBUIVCJTKRDPjf2cgqigxwFrvrHmYIAKcAnGzQpQgAAQaGI8xAOL11hUql4DYfe1/bWGVggItkgdd9niEAHAFwe4MPzM1MAZidGHz9Ig67/nDWHyhkLwIjAog1gQgC54WHmhIAvbuA571ZYwAcAu6aeMPjRvYBkAzBbmhoaCQHIMuAEUGQZBqlSqmyip00ABAddKJKCU4FEJSZDjq9UgkCFSxTBNDJASgB8ClQSjlCCAcCkBQAAoAAIPjtAA==);--spr-btno-m:url(data:image/webp;base64,UklGRuAAAABXRUJQVlA4TNMAAAAvq8AbEDU4jiTJUfDf6XydQgwauiPcBgCAJHQ32N06eYA7viB/eJDyAWx2d7ee0R0JHBUyKmZU7lElR6WOKjuqxQjmSXoW/5eAblsD9US3tnForQxbC+NYayvrJApaUWDuYix6kSx6VEV90TLLSNK27BT2hEIMa8Ur0Qpx8FZYKKGEnYhFU4hoCLgF3Rw0GNIaCgpanIC//3////7/OpIei7rZtl5jebR1S+KaxC2JZxL/h9VxVPoh+ST0m5Jrm0O0i8hcNe2Q1Ki8o7KMihwV/BIAAA==);--spr-btno-r:url(data:image/webp;base64,UklGRowDAABXRUJQVlA4TIADAAAvN8AbEE0oattI0kz6y/InfC+DiP6HmiRaj5X0rP6BCaCsY3VCciNJjiSZ/kovieyuyjh+rwg62ratdZz7Fx1TDANmO2R34RUwd+mzhNnM7CBYc7IBZq44Q2aWD0n6/wkQ+AicS3TKz3RydAgFJs4Q0SKXCWvmL2i1Oq1SsefqgQ5wrAKZQpLJlixdcAp2TJpi3WMHIqDGjnvWAdWSNw5Si+/9YMmUyTWPXQB7vpILjmUKnUbYuKx2DTAGpDbMYBMLgHLBB4PwYA/MetoSo2lAvuD14VkEvOyz0Nfi0olKpzFGuiQejF72GalwCwRAvHTXDTfDlFtgGpAX4YYjZjkuEUTEGgFXw12dxsCxXKvVIbQgMUuAISDVgK3BGDANyIuwHSL+ZxSLLAUyRwojYycyUZIEqQX32WJ0CWgAXQ22bA8OcQvTYEizP8MlIIKhXpOebQDT+vqua5yilCRZDTYDBw4ld0ALiDXYCjAPmMbIiHpDQARUTcpA5Z4LC8bOUEqSUIMHAvtIgA6QamzZClACpsBYqHlW28EOYKSQpBrreoFJtUtzeqJppUwQWsBmYBeLFi2iUFBsYgCLgJ68CduT5zxi0aJCIW/C1uA1a2ZNKBQKWRNeCWyAknKf2g5AVeeVsA4oy5SkA7Pm5TJBqPrtFoQf5R+g3g/z+2z0w/w/Kx9EjXHdr1zT5VmfASpcc2TfSBDFJjcZ3AI0NPvLn4P/3QJ9ukit93zuFhqNpsdf9kgzZv0nN+FUq0Gscc6sb8eOGmORduu4UKvVao1ObPHXYA7rSHbUakSRUjukWbnOslalpxIlWv08oQfoaFaT1nAMaKueTQGKHj27g8ycK4IJlWmZUOMPtxj1LYAE9DgkrVoVAcMq3QAqQOgxo5IDyEwJeqb0zGgFJIlKtX8Yta4BKOn1HWkFF4ABINT470EOyIrc1ZAmzahd6JnVygQkqrWWLQMqel2fLNnBMvqAUOP4AUAGyFq8SZrUunCqZ14mUwgSpT4lzVuzhgDouOxFpFcC4DVGp4AaPa57H/GVnJdaQAbIbpnkrmOzcqsys5KRniBRbQfc1YEem84vmMWPfnIXnAHShg8OtIBTO1Y8hbtgZISw4bMXErM+Dg0sKCW5niCx6daLlEBf0MfAWIOOZbcPTOiDTB+MjTXilsGBCBjSqT6QQBIRJVEU14zPkPgdBQ==);--spr-arrow:url(data:image/webp;base64,UklGRmYDAABXRUJQVlA4WAoAAAAQAAAAJwAAJwAAQUxQSHIBAAABgCNtfzplD4CX1G4dE1ra/w2Qjs5WWvzD3b3cGTsAQyoqd3fnAO7OSpLfJgz0EcHAbdtGdIDr7Z1H2P5ukn5HdgkAe445Bin1jiRTdkV9fa4hAHBL6q0kEwkA+p6m3QJgT9AXA6A7EAgsQo49yVTgyqMMLDPSgCsDZkDJ8YCyE9PdTfX2sC0GFRUVZUzvvXmOrwJquKQCTPc7mCXqytMmIPKgSDI2eUcMtr1tAkqyaVH5QmPj4H6AyEav3hNPsITGxoFFom4X5Yr4XVgSgF+R59B7hUnFEuCUqmMARRogZ/qFKC2WMvIcU1OuMZNkh2SAB6ilA5E3iSqUR70r1OhySDmQxvsdnrglRqdT3TWCK0/je+G35Em6a2oEpvX9BYgsDqBGsBJMvuf3p5MBQHBEfrGJAMaJvcj/wwin/kwTVx7DPz0NgJ/uB0y7RQLw/Bx7GsKRu4YRDghFzLivQWLa/+wKZ/Lv9F27WGpcdvFw/1VsVlA4IM4BAADQCgCdASooACgAPj0ci0SiIYjiwBAB4lpANAOVSgAb4Bk1eEHXA+YDLiLYFhAemnnZ+dv9v7gn8W/lH+n4Ef9KCHV15ueMbHqgD08RuaJv1FtMktoH/ed9bQ+KzeX+QAD+//Es7yjA8MDpWyX4T2u79vS/kUj/5a2T/mOmuMC5Lz+1n8kcKP4mbzJQkd3vtdVVcfJImwk5f/m4Me5P/kUDZQKu2oF5BQBfMNj//7DicQfjNXim4uQeJP0aElKLXTkiUbIr8CSDBLeIFV9pL2NHxoLfjNJqCDQqZFhT3N0WOVrf///RycuIdmKcrK46f0woiRmnhcxWUFxCDmW4CuVvxq1/62qW/f980VWD1ru9ZBkVZtWp3bNQHihvP+l5/H/9XfwQPNflRp6xvwZsuYjYP01/shjb8Ljxl0CA0acofr10SrlVVENWFdeZn/74Hbd10g/mSuPrvLYTugKIiCwahD5ZiqcVcI4pim3pdWNd7CEr5NWACq7f0PixRlmhzfaw+psevFl3SY54PYSuEwgEYV+hyuR0k2vXQDZwgbYQiv+Sb/sjd/4gPV/jKOvtcrSAmaYWEEgdWeumcYCHkIgTPqAv81u108vXh0eAAAA=);--spr-brand:url(data:image/webp;base64,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);--spr-brandw:url(data:image/webp;base64,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);--spr-gem:url(data:image/webp;base64,UklGRtwEAABXRUJQVlA4WAoAAAAQAAAAQwAAQwAAQUxQSL0CAAANkKxtkyFZf9QcuzW2tTq2uT7bc3m8grOybZsrW42M56nOiMjKWs0uIhi4baRoNp1lOr4vYGYfCJx3XRoAMDM4zzr2C5HCORQk5I3djP0JUlx8AdCcyLuohZSACWmkOvaJW5rij6s7JnbRJHediAoWMTdHctGmZA9woowAIYpEQgyJ0owc+fKIkoaGnMEl7EkQIy3QnGxDCtnTOv4MsiYSlPgldqWvWCQgG2I5heGZMwgBJEX6Wg8QwiMiBNA/+sUVX74MUEq4bNqXPgQwXn0TIGIXahLZtNR1GwOznmHyn4oYk8GZDGKJ1Fm5xeWN8y+/amKLgrp4DyqD7sLD2oJ9wIHzOoCP0dnYNTHJNRTbH3BleQMggVVLQRn5iGCQR3f7dde1FoCBn5KFQaZ2Q6HjUWPuckDl71s2VsyBeaUMNPmo0b4b0Jn68Bn6LQsOjtmfo/L3x+y0VuXMW0w/ZG2DQLjJVRW+YlPVWNf+Y38W1vWlyGvDWopaWZuNv/OM/fyfC7C1wwCpFzWAr0Vc6uhX7c/xnQt+z5qjnrjAWF/M179dOLpqSLGXZ3b24N60t7tMkbovBh4OLsDBdZLPV1aXca+jCJA8SoEmF+Wvq35t5VyJe31je6l6v9TtP5aVazDESL68nPc+rF1dI3l/fV0b7hfalcdyxgxrT22NL7dWL64/qLQbb5ngrEg118ekMevS+l7cLHcRrJcmhUYMKZWh4QruVyoMkzBzgCKdJ2O4VehlCgBhKFLpGAGeLuggxILZFnH1zbvil94RhkHWyBSA6tfCHFBMGmTLa0eIizOkXXw2yNjGkEPimpawCaIBL+FtlU2QHU2sbJVIB/FQbxaAVYCIiPEA0VkBERG3rnQgMSEQD9FMc9qTOyLivofi5LdE3OBYxiC2+0Zt5cdav7wSASU5FIT8+eXadMYWAABWUDgg+AEAAFAMAJ0BKkQARAA+PR6NRKIhoRH6rFwgA8SxgGs04FwH9N/EnlA9s2wyGfoA3QD9mesA9ADytPYa/aH9nfZ3iQNYGGCmPeLX6Z38Yo/8DJBhJlZ4UEdpJmj4IVRnSsS6edQ6j7DVCXD/A6sAAP7u6d/+UnrKv7f/gTvAneBO/AAALEZD9mEM3XGyud1kQTX31q22B+qSCSVk+RVOuBuulgMxN+d/7+fu5IoxTQ2FaWyTsPNOWd0McGY364gtxb9THFElCqIIOfqsDt6xGf61R2rfzyvSW0pu0AQ52taaBLsE7dfQZJynx6xQmcARJR8MfgUvP2YxLDL24Y+z2stf1zQ9mhMx9/v93n9/9dlQTiEqNf9xV4NOEd26xRRew51RYq9zr/YQ8MPZf+edpTfCzRTtiCXnk6/qr3vC/M7HN4Wbwj4KlTMs9Wq3NrHSXd1rqapiJkE7S4TaKx6RuNv951/0dv+8nWefO3CWjTg9kqO/mYii1xW8Q5Jem0h3o7FnewHyigonPaB/VPLYD+s9QBiKP6YRVsz8vjM1O3aZ8If9uz33bpwJeS+msukXpedrkHvlskEvucJV4IEqVGT8CPwPMaETIM3vUyXNDWQpcmtAAkaf8GdrjyiMO4f+F4PL86Nkc18wX/P//EKSI8uWvwNjdYAAAAAAAA==);--spr-steam:url(data:image/webp;base64,UklGRqQFAABXRUJQVlA4WAoAAAAQAAAAawAAawAAQUxQSCwEAAABd6Gwbds2WMhZ3W1ERDtiODcdWTnDTQOEi5Tb0HLwWgj2BwXb2tu20RdN9KcYUzxI1fzT/lSkvP3vTyAA/uQCIvo/AUp/efbs2evXDw+l6NyLRzAZXssZVW8sb17P5FKD3aNezqEESb0crzYSNz9WbWT34zw0jng7hgUHbeUAlQNHNgsO3SxV5fA10Y0T/D9NcIotSeMkmyWwxnnafl840Z+2V+NcbZ/G2doewem2HW4c9cP77ocV/LOscMhWTYPF56iLjCNG0bRPUdbEEYqWxgy2opI/Llr8MBMLjPyu9dbGKHORr2rShqQ2xtQD6V3bl1eN++aPT7Zs4jbT0oU2L/8wXDf0MIaNVdJrszAb1pOPxVhLVzecbri7tzuwntoQZaSSvanv3L9S3+IO69WxGGnpau8ZQDMNlrtvl47GuG4V0qv/GWgaN4BXPR97t+XpvPc78FmzBeBJx8a+b1xIX3tfgGdTegU8dtSG+K1X8z3rGBCaNyB6/4xFL/Kp60BdoACW0CP95xFbUQHr/D5R7mq+D70AtLIApfNywu88XwzETs8n2l3LZwOk4o70rr4DtsIB6/wxU6SSrmmzAHVFA9S9zbjk2X5etwTEgmfAP72YCSmyPWowgDL3Gag9pqWW7JNGC8DTmQr8UNdWkPw6pAC+TFSAX3s+Z9mqJrkvIw7g6jP/UHKFZu2OKD3nvqnvC16reCbN2x0QEY1uaJMlkt2+ZSkLZK0z6NqMFX+r++eHFK61NUbctFlZ+aEnme/XtNzcA8KrBo19JNW2U1m30thPMt/DlbiQQrrUtuqLEleySCqx5mkeC5b/s0IyX+DKas6OtzWS6oetr/++KqUoZ6mNXddJ1/9/AlGU0/z24QO7lx0k1ShKWsm507aVUvYJkipj0G112YtvJG0p9FvcAWWNkzZySOYdfIE18noWSbUB+FQlc0kkOUCZCFLr3rLoEWCofCN13BlRkigAH3CS1zs1aJ5DQNuwRnZ1nXsvGRywziPpo3ftwLeao94F+V/1FD3AbacCuKTGAa8bdQCipuCAf2t7CPDrugrUgzwM+AREWeWASc8OEBqdAl8EIOnXA5ShOtfWOOCS/soXGm9TXKXrt7cTjwAmifx14nHOJTm4DVQAl1TzfdFsm8IkBdBqpwRAk6SW7/lUmQtJCrpBv0mSk/6V5n2KKkne2QxJMvJfFqhN8UySzLfcJOkZ+YtW2hxV3VLdvahr5A+trXN4Z9jJ37T6/zlaHSuN/D9tmdoc8OrZpWPeOGLVelsCtIjgoFV72qIDu/Yt5+Lau56Ja/9yHlUZ7SyqctqXM/hpSuvHa6bE5Wiu3BZHakXpSzuM65C3Y3x5qoNa5GtVBy6eq1Ud/PLqW5qPjzrD3yJDu/2i06y+T1TTyZpHWxHuRWddyuObN/99uPWLKTlWUDggUgEAANAMAJ0BKmwAbAA+PRyKQyIhoRckJCADxLSDFACGwWAH8v/AD9ADSAsTv0Kd8AII2TQz77rdYSYDhJOfMh9HiuyQ9PCBg+mahYIKo8bVlJBquA+fH6fzrg3bPG+AUjCdtTF3QYdISSM93Df+Y97kwAD+/gclfCWH//Az//8Cc///AV3V+GKE+yAoVm/8r3WEHXEZFq4eJBckFt+3ftxj7HwVCMSST/guu33vg2pwCD3ORAWMc85IcfZpRoITKvQIHG67RZN1G5H/xet0eewX//97rqbf/UeVFb4ACmtltgTEf/2ggnP/jCag9f/gWLXS5bwL8y3fbfbiFhaz/TuTbHdnOLGW5PnqP6c0jqaYkXYugP8FL+sJV/6Ncz/icA4nZyRPaxd4+dEbC2hhx3T/2gny4N+mf6dD8CRK7/15aOn/19/nXOl9FiP5/ZJt6witQAAA);--spr-avatar:url(data:image/webp;base64,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);--spr-marker:url(data:image/webp;base64,UklGRsIFAABXRUJQVlA4WAoAAAAQAAAALQAAOwAAQUxQSNgCAAABBlr0/xmyo3qIrbkT27Zt2/YcnjN9BycVj5Jr9dw6ubGdtffJtr0bJ2t7+6pR1cvHX0XEBOD/ylrV7NF/Uj0CpCkRuXKcU9SASVSVcSdJ27Y/IguRvbq3k1utAbPcB1UK5MadY/ZvK0REhrIRco9J49B1ymYaPwg3VV+4e8v+CVMLtl0rlc8fzw5he9Ge7Qv6VDPTcownf1+cuuMHH7heCrll/6xJqchrpQCuPXdHQQg7chM0MKpdFVlDDpDunSoocOyRW6WV7wwV9XXsihyrBODH9+4voECC0eWj1mRJuRNQj73wvSzV/SKc6SWYkwq+pqcBP15+5UiCAiwGQD37VunvUkq9O8NFXQi6pILHTFT+7JV7GI0df+JqKWDmi3CGlwDwJl2Xdcx++8bNUqs/P6CwrpVaJ12nLfF8R2GS6LqS8rK4BxTWV69n0vWksF+YggZ68EXxmagnPanRxHAM8z0mau8uSYwdUez+TMy7wdRiExjDvI8J0EqxP7jLYQbbqCoAeDaYN4+YnqLSF0RcCuY5zTWkUAVcC+YtIRYnqfQFfs8G80ZacUTBuH0eBRxWsIT5Xud1h2RjiGVHFMc5fb43Coc1LGHh1/k8GWRjCMfGWf4LPH6XUcQa8cBcFvuMxwvukhmEaxfmv8CjJIpGfOCP4TNrV6Ml8wjnQfvd91g7nI6evKpEAUvvp2esINxm7Xc/beV4ekYaPxlFloUvd2SsIAJnlCgv/y6NNNwbKGorAruVwyb+0H5MSDcROuOw8rKB9qf2aCC3mxgo8rDBH/gxIQNE8HJGX9EDngnmDxXVjlFmlB+ULUVVWc7oh3qvBvMXEmGS0WK9o8F8YsP5BfSyhlK85U3NsUO3gsD5Sue8qS52gCtBL2uln+0uXkps2S03cK9Wes5b3Noe2JAhP7+alOuJTdtlSJmUJzvYBRvOZSRPTqhim3YbMtZ3qGIfNOzWhPzHBFZQOCDEAgAAcA8AnQEqLgA8AD45GIpDIiGhGVtuZCADhLYAZxXWPbuJr4f76Ye1+R6TW2Q8wHQR9AD9Tesv9ADyvf1y+Ez9sP1y9nloqTbZZWmMZvKI/d6bylmVL6rByXHRas646Fh7McUgv6VKxdPxJ9jm8rqJdfxW9TEs+epxU3Z+OCsvMOb5SKEAAP7/2IHmR0J7edoqms3FpFfBY8T5ZcC17uI/PMpsjoqduv3mkHiI1pIIFeWPSuhQLOLwvhwR/MDYz6qR4KG6f/57/2vMfveh/+MwtviK/1PkX+QR74H51h09cfSaMjJOghbY4kQsI2ZScPIsZ0FIsmtBtb4fcICYX9DbBCDY8h9q0zs6+qugaRUbClQvq6Px5UNSax7qQBJGjv0P9xN+eqAkU8/DPh3P000vBctoMKNU0UdVcRSCCscJo0POdGE7/53BzI/vzJp/k2/znf1PK4OhOP5moksS6dP1l5+ab0WjP4dcVb63CuZ4vacV2JWJY+Kn2/2tJY2aRX1JD3568S3tazplq5faPo8CHqL+23+Gs69Le23BX6zAn+SGOgu0zmXAbPgcekr8SqC7R78riV/kU1TmdJqZAZVelEK6cO0KRghIDcNNuChjzhAgVGfbRw7HTs66RosimDXfN6drG/Aox1yZnu/dlzz//VoUBcYedjKf8Gp9cE2uUr+fw4kqTMh4Gay3Opapelh9xtiGeTH6rZF7TAXOb9REmXLa2HI2bWjIZEJwp1uGm/kihSb2iQsF0Af4BJxWHXrhj/xVtgnZyxNutCEvMgJYoCTWse+tuQzBqFB+bm0raYP+qWgG02RPNlJQk2+Dvd92NK/3/aw7MXcu7n8Gp1ziMWu++/rRk4JSIioO6wFZZWdX0c9sM7xjZYnpsquIgq6ufZbsoHPpmEcsBlgYw7D6rAbRwOszfGnJySd+jI0EgoBYIAAA);--spr-btn-o:url(data:image/webp;base64,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);--spr-btno-o:url(data:image/webp;base64,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);--spr-daymark:url(data:image/webp;base64,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)}
.mapnode .ico{background-image:url(data:image/webp;base64,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);background-repeat:no-repeat;background-size:106.2500% auto;background-position:50% 0}
.mapnode .ico.i-cards{background-position:50% 0.1276%}
.mapnode .ico.i-relics{background-position:50% 4.4643%}
.mapnode .ico.i-potions{background-position:50% 8.8010%}
.mapnode .ico.i-powers{background-position:50% 13.1378%}
.mapnode .ico.i-enemies{background-position:50% 17.4745%}
.mapnode .ico.i-events{background-position:50% 21.8112%}
.mapnode .ico.i-characters{background-position:50% 26.1480%}
.mapnode .ico.i-seed-finder{background-position:50% 30.4847%}
.mapnode .ico.i-tier-lists{background-position:50% 34.8214%}
.mapnode .ico.i-rankings{background-position:50% 39.1582%}
.mapnode .ico.i-acts{background-position:50% 43.4949%}
.mapnode .ico.i-keywords{background-position:50% 47.8316%}
.mapnode .ico.i-enchantments{background-position:50% 52.1684%}
.mapnode .ico.i-afflictions{background-position:50% 56.5051%}
.mapnode .ico.i-ascension{background-position:50% 60.8418%}
.mapnode .ico.i-epochs{background-position:50% 65.1786%}
.mapnode .ico.i-achievements{background-position:50% 69.5153%}
.mapnode .ico.i-badges{background-position:50% 73.8520%}
.mapnode .ico.i-ancients{background-position:50% 78.1888%}
.mapnode .ico.i-modes{background-position:50% 82.5255%}
.mapnode .ico.i-multiplayer{background-position:50% 86.8622%}
.mapnode .ico.i-modifiers{background-position:50% 91.1990%}
.mapnode .ico.i-guides{background-position:50% 95.5357%}
.mapnode .ico.i-patch-notes{background-position:50% 99.8724%}
.mapnode .marker{background-image:var(--spr-marker)}

/* ===== app/sprose.css ===== */
/* STRUCTURED TEXT (core.js spHtml, SP_ICO; Bean, 23 Sep 2026, beside an act's "What the map holds" and "Notes": "These type of data dump sections still can't be on the
   site. Everything requires structure, some icons, and general breaking up, intermedent titles and structure please across the whole site").
   A titled block (.sp-sec) per topic: the title in the site's cream with the game's icon in a small socket (the chapter socket's recipe, plate.css, at 2rem) and a hairline
   running out to the right; rows (.sp-rows) as dark inset strips, each led by its icon, its item's picture or the chapter's diamond, a short label in bold; four or more
   short rows run in two columns where the chapter is wide enough (auto-fill at 22rem); a row of links is a line of chips, each with its item's picture. A chapter that
   holds structure uses its full width (the 78ch measure is for running text; the rows are short). */
.chap-b:has(>.sp-sec,>.sp-rows),.dp-how:has(>.sp-sec,>.sp-rows),.more-b:has(>.sp-sec,>.sp-rows){max-width:none}
.sp-sec{margin:1.1rem 0 0}
.sp-sec:first-child{margin-top:.2rem}
.sp-sec>p{margin:.2rem 0 .6rem;max-width:78ch}
.sp-sec>p:last-child{margin-bottom:0}
.sp-k{display:flex;align-items:center;gap:.6rem;margin:0 0 .55rem;font-family:var(--font-t);font-weight:700;font-size:1.1rem;line-height:1.2;letter-spacing:.01em;
  color:#fff6e2;text-shadow:0 2px 0 rgba(0,0,0,.5)}
.sp-k::after{content:"";flex:1 1 2rem;min-width:1rem;height:1px;margin-left:.2rem;background:linear-gradient(90deg,rgba(255,246,226,.2),rgba(255,246,226,0))}
.sp-kt{flex:0 1 auto}
.sp-ks{--cut:6px;position:relative;flex:none;display:grid;place-items:center;width:2.05rem;height:2.05rem;
  clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut));
  background:linear-gradient(180deg,#86a7b3,#34515c 22%,#101d23 62%,color-mix(in srgb,var(--sb,var(--gold)) 60%,#0c161b))}
.sp-ks::before{--cut:5px;content:"";position:absolute;inset:2px;
  clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut));
  background:radial-gradient(70% 34% at 50% 96%,color-mix(in srgb,var(--sb,var(--gold)) 38%,transparent),transparent 72%),radial-gradient(90% 80% at 50% 38%,#1a2f38,#0b151a)}
.sp-ks .sp-i{position:relative;display:block;width:1.5rem;height:1.5rem;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.65))}
.chap-b ul.sp-rows,.sp-rows{list-style:none;margin:.2rem 0 .6rem;padding:0;display:grid;gap:.4rem}
.sp-rows:last-child{margin-bottom:0}
.sp-rows.sp-2{grid-template-columns:repeat(auto-fill,minmax(min(100%,22rem),1fr))}
.chap-b .sp-rows>li,.sp-rows>li{position:relative;display:flex;align-items:flex-start;gap:.65rem;margin:0;padding:.5rem .8rem;border-radius:6px;
  background:rgba(0,0,0,.26);box-shadow:inset 0 1px 0 rgba(255,255,255,.045),inset 0 0 0 1px rgba(255,255,255,.035);font-size:1rem;line-height:1.45;color:var(--text);text-wrap:pretty}
.sp-rows>li.sp-dot{padding-left:1.7rem}
.sp-rows>li.sp-dot::before{content:"";position:absolute;left:.75rem;top:calc(.5rem + .52em);width:.38rem;height:.38rem;rotate:45deg;background:var(--acc,var(--gold));opacity:.85}
.sp-ico{flex:none;display:grid;place-items:center;width:1.75rem;height:1.45em}
.sp-ico img{display:block;max-width:1.75rem;max-height:1.75rem;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.65))}
.sp-t{flex:1 1 auto;min-width:0}
.sp-l{color:#fff6e2;font-weight:700}
.sp-p{width:1.75rem;height:1.75rem;object-fit:contain}
.sp-p-cards,.sp-p-epochs{object-fit:cover;border-radius:4px;box-shadow:0 0 0 1px rgba(0,0,0,.7),0 1px 2px rgba(0,0,0,.5)}
.sp-rows>li.sp-chips{grid-column:1/-1;align-items:center;padding:.1rem 0;background:none;box-shadow:none}
.sp-cw{display:flex;flex-wrap:wrap;gap:.4rem}
.sp-chip{display:inline-flex;align-items:center;gap:.45rem;padding:.22rem .75rem .22rem .3rem;border-radius:999px;background:rgba(0,0,0,.32);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.08);font-size:.95rem;line-height:1.25}
.sp-chip .sp-p{width:1.55rem;height:1.55rem}
.sp-chip .sp-p-cards,.sp-chip .sp-p-epochs{border-radius:50%}
@media (max-width:640px){
  .sp-k{font-size:1.02rem}
  .chap-b .sp-rows>li,.sp-rows>li{padding:.45rem .6rem;gap:.5rem}
  .sp-rows>li.sp-dot{padding-left:1.5rem}.sp-rows>li.sp-dot::before{left:.6rem}}

/* ===== app/tables.css ===== */
/* tables.js: sortable headers and chip spacing inside the upgrade and ascension tables */
.tbl th.sort{cursor:pointer;user-select:none;white-space:nowrap}
.tbl th.sort::after{content:"⇅";margin-left:5px;opacity:.35;font-size:.85em}
.tbl th.sort.asc::after{content:"▲";opacity:1}.tbl th.sort.desc::after{content:"▼";opacity:1}
.upgtbl td .chip,.asctbl td .chip{margin:1px 4px 1px 0}
.upgtbl td .chip{white-space:nowrap}
/* the Ascension tables (wave 4, AS3): three columns. The name cell holds the link, the enemies directory's kind tag (style.css .mq-kind) and, when there is one,
   a quiet line under them ("Also in Glory", "Summoned by ..."); the HP column never wraps inside a range */
.asctbl .asc-en{min-width:9.5rem}
.asctbl .asc-enn{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px}
.asctbl .asc-en small{display:block;margin-top:3px;font-size:.82rem}
.asctbl .asc-en small a{color:inherit;text-decoration:underline;text-decoration-color:rgba(255,255,255,.25);text-underline-offset:.15em}
.asctbl td:nth-child(2){white-space:nowrap}
@media (max-width:760px){.asctbl .asc-en{min-width:7rem}.asctbl td:nth-child(2){white-space:normal}}
.upgtbl td:last-child{min-width:16rem}
@media (hover:none) and (pointer:coarse){.tbl th.sort{padding-top:11px;padding-bottom:11px}} /* sortable headers are tap targets: 18.5px label + 22px padding */
/* QoL pass (wave 6, docs/wave6/qol-glossary.md). On a phone the ascension table fitted only with a sideways scroll (389 px in a 339 px box at 390): a long
   change chip ("Crush damage 17 -> 19 +2, Strength 3 -> 4 +1") now wraps its parts inside the chip, so every column is on screen. A touch screen gets a 40 px tap
   area on the enemy's name (21 px text); the "Also in ..." note link under it keeps its own box above that pad */
@media (max-width:560px){.asctbl td .chip{flex-wrap:wrap;max-width:100%}}
@media (hover:none) and (pointer:coarse){
  .asctbl .asc-enn a{position:relative;z-index:1}
  .asctbl .asc-enn a::after{content:"";position:absolute;inset:-10px -4px}
  .asctbl .asc-en small a{position:relative;z-index:2}}

/* ===== app/tags.css ===== */
/* ===== the tag chips under a dedicated page's title (wave 5, 22 Sep 2026; CORE stream; markup core.js tagChip; docs/wave5/core.md 1e) =====
   Bean: "The way we show filter tags on the directory pages when clicked with the character icon or relevant rarity diamond and more should be brought over to all the
   dedicated pages, the tags look better with the cool icon next to it." and "keep the text above the color coded bg color".
   One chip = span.tagc.tagc-<kind>[data-v] > i.tagc-i + span.tagc-t. The plate is the filter tag's (filters.css .ftag: an opaque dark plate washed with --fc, a solid --fc
   outline, a lit top edge, a 2 px ledge, 8 px corners) without the x cell; the word stands on the plate (the wash is the background, never a layer over the text) and
   carries a 1 px ink shadow so it stays readable on every colour. The icons are the SAME pictures the filter chips and their tags use: the top bar's head icon for a
   character (filters.css .ftag-head[data-c]), the rarity diamond in --fc, the card library's type icons, the potion signs of the Potions list's Use group, the Playtest
   sign (--pt-mark). An enemy's kind chip (Boss / Elite / Monster / Minion / Pet) gets NO colour and NO icon here: the ENEMIES stream styles .tagc-kind[data-v="..."]
   in its own file (enemy.css sorts before this one, so it uses .epage .tagc-kind or another two-class selector). */
.tagc{--fc:#b9cbd0;display:inline-flex;align-items:center;gap:6px;min-height:1.7rem;max-width:100%;padding:0 10px 0 8px;border:1px solid color-mix(in srgb,var(--fc) 70%,transparent);border-radius:8px;
  background:linear-gradient(color-mix(in srgb,var(--fc) 21%,#0f1c22),color-mix(in srgb,var(--fc) 11%,#0f1c22));box-shadow:0 2px 0 rgba(0,0,0,.5),inset 0 1px 0 color-mix(in srgb,var(--fc) 32%,transparent);
  color:color-mix(in srgb,var(--fc) 40%,#fff6e2);font-family:var(--font-t);font-size:.88rem;font-weight:400;line-height:1;text-decoration:none;vertical-align:middle;white-space:nowrap}
a.tagc:hover,a.tagc:focus-visible{border-color:var(--fc);color:#fff6e2;text-decoration:none}
.tagc-t{position:relative;z-index:1;line-height:1.3;padding-bottom:.07em;text-shadow:0 1px 0 rgba(0,0,0,.55)}
.tagc-i{display:block;flex:none;width:1rem;height:1rem;background:center/contain no-repeat;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
/* character: the top bar's head icon (filters.css .ftag-head, the same sprite the filter tag copies), the character's colour */
.tagc .ftag-head{width:1.25rem;height:1.25rem;margin:0 0 0 -2px}
.tagc-char[data-v="ironclad"]{--fc:var(--ironclad)}.tagc-char[data-v="silent"]{--fc:var(--silent)}.tagc-char[data-v="defect"]{--fc:var(--defect)}.tagc-char[data-v="necrobinder"]{--fc:var(--necrobinder)}.tagc-char[data-v="regent"]{--fc:var(--regent)}
.tagc-char[data-v="colorless"]{--fc:var(--colorless)}.tagc-char[data-v="colorless"] .tagc-i{background-image:url(/img/ui/card/energy_colorless.webp)}
.tagc-char[data-v="curse"]{--fc:var(--curse)}.tagc-char[data-v="curse"] .tagc-i{background-image:url(/img/packed/card_library/pool_filter_other.webp)}
.tagc-char[data-v="status"]{--fc:var(--status)}.tagc-char[data-v="status"] .tagc-i{background-image:url(/img/packed/card_library/type_sort_other.webp)}
.tagc-char[data-v="quest"]{--fc:var(--quest)}.tagc-char[data-v="quest"] .tagc-i{background-image:url(/img/ui/card/energy_quest.webp)}
.tagc-char[data-v="all"],.tagc-char[data-v="all-characters"],.tagc-char[data-v="shared"]{--fc:#b9cbd0}.tagc-char[data-v="all"] .tagc-i,.tagc-char[data-v="all-characters"] .tagc-i,.tagc-char[data-v="shared"] .tagc-i{background-image:url(/img/packed/character_select/char_select_player_icon.webp)}
/* rarity: the filter chip's diamond (filters.css .fgrp-rar .fchip-i), in the rarity colour */
.tagc-rar .tagc-i{width:.56rem;height:.56rem;margin:0 3px 1px 2px;rotate:45deg;border-radius:1px;background:linear-gradient(135deg,color-mix(in srgb,var(--fc) 55%,#fff),var(--fc) 55%,color-mix(in srgb,var(--fc) 70%,#000));box-shadow:0 0 0 1px rgba(0,0,0,.5);filter:none}
.tagc-rar[data-v="basic"],.tagc-rar[data-v="starter"]{--fc:var(--r-basic)}.tagc-rar[data-v="common"]{--fc:var(--r-common)}.tagc-rar[data-v="uncommon"]{--fc:var(--r-uncommon)}.tagc-rar[data-v="rare"]{--fc:var(--r-rare)}.tagc-rar[data-v="ancient"]{--fc:var(--r-ancient)}
.tagc-rar[data-v="shop"]{--fc:var(--gold-d)}.tagc-rar[data-v="event"]{--fc:var(--green-d)}.tagc-rar[data-v="special"],.tagc-rar[data-v="token"],.tagc-rar[data-v="quest"],.tagc-rar[data-v="curse"],.tagc-rar[data-v="status"]{--fc:#ee82ee}
/* type: the card library's sort icons (filters.css .fgrp-type), the type colours the card frames use */
.tagc-type .tagc-i{width:.92rem;height:1.09rem}
.tagc-type[data-v="attack"]{--fc:var(--attack)}.tagc-type[data-v="attack"] .tagc-i{background-image:url(/img/packed/card_library/type_sort_attack.webp)}
.tagc-type[data-v="skill"]{--fc:var(--skill)}.tagc-type[data-v="skill"] .tagc-i{background-image:url(/img/packed/card_library/type_sort_skill.webp)}
.tagc-type[data-v="power"]{--fc:var(--power)}.tagc-type[data-v="power"] .tagc-i{background-image:url(/img/packed/card_library/type_sort_power.webp)}
.tagc-type[data-v="quest"]{--fc:var(--quest)}.tagc-type[data-v="quest"] .tagc-i,.tagc-type[data-v="curse"] .tagc-i,.tagc-type[data-v="status"] .tagc-i,.tagc-type[data-v="event"] .tagc-i,.tagc-type[data-v="token"] .tagc-i{background-image:url(/img/packed/card_library/type_sort_other.webp)}
.tagc-type[data-v="curse"]{--fc:var(--curse)}.tagc-type[data-v="status"]{--fc:var(--status)}
/* a potion's use: the Potions list's own signs (potions.css .fgrp-use): the full bottle for Drunk, the targeting arrow for Thrown; Automatic is the timer */
.tagc-use .tagc-i{width:1.1rem;height:1.1rem}
.tagc-use[data-v="drunk"] .tagc-i,.tagc-use[data-v="drink"] .tagc-i{background-image:url(/img/ui/game_over_screen/discovery_potion.webp)}
.tagc-use[data-v="thrown"] .tagc-i,.tagc-use[data-v="throw"] .tagc-i{background-image:url(/img/ui/combat/targeting_arrow_head.webp);rotate:-90deg}
.tagc-use[data-v="automatic"] .tagc-i{background-image:url(/img/stats/stats_stopwatch.webp)}
/* a power's kind: the tile housing's buff green / debuff red (tilehousing.css), the power's own icon is the showcase, so the chip carries the colour only */
.tagc-pkind[data-v="buff"]{--fc:#8fd96b}.tagc-pkind[data-v="debuff"]{--fc:var(--red)}
.tagc-pkind .tagc-i{width:.6rem;height:.6rem;margin:0 2px;border-radius:50%;background:radial-gradient(circle at 35% 35%,#fff 0,var(--fc) 45%,color-mix(in srgb,var(--fc) 60%,#000) 100%);box-shadow:0 0 0 1px rgba(0,0,0,.5);filter:none}
/* the game's version: the Playtest sign (filters.css --pt-mark) and the Live seal (--live-mark), the Version chips' colours */
.tagc-version[data-v="playtest"]{--fc:#f5c518}.tagc-version[data-v="playtest"] .tagc-i{width:1.2em;height:1.08em;background-image:var(--pt-mark)}
.tagc-version[data-v="live"]{--fc:#5fc152}.tagc-version[data-v="live"] .tagc-i{width:1.2em;height:1.08em;background-image:var(--live-mark)}
/* an enemy's kind: an icon handed in by the page (kindIco) sits in the chip like any other. The colours below are the tile tags' (enemy.css .ekind-boss / .ekind-elite) as
   a DEFAULT only: the ENEMIES stream's own rules win with a two-class selector (.epage .tagc-kind[data-v="elite"]), since enemy.css sorts before this file */
.tagc-kind img.kind-i{width:1.2em;height:1.2em;margin:-.15em 0 -.1em -.15em;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.tagc-kind[data-v="boss"]{--fc:#c4382e}.tagc-kind[data-v="elite"]{--fc:#b04ac0}
.tagc-kind .tagc-i{display:none}   /* the empty icon cell of a Monster / Minion / Pet chip: the ENEMIES stream turns it on with its sprite (.epage .tagc-kind .tagc-i{display:block;background-image:...}) */
/* a plain word */
.tagc-plain .tagc-i{display:none}
/* the row under a title: the chips wrap with the row's gap; a page's own .row rules stay */
.row .tagc{margin:0}
@media (hover:none){.tagc{min-height:1.9rem}}

/* ===== app/tierlist.css ===== */
/* ===== TIER LISTS (wave 6, 23 Sep 2026; app/tierlist.js, docs/wave6/tierlist.md) =====
   The board sits on the game's section plate (plate.css: the settings tab nine-slice, the dark wash); a tier's letter is a colour plate in the site's button
   language (lit top edge, hard ledge); items are the game's own pictures at the game's proportions: card renders (cardHtml), relic icons, the character select
   portraits under the game's button mask, event paintings, the enemy's room with the lineup standing on it. Every size is a variable on the item itself
   (--cw for a card, --tw for a tile), so the dragged copy (appended to <body>) keeps it. */
.tlr{position:relative;--lw:6.4rem}
.tlr .tl-bar[hidden],.tlr [hidden]{display:none!important}

/* ---- the title strip (the directory's text strip, filters.css .fstrip) ---- */
.tl-bar{position:relative;z-index:25;display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin:4px 0 10px;padding:8px 10px;border:2px solid var(--line);border-radius:12px;background:linear-gradient(#17282f,#111e24);box-shadow:0 5px 0 rgba(0,0,0,.42),inset 0 1px 0 rgba(255,255,255,.06)}
.tl-title{flex:1 1 10rem;min-width:0;margin:0;padding:9px 12px 8px 42px;border-radius:9px;border:2px solid #0a1216;background:#0f1c22 url(/img/ui/cursor_pencil.webp) 9px center/24px no-repeat;color:#fff6e2;font:700 1.08rem/1.2 var(--font-t);box-shadow:inset 0 3px 0 rgba(0,0,0,.4)}
.tl-title::placeholder{color:var(--dim);opacity:1}
.tl-title:focus{border-color:var(--teal);outline:0;box-shadow:inset 0 3px 0 rgba(0,0,0,.4),0 0 0 3px rgba(63,216,207,.2)}
.tl-acts{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.tl-sq{display:flex;flex:1 1 9rem;min-width:0}
.tl-l2{display:none}
.tl-sq .fsearch{flex:1 1 auto}
/* Filters: the directory's chip groups (filters.css) in a panel that opens under the bar, over the tiers, at every width */
.tl-bar .ffine.toolbar{display:block;flex:none;margin:0}
.tl-bar .fmore{display:inline-flex;align-items:center;gap:8px;min-height:2.6rem;margin:0;padding:6px 12px 5px 14px;border:2px solid #0a1216;border-radius:9px;background:#0f1c22;box-shadow:inset 0 2px 0 rgba(0,0,0,.35);color:#fff6e2;font-family:var(--font-t);font-size:.95rem;line-height:1;cursor:pointer}
.tl-bar .fmore:hover{border-color:var(--line-l,#3c5864)}
.tl-bar .fmore-i{display:block;width:8px;height:8px;margin:-4px 2px 0 4px;order:3;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);rotate:45deg;transition:rotate .2s}
.tl-bar .ffine.open .fmore-i{rotate:225deg;margin-top:4px}
.tl-bar .fbadge{display:inline-grid;place-items:center;min-width:1.25rem;height:1.25rem;padding:0 4px;border-radius:999px;background:var(--gold);color:#241600;font-size:.78rem;font-weight:700}
.tl-bar .fbadge[hidden]{display:none}
.tl-bar .ffine-b{display:none;position:absolute;left:8px;right:8px;top:calc(100% + 6px);z-index:40;flex-direction:column;align-items:flex-start;gap:12px;margin:0;padding:14px 16px;border:2px solid var(--line);border-radius:12px;background:linear-gradient(#1a2c34,#101b21);box-shadow:0 14px 28px rgba(0,0,0,.6),0 4px 0 rgba(0,0,0,.45)}
.tl-bar .ffine.open .ffine-b{display:flex}
.tl-bar .fgroups{display:flex;flex-direction:column;align-items:flex-start;gap:12px;width:100%}
.tl-bar .fgroups>.fgrp{margin-left:0}
.tl-fx{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;width:100%;padding-top:10px;border-top:1px solid rgba(255,255,255,.08)}
.tl-fx .fsort{margin-left:0}
.tl-fx [data-fclear]{margin-left:auto}
/* the character chips carry the game's character icons (the directory's pool picker draws them with its own portraits) */
.fgrp-tlpc .fchip{padding-left:7px}
.fgrp-tlpc .fchip-i{width:1.35rem;height:1.35rem;margin:-3px 0 -3px -1px;opacity:.9;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.fgrp-tlpc .fchip[data-v="ironclad"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_ironclad.webp)}
.fgrp-tlpc .fchip[data-v="silent"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_silent.webp)}
.fgrp-tlpc .fchip[data-v="defect"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_defect.webp)}
.fgrp-tlpc .fchip[data-v="necrobinder"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_necrobinder.webp)}
.fgrp-tlpc .fchip[data-v="regent"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_regent.webp)}
.fgrp-tlpc .fchip[data-v="colorless"] .fchip-i{background-image:url(/img/ui/card/energy_colorless.webp)}
.fgrp-tlpc .fchip[data-v="shared"] .fchip-i{background-image:url(/img/packed/character_select/char_select_player_icon.webp)}
/* the "more" menu: Copy image, Add a tier, Reset */
.tl-more{position:relative}
.tl-mb{min-width:2.6rem;padding-left:10px;padding-right:10px}
.tl-dots{display:block;width:4px;height:4px;margin:0 auto;border-radius:50%;background:currentColor;box-shadow:-7px 0 0 currentColor,7px 0 0 currentColor}
.tl-mm{position:absolute;right:0;top:calc(100% + 6px);z-index:40;display:flex;flex-direction:column;min-width:11rem;padding:6px;border:2px solid var(--line);border-radius:10px;background:linear-gradient(#1a2c34,#101b21);box-shadow:0 14px 28px rgba(0,0,0,.6),0 4px 0 rgba(0,0,0,.45)}
.tl-mm button{display:block;width:100%;margin:0;padding:9px 12px;border:0;border-radius:7px;background:none;color:#fff6e2;font:700 .95rem/1.2 var(--font-t);text-align:left;cursor:pointer}
.tl-mm button:hover,.tl-mm button:focus-visible{background:rgba(255,255,255,.08);outline:0}
.tl-mm button.red{color:#ff8a7a}
.tl-vt{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;flex:1 1 15rem;min-width:0;padding:2px 4px}
.tl-vh{margin:0;font:700 1.45rem/1.15 var(--font-t);color:#fff6e2;text-shadow:0 2px 0 rgba(0,0,0,.5);overflow-wrap:anywhere}
.tl-by{display:inline-flex;align-items:center;gap:8px;color:var(--dim);font-size:.95rem}
.tl-by img{width:28px;height:28px;border-radius:50%;object-fit:cover}
.tl-note{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:-2px 0 10px;padding:10px 12px;border-radius:10px;border:2px solid var(--line);background:rgba(8,16,20,.86)}
.tl-note p{margin:0;flex:1 1 16rem}
.tl-lnk{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;flex:1 1 20rem;min-width:0}
.tl-lnk span{color:#8fd96b;font-weight:700}
.tl-lnk input{flex:1 1 14rem;min-width:0;padding:7px 10px;border-radius:8px;border:2px solid #0a1216;background:#0f1c22;color:#fff6e2;font:400 .9rem/1.2 var(--font-b)}

/* ---- the board: the section plate ---- */
.tl-board{--sbw:18px;position:relative;isolation:isolate;margin:0 -4px;border:var(--sbw) solid transparent;border-image:url(/img/ui/settings_tab_selected.webp) 40 fill / var(--sbw) / 0 round;filter:drop-shadow(0 5px 0 rgba(0,0,0,.5))}
.tl-board::before{content:"";position:absolute;inset:calc(var(--sbw)*-.55);z-index:-1;pointer-events:none;border-radius:6px;background:linear-gradient(rgba(255,255,255,.04),rgba(255,255,255,0) 38%,rgba(0,0,0,0) 62%,rgba(0,0,0,.22)),linear-gradient(rgba(0,0,0,.54),rgba(0,0,0,.54))}
.tl-rows{display:flex;flex-direction:column;gap:5px}
/* every tier is --rh high: the window and the number of tiers set it (tierlist.js tlTrayFit), never the items (they shrink to fit: tlFitRows) */
.tl-row{position:relative;display:grid;grid-template-columns:var(--lw) minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);height:var(--rh,3.75rem);border-radius:8px;background:rgba(3,8,11,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.05)}
.tl-lab{position:relative;display:grid;place-items:center;margin:0;padding:6px 4px;border:0;border-radius:8px 0 0 8px;background:linear-gradient(180deg,rgba(255,255,255,.2),rgba(255,255,255,0) 42%,rgba(0,0,0,0) 70%,rgba(0,0,0,.2)),var(--tc);box-shadow:inset 0 2px 0 rgba(255,255,255,.38),inset -3px 0 0 rgba(0,0,0,.22),inset 0 -3px 0 rgba(0,0,0,.28);color:#fff6e2;cursor:pointer;font:700 min(2.3rem,calc(var(--rh,60px) * .6))/1 var(--font-t);-webkit-text-stroke:.14em rgba(0,0,0,.55);paint-order:stroke fill;text-shadow:0 2px 0 rgba(0,0,0,.3);overflow-wrap:anywhere;text-align:center}
.tl-row.long .tl-lab{font-size:1.05rem;-webkit-text-stroke:.16em rgba(0,0,0,.55);line-height:1.1}
.tl-lt{display:block;max-width:100%}
.tl-lab::after{content:"";position:absolute;right:3px;bottom:3px;width:20px;height:20px;background:url(/img/ui/cursor_pencil.webp) center/contain no-repeat;opacity:0;transition:opacity .15s;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6))}
.tl-lab:hover::after,.tl-lab:focus-visible::after{opacity:.95}
.tl-lab:focus-visible{outline:3px solid #fff6e2;outline-offset:-3px}
.tl-drop{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start;gap:6px;min-width:0;padding:8px}
/* a tier's items stand in the middle of its height, at the size that fits them all (--iw, --ig from tlFitRows; tl-nonm: too small for a name) */
.tl-rows .tl-drop{align-content:center;align-items:center;gap:var(--ig,6px)}
.tl-rows .tl-drop.tl-fit>.tl-it.tl-card{--cw:var(--iw)}   /* stronger than the presentation's pool sizes (.tlr.present .tl-it.tl-card) */
.tl-rows .tl-drop.tl-fit>.tl-it:is(.tl-rel,.tl-pot,.tl-chr,.tl-evt,.tl-mon){--tw:var(--iw)}
.tl-drop.tl-fit>.tl-it:is(.tl-rel,.tl-pot){border-radius:min(12px,20%)}
.tl-drop.tl-nonm .tl-nm{display:none}
/* too many for even the smallest size (tlFitRows): a stack, each item --ss after the one before it and --sn to a line, overlapping, the tier's height kept */
.tl-rows .tl-drop.tl-stack{display:grid;grid-template-columns:repeat(var(--sn,1),var(--ss,8px));grid-auto-rows:max-content;gap:var(--ig,1px) 0;justify-content:start;align-content:center;align-items:start}
.tl-drop.tl-stack>.tl-it{box-shadow:-1px 0 2px rgba(0,0,0,.55)}
.tl-drop.tl-nonm>.tl-it.tl-chr{height:calc(var(--tw) * 195 / 132)}
.tl-drop.tl-nonm>.tl-it.tl-chr .tl-cp{height:100%}
.tl-rc{display:flex;flex-direction:column;justify-content:center;gap:2px;padding:0 6px;opacity:0;transition:opacity .15s}
.tl-row:hover .tl-rc,.tl-rc:focus-within{opacity:1}
.tl-rc button{width:24px;height:min(21px,calc(var(--rh,60px) / 2 - 3px));margin:0;padding:0;border:0;border-radius:6px;background:rgba(255,255,255,.07) url(/img/ui/settings_tiny_left_arrow.webp) center/18px no-repeat;cursor:pointer}
.tl-rc .tl-up{rotate:90deg}.tl-rc .tl-dn{rotate:-90deg}
.tl-rc button:hover{background-color:rgba(255,255,255,.16)}
.tl-row:first-child .tl-up,.tl-row:last-child .tl-dn{visibility:hidden}
@media (hover:none){.tl-rc{display:none}}
.tl-board.tl-none .tl-row:first-child .tl-drop::before{content:"Drag items here, or tap one and then a tier";}
@media (hover:hover){.tl-board.tl-none .tl-row:first-child .tl-drop::before{content:"Drag items here, or point at one and press 1 to 6"}}
.tl-board.tl-none .tl-row:first-child .tl-drop::before{align-self:center;margin:auto;color:var(--dim);font:400 .95rem/1.3 var(--font-b);text-align:center}
.tl-wait{margin:18px 10px;color:var(--dim)}

/* ---- the pool (the directory's filter kit above it) ---- */
.tl-grid{display:flex;flex-wrap:wrap;align-content:flex-start;gap:8px}
.tl-stage{position:relative}
.tl-tray{position:sticky;bottom:0;z-index:12;display:flex;flex-direction:column;height:var(--trayh,42vh);margin:8px -4px 0;border:2px solid var(--line);border-bottom:0;border-radius:12px 12px 0 0;background:linear-gradient(#162830,#0c171c 5rem);box-shadow:0 -10px 22px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.07)}
.tl-th{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px;flex:none;min-height:2.5rem;padding:3px 6px 3px 14px;border-bottom:1px solid rgba(255,255,255,.07);cursor:pointer}
.tl-cnt{color:var(--muted);font-size:.92rem}
.tl-cnt b{color:#fff6e2;font-family:var(--font-t)}
.tl-grip{position:absolute;left:50%;top:50%;translate:-50% -50%;width:46px;height:5px;border-radius:3px;background:rgba(255,255,255,.24);pointer-events:none}
.tl-th:hover .tl-grip{background:rgba(255,255,255,.4)}
.tl-tb{display:inline-flex;align-items:center;gap:8px;min-height:2.1rem;margin:0;padding:3px 10px;border:0;border-radius:8px;background:none;color:var(--muted);font:700 .9rem/1 var(--font-t);cursor:pointer}
.tl-tb:hover,.tl-tb:focus-visible{background:rgba(255,255,255,.08);color:#fff6e2;outline:0}
.tl-tc{display:block;width:8px;height:8px;margin-top:4px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;rotate:45deg;translate:0 -3px}
.tl-tray.min .tl-tc{rotate:225deg;translate:0 1px}
.tl-tray .tl-grid{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 10px 14px;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.22) transparent}
.tl-tray.min{height:auto}
.tl-tray.min .tl-grid{display:none}
.tlr.picking .tl-tray{box-shadow:0 -10px 22px rgba(0,0,0,.5),inset 0 0 0 2px rgba(239,200,81,.45)}
.tl-it[hidden]{display:none!important}

/* ---- the items ---- */
.tl-it{position:relative;flex:none;box-sizing:border-box;border-radius:8px;cursor:grab;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;touch-action:manipulation;outline-offset:3px}
.tl-it img{-webkit-user-drag:none;user-select:none}
.tl-it:focus-visible{outline:3px solid var(--gold)}
.tl-it.tl-card{--cw:4.6rem;width:var(--cw);height:calc(var(--cw) * 1.4067)}
.tl-it.tl-card .card{cursor:inherit}
.tl-it.tl-rel{--tw:3.8rem;width:var(--tw);height:var(--tw);display:grid;place-items:center;border-radius:12px;background:radial-gradient(circle at 50% 42%,#26404a,#0e191e 72%);box-shadow:inset 0 0 0 2px rgba(255,255,255,.08),0 3px 0 rgba(0,0,0,.4)}
.tl-it.tl-rel .relic{width:100%;height:100%;cursor:inherit}
.tl-it.tl-pot{--tw:3.8rem;width:var(--tw);height:var(--tw);display:grid;place-items:center;border-radius:12px;background:radial-gradient(circle at 50% 42%,#2c3f4a,#0e191e 72%);box-shadow:inset 0 0 0 2px rgba(255,255,255,.08),0 3px 0 rgba(0,0,0,.4)}
.tl-it.tl-pot .potion{width:100%;height:100%;cursor:inherit}
.tl-it.tl-chr{--tw:4.6rem;width:var(--tw);height:calc(var(--tw) * 195 / 132 + 1.35rem)}
.tl-cp{position:absolute;left:0;top:0;width:100%;height:calc(100% - 1.35rem);background:#22343c center/100% 100% no-repeat;-webkit-mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat}
.tl-chr .tl-nm{position:absolute;left:-4px;right:-4px;bottom:0;color:#fff6e2;font:700 .78rem/1.3rem var(--font-t);text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.8);white-space:nowrap}
.tl-it.tl-evt{--tw:8.4rem;width:var(--tw);height:calc(var(--tw) * 658 / 1400)}
.tl-it.tl-mon{--tw:5.4rem;width:var(--tw);height:var(--tw)}
.tl-pic{position:absolute;inset:0;overflow:hidden;border-radius:8px;background:#0e191e;box-shadow:inset 0 0 0 2px rgba(255,255,255,.08)}
.tl-ep,.tl-room{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}
.tl-room{opacity:.9}
.tl-efig{position:absolute;left:25%;bottom:12%;width:50%;height:70%;object-fit:contain}
.tl-cr{position:absolute;bottom:17%;overflow:visible}
.tl-cr img{position:absolute;max-width:none}
.tl-evt .tl-nm,.tl-mon .tl-nm{position:absolute;left:0;right:0;bottom:0;padding:2px 4px 3px;border-radius:0 0 8px 8px;background:rgba(5,11,14,.8);color:#fff6e2;font:700 .7rem/1.12 var(--font-t);text-align:center;overflow-wrap:anywhere}
.tl-it.tl-picked{outline:3px solid #efc851;animation:tlPick .9s ease-in-out infinite alternate}
@keyframes tlPick{to{outline-color:rgba(239,200,81,.3)}}
.tl-it.tl-grab{outline:3px dashed #efc851}
.tl-it.tl-ph{opacity:.28;filter:saturate(.25)}
.tl-ghost{position:fixed!important;left:0;top:0;z-index:95;margin:0;pointer-events:none;transform-origin:35% 25%;filter:drop-shadow(0 16px 18px rgba(0,0,0,.65));will-change:transform}
.tl-ghost .card{scale:1!important}
html.tl-drag,html.tl-drag *{cursor:grabbing!important}
html.tl-drag .tlr .tl-it{pointer-events:none}
html.tl-drag #tip{visibility:hidden!important}
html.tl-snap .tl-it *{transition:none!important;transform:none!important;scale:1!important;animation:none!important}
@media (prefers-reduced-motion:reduce){.tl-it.tl-picked{animation:none}}

/* ---- a tier's editor: the tip plate's recipe (a rim and a stripe in the tier's colour) ---- */
.tl-ed{position:absolute;left:0;top:calc(100% + 6px);z-index:30;display:grid;gap:10px;width:min(25rem,calc(100vw - 40px));padding:12px 12px 12px 16px;border-radius:10px;border:2px solid var(--tc);border-left-width:6px;background:linear-gradient(#1a2c34,#101b21);box-shadow:0 14px 28px rgba(0,0,0,.6),0 4px 0 rgba(0,0,0,.45);cursor:default}
.tl-edl{display:flex;align-items:center;gap:10px;color:var(--dim);font-weight:700}
.tl-edl input{flex:1;min-width:0;padding:7px 10px;border-radius:8px;border:2px solid #0a1216;background:#0f1c22;color:#fff6e2;font:700 1.05rem/1.2 var(--font-t)}
.tl-edl input:focus{border-color:var(--teal);outline:0}
.tl-sw{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.tl-swb,.tl-swc{position:relative;width:30px;height:30px;margin:0;padding:0;border:2px solid rgba(0,0,0,.55);border-radius:7px;background:var(--c);box-shadow:inset 0 2px 0 rgba(255,255,255,.3);cursor:pointer}
.tl-swb.on{outline:3px solid #fff6e2;outline-offset:1px}
.tl-swc{background:conic-gradient(#e0453a,#efc851,#79c05a,#3fd8cf,#4fa3d8,#8b7fc0,#fa98c7,#e0453a);overflow:hidden}
.tl-swc input{position:absolute;inset:-6px;width:calc(100% + 12px);height:calc(100% + 12px);opacity:0;cursor:pointer}
.tl-edb{display:flex;flex-wrap:wrap;gap:6px}

/* ---- pick and place: the bar at the bottom of the screen ---- */
.tl-place{position:fixed;left:50%;bottom:calc(14px + env(safe-area-inset-bottom,0px));translate:-50% 0;z-index:75;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 10px;width:max-content;max-width:calc(100vw - 20px);padding:8px 10px;border-radius:12px;border:2px solid var(--line-l,#3c5864);background:linear-gradient(#1b2f37,#101c22);box-shadow:0 12px 26px rgba(0,0,0,.6),0 4px 0 rgba(0,0,0,.45)}
.tl-pn{max-width:10rem;color:#efc851;font:700 .95rem/1.15 var(--font-t)}
.tl-pb{display:flex;flex-wrap:wrap;gap:6px;justify-content:center}
.tl-pt{min-width:2.6rem;height:2.6rem;margin:0;padding:0 8px;border:0;border-radius:8px;background:linear-gradient(rgba(255,255,255,.2),rgba(255,255,255,0) 45%,rgba(0,0,0,.2)),var(--tc);box-shadow:inset 0 2px 0 rgba(255,255,255,.32),0 3px 0 rgba(0,0,0,.45);color:#fff6e2;cursor:pointer;font:700 1.15rem/1 var(--font-t);-webkit-text-stroke:.12em rgba(0,0,0,.55);paint-order:stroke fill}
.tl-pt span{display:block;max-width:6rem;overflow-wrap:anywhere}
.tl-pt:hover{filter:brightness(1.15)}.tl-pt:active{translate:0 2px;box-shadow:inset 0 2px 0 rgba(255,255,255,.3),0 1px 0 rgba(0,0,0,.45)}
.tl-pt.tl-pu{--tc:#34474f;font-size:.9rem;-webkit-text-stroke:0}
.tl-px{width:2.3rem;height:2.3rem;margin:0;padding:0;border:0;border-radius:50%;background:rgba(255,255,255,.08) url(/img/compressed/back_button_x.webp) center/14px no-repeat;cursor:pointer}
.tl-px svg{display:none}
.tl-px:hover{background-color:rgba(255,255,255,.16)}
.tl-live{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}

/* ---- read only (a shared link, a saved list) ---- */
.tlr.view .tl-tray,.tlr.view .tl-more,.tlr.view .tl-rc,.tlr.view .tl-place{display:none!important}
.tlr.view .tl-lab,.tlr.view .tl-it{cursor:default}
.tlr.view .tl-lab::after{display:none}

/* ---- presentation: the tiers alone, big, over the whole window, the room behind ---- */
html.tl-present{overflow:hidden}
.tl-phead{display:none}
.tlr.present{position:fixed;inset:0;z-index:70;overflow:auto;overscroll-behavior:contain;padding:clamp(12px,2.2vw,34px);background:linear-gradient(rgba(6,12,15,.7),rgba(6,12,15,.84)),var(--pbg,none) center/cover no-repeat,#0a1216;--lw:8.4rem}
.tlr.present .tl-bar,.tlr.present .tl-tray,.tlr.present .tl-note,.tlr.present .tl-rc{display:none!important}
.tlr.present .tl-board{margin:0}
.tlr.present .tl-phead{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;margin:0 0 12px;padding:2px 4px}
.tl-ptitle{flex:1 1 auto;min-width:0;color:#fff6e2;font:700 clamp(1.5rem,2.6vw,2.4rem)/1.1 var(--font-t);text-shadow:0 3px 0 rgba(0,0,0,.55);overflow-wrap:anywhere}
.tl-mark{display:inline-flex;align-items:center;gap:8px;color:rgba(255,246,226,.9);font:700 1.15rem/1 var(--font-t);text-shadow:0 2px 0 rgba(0,0,0,.5)}
.tl-mark img{display:block;width:auto;height:28px}
.tl-pbtn{display:flex;gap:8px}
.tlr.present .tl-lab{font-size:min(3.2rem,calc(var(--rh,60px) * .6))}
.tlr.present .tl-row.long .tl-lab{font-size:1.35rem}
.tlr.present .tl-drop{padding:10px}   /* the gap stays the fit's (--ig): a wider one than tlFitRows counted pushed the last line out */
.tlr.present .tl-it.tl-card{--cw:7.4rem}
.tlr.present .tl-it.tl-rel,.tlr.present .tl-it.tl-pot{--tw:6rem}
.tlr.present .tl-it.tl-chr{--tw:8rem}
.tlr.present .tl-it.tl-evt{--tw:13rem}
.tlr.present .tl-it.tl-mon{--tw:9rem}
.tlr.present .tl-chr .tl-nm{font-size:1rem}
.tlr.present .tl-evt .tl-nm,.tlr.present .tl-mon .tl-nm{font-size:.9rem}

/* ---- row heights follow the kind's item ---- */
.tlr[data-kind="cards"]{--th:calc(5.4rem * 1.4067)}
.tlr[data-kind="relics"],.tlr[data-kind="potions"]{--th:4.4rem}
.tlr[data-kind="characters"]{--th:calc(5.4rem * 195 / 132 + 1.35rem)}
.tlr[data-kind="events"]{--th:calc(9.6rem * 658 / 1400)}
.tlr[data-kind="enemies"],.tlr[data-kind="elites"],.tlr[data-kind="bosses"]{--th:6.4rem}
.tlr.present[data-kind="cards"]{--th:calc(7.4rem * 1.4067)}
.tlr.present[data-kind="relics"],.tlr.present[data-kind="potions"]{--th:6rem}
.tlr.present[data-kind="characters"]{--th:calc(8rem * 195 / 132 + 1.35rem)}
.tlr.present[data-kind="events"]{--th:calc(13rem * 658 / 1400)}
.tlr.present[data-kind="enemies"],.tlr.present[data-kind="elites"],.tlr.present[data-kind="bosses"]{--th:9rem}

/* ---- the ranker's page gives the tiers the height (Bean, 25 Sep 2026: "the tier list just has to be visible the whole thing, no scrolling"): a tight
   header and bar, a thinner plate rim, a slimmer tray handle, and in a short window smaller items in the pool (a tier's items take the fit anyway) ---- */
.tlpage:is(.tlrank,.tlview)>.crumbs{margin-bottom:4px}
.tlpage:is(.tlrank,.tlview)>.ptitle-row{margin-bottom:6px}
.tlpage:is(.tlrank,.tlview)>.ptitle-row h1{font-size:clamp(1.45rem,1.1rem + 1vw,1.85rem)}
.tlpage:is(.tlrank,.tlview) .ptitle-ico{width:2rem;height:2rem}
.tlr .tl-bar{margin:0 0 8px;padding:6px 8px}
.tlr .tl-title{padding-top:7px;padding-bottom:6px}
.tlr .tl-bar .fstrip .fsearch input[type=search],.tlr .tl-bar.fstrip .fsearch input[type=search]{padding-top:7px;padding-bottom:6px}
.tlr .tl-bar .fmore{min-height:2.3rem}
.tl-board{--sbw:14px}
.tl-th{min-height:2.15rem}
@media (max-height:900px) and (min-width:481px){
  .tl-it.tl-card{--cw:3.9rem}.tl-it.tl-rel,.tl-it.tl-pot{--tw:3.3rem}.tl-it.tl-chr{--tw:3.9rem}.tl-it.tl-evt{--tw:7.2rem}.tl-it.tl-mon{--tw:4.6rem}}

/* ---- short windows (tierlist.js tlLayChoose). tl-short: the ranker's own chrome compacted (the crumbs and the heading for screen readers only, the title box
   names the list; the bar on one line with the short labels; a thinner plate; smaller items in the pool). tl-side: the bar and the pool in a column beside the
   tiers, which take the whole height; Copy link and Download image move into the bar's "more" menu. tl-flow: the tray follows the board instead of docking ---- */
.tlpage.tl-compact>.crumbs,.tlpage.tl-compact>.ptitle-row{position:absolute!important;width:1px!important;height:1px!important;margin:0!important;padding:0!important;overflow:hidden!important;clip-path:inset(50%);white-space:nowrap}
.tlr.tl-short .tl-bar{gap:6px 8px;margin-bottom:6px;padding:5px 6px}
.tlr.tl-short .tl-title{flex:1 1 8rem;padding:5px 8px 4px 34px;background-position:7px center;background-size:20px;font-size:1rem}
.tlr.tl-short .tl-sq{flex:1 1 7rem}
.tlr.tl-short .tl-bar.fstrip .fsearch input[type=search]{padding-top:5px;padding-bottom:4px}
.tlr.tl-short .tl-bar .fmore{min-height:2.1rem;padding:4px 10px 3px 12px}
.tlr.tl-short .tl-acts{gap:6px}
.tlr.tl-short .tl-acts>.btn{padding-left:11px;padding-right:11px}
.tlr.tl-short .tl-l1{display:none}.tlr.tl-short .tl-l2{display:inline}
.tlr.tl-short .tl-board{--sbw:8px}
.tlr.tl-short .tl-rows{gap:3px}
.tlr.tl-short .tl-rows .tl-drop{padding:4px}
.tlr.tl-short .tl-th{min-height:1.85rem}
.tlr.tl-short .tl-tray .tl-grid{padding:6px 8px 10px;gap:6px}
.tlr.tl-short #tlpool>.tl-it.tl-card{--cw:3.3rem}
.tlr.tl-short #tlpool>.tl-it:is(.tl-rel,.tl-pot){--tw:2.9rem}
.tlr.tl-short #tlpool>.tl-it.tl-chr{--tw:3.3rem}
.tlr.tl-short #tlpool>.tl-it.tl-evt{--tw:6.2rem}
.tlr.tl-short #tlpool>.tl-it.tl-mon{--tw:4rem}
.tlr.tl-side{display:grid;grid-template-columns:minmax(0,1fr) clamp(16rem,40%,24rem);grid-template-rows:auto auto minmax(0,1fr);column-gap:10px;align-items:start}
.tlr.tl-side>.tl-stage{display:contents}
.tlr.tl-side .tl-board{grid-column:1;grid-row:1/span 3;margin:0}
.tlr.tl-side>.tl-bar{grid-column:2;grid-row:1;margin:0 0 8px}
.tlr.tl-side>.tl-note{position:absolute;left:0;right:0;top:0;z-index:30;grid-column:2;grid-row:2;margin:0;background:linear-gradient(#1a2c34,#101b21);box-shadow:0 14px 28px rgba(0,0,0,.6),0 4px 0 rgba(0,0,0,.45)}   /* over the pool's top, so the column keeps its height */
.tlr.tl-side .tl-tray{grid-column:2;grid-row:3;position:relative;bottom:auto;margin:0;border-bottom:2px solid var(--line);border-radius:12px;box-shadow:0 5px 0 rgba(0,0,0,.42),inset 0 1px 0 rgba(255,255,255,.07)}
.tlr.tl-side .tl-tray.min{height:var(--trayh,42vh)}
.tlr.tl-side .tl-tray.min .tl-grid{display:flex}
.tlr.tl-side .tl-tb,.tlr.tl-side .tl-grip{display:none}
.tlr.tl-side .tl-th{cursor:default}
.tlr.tl-side .tl-bar .tl-title{flex-basis:100%}
.tlr.tl-side .tl-bar .tl-acts{width:100%;flex-wrap:nowrap}
.tlr.tl-side .tl-bar .tl-acts>.btn{flex:1 1 auto;min-width:0}
.tlr.tl-side .tl-bar.ed .tl-acts>:is([data-a="link"],[data-a="png"]){display:none}
.tl-mm .tl-mx{display:none}
.tlr.tl-side .tl-mm .tl-mx{display:block}
.tlr.tl-side .tl-bar.vw .tl-acts{flex-wrap:wrap}
.tlr.tl-flow .tl-tray{position:relative;bottom:auto}
/* the presentation in a short window: a slimmer title line and plate, so the tiers keep the height */
@media (max-height:560px){
  .tlr.present{padding:8px 12px}
  .tlr.present .tl-phead{margin-bottom:6px;gap:6px 12px}
  .tlr.present .tl-ptitle{font-size:1.3rem}
  .tlr.present .tl-mark img{height:22px}
  .tlr.present .tl-board{--sbw:8px}
  .tlr.present .tl-rows{gap:3px}
  .tlr.present .tl-drop{padding:5px}}

/* ---- the index ---- */
/* 12 columns: the eight kinds four a row; a kind's choices four a row with "All" as wide as two, the three card types a third each */
.tl-kinds{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:14px;margin:8px 0 26px}
.tl-kind{grid-column:span 3}
.tl-subs .tl-kind[data-s="all"]{grid-column:span 6}
.tl-subs .tl-kind:is([data-s="attack"],[data-s="skill"],[data-s="power"]){grid-column:span 4}
.tl-sec{margin:0 0 6px}
.tl-kico.sm{width:2.6rem;height:2.6rem;font-size:1.7rem}
.tl-kico.sm .fico[data-k="type"]{width:1.1em;height:1.3em}
.tl-kico.sm .fico[data-k="char"]{width:1.5em;height:1.5em}
.tl-kind{position:relative;display:flex;flex-direction:column;align-items:stretch;gap:10px;padding:12px 14px 14px;overflow:hidden;border-radius:12px;border:2px solid var(--line);background:linear-gradient(#1a2d35,#101d23);box-shadow:0 5px 0 rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.07);color:#fff6e2;text-decoration:none;transition:translate .12s,border-color .12s}
.tl-kind:hover,.tl-kind:focus-visible{translate:0 -2px;border-color:var(--gold);outline:0}
/* no underline on a tile's name or count (style.css a:hover underlines every link; Bean, 25 Sep 2026: "We don't need underlines on the numbers and titles on the tier lists page") */
.tl-kind,.tl-kind:hover,.tl-kind:focus-visible,.tl-ml a,.tl-ml a:hover{text-decoration:none}
.tl-kind:active{translate:0 1px;box-shadow:0 2px 0 rgba(0,0,0,.45)}
.tl-kl{display:flex;align-items:center;gap:12px;min-width:0}
.tl-kico{display:grid;place-items:center;flex:none;width:3.2rem;height:3.2rem}
/* the index's picture: a painting in the homepage tiles' manner (tierlist.js TL_ART), the whole width of the tile */
.tl-kpaint{gap:9px;padding:10px 10px 12px}
.tl-kpic{display:block;pointer-events:none}
.tl-kpic>.a3d{display:block}   /* art3d.js wraps the painting on hover; a block wrapper keeps the tile from growing by a text line */
.tl-kpic img{display:block;width:100%;height:auto;aspect-ratio:380/288;object-fit:cover;border-radius:6px;box-shadow:0 3px 0 rgba(0,0,0,.5)}
.tl-kpic img.tl-framed{box-sizing:border-box;border:2px solid #f4d2a9}
.tl-kpaint .tl-kl{padding:0 4px}
.tl-kpaint .tl-kico{width:2.6rem;height:2.6rem}
.tl-kpaint .tl-kd{right:16px;top:16px;background:rgba(20,14,4,.82)}
/* the picture: items of the kind as the ranker draws them */
.tl-kart{position:relative;display:flex;align-items:flex-end;justify-content:center;height:8.6rem;margin:0 -14px;padding:0 10px 4px;border-bottom:2px solid rgba(255,255,255,.06);background:radial-gradient(ellipse at 50% 100%,rgba(83,140,158,.22),transparent 70%);pointer-events:none}
.tl-pv{cursor:inherit;transition:translate .18s ease}
.tl-pv .tl-nm{display:none}
.tl-pv.tl-card{--cw:4.7rem}
.tl-pv.tl-card:nth-child(1){rotate:-9deg;translate:10px 6px}.tl-pv.tl-card:nth-child(2){z-index:1;translate:0 -4px}.tl-pv.tl-card:nth-child(3){rotate:9deg;translate:-10px 6px}
.tl-kind:hover .tl-pv.tl-card:nth-child(1){translate:2px 2px}.tl-kind:hover .tl-pv.tl-card:nth-child(2){translate:0 -10px}.tl-kind:hover .tl-pv.tl-card:nth-child(3){translate:-2px 2px}
.tl-pv.tl-rel{--tw:3.6rem;margin:0 3px 1.4rem}
.tl-pv.tl-rel:nth-child(even){margin-bottom:2.2rem}
.tl-pv.tl-pot{--tw:3.6rem;margin:0 3px 1.4rem}
.tl-pv.tl-pot:nth-child(even){margin-bottom:2.2rem}
.tl-pv.tl-chr{--tw:3.5rem;height:calc(var(--tw) * 195 / 132);margin:0 -3px}
.tl-pv.tl-chr:nth-child(3){z-index:1;--tw:4.1rem}
.tl-pv.tl-evt{--tw:46%;margin:0 4px 1.2rem;width:var(--tw);height:auto;aspect-ratio:1400/658}
.tl-pv.tl-evt:nth-child(2){translate:0 -.8rem}
.tl-pv.tl-mon{--tw:6.2rem;margin:0 2px .4rem}
.tl-kind:hover .tl-pv:not(.tl-card){translate:0 -3px}
.tl-kico img{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 3px 2px rgba(0,0,0,.6))}
.tl-kt{display:flex;flex-direction:column;gap:3px;min-width:0}
.tl-kn{font:700 1.3rem/1.1 var(--font-t)}
.tl-kc{color:var(--dim);font-size:.95rem}
.tl-kd{position:absolute;right:10px;top:8px;padding:2px 8px;border-radius:999px;background:rgba(239,200,81,.14);border:1px solid rgba(239,200,81,.55);color:#efc851;font-size:.78rem;font-weight:700}
.tl-mine{margin:4px 0 20px}
.tl-ml{display:grid;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));gap:10px}
.tl-saved{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:10px;border:2px solid var(--line);background:rgba(8,16,20,.7);color:#fff6e2;text-decoration:none}
.tl-saved:hover{border-color:var(--gold)}
.tl-saved img{width:36px;height:36px;object-fit:contain}
.tl-saved b{display:block;font:700 1rem/1.2 var(--font-t)}
.tl-sk{color:var(--dim);font-size:.85rem}

/* ---- smaller screens ---- */
@media (max-width:1180px){.tl-kind{grid-column:span 4}.tl-k8 .tl-kind,.tl-k8 .tl-kind:nth-child(n+7){grid-column:span 3}   /* the eight paintings stay four a row, one size (a wide last pair blew two of them up) */
  .tl-kpaint .tl-kl{gap:8px;padding:0 2px}.tl-kpaint .tl-kico{width:2.2rem;height:2.2rem}.tl-kpaint .tl-kn{font-size:1.1rem}.tl-subs .tl-kind[data-s="all"]{grid-column:span 12}
  .tl-pv.tl-rel,.tl-pv.tl-pot{--tw:3rem;margin:0 2px 1.2rem}.tl-pv.tl-chr{--tw:2.8rem}.tl-pv.tl-chr:nth-child(3){--tw:3.3rem}}
@media (max-width:760px){
  .tl-pv.tl-rel:nth-child(n+4),.tl-pv.tl-pot:nth-child(n+4),.tl-pv.tl-chr:nth-child(1),.tl-pv.tl-chr:nth-child(5){display:none}
  .tlr{--lw:4.6rem}
  .tl-board{--sbw:14px}
  .tl-lab{font-size:min(1.8rem,calc(var(--rh,60px) * .6))}
  .tl-it.tl-card{--cw:4.2rem}.tlr[data-kind="cards"]{--th:calc(4.4rem * 1.4067)}
  .tl-it.tl-rel,.tl-it.tl-pot{--tw:3.4rem}.tlr[data-kind="relics"],.tlr[data-kind="potions"]{--th:3.8rem}
  .tl-it.tl-chr{--tw:4.2rem}.tlr[data-kind="characters"]{--th:calc(4.6rem * 195 / 132 + 1.35rem)}
  .tl-it.tl-evt{--tw:7.4rem}.tlr[data-kind="events"]{--th:calc(8rem * 658 / 1400)}
  .tl-it.tl-mon{--tw:4.8rem}.tlr[data-kind="enemies"],.tlr[data-kind="elites"],.tlr[data-kind="bosses"]{--th:5.4rem}
  .tlr.present{--lw:5.4rem}
  .tlr.present .tl-lab{font-size:min(2.2rem,calc(var(--rh,60px) * .6))}}
@media (max-width:480px){
  .tlr{--lw:3.4rem}
  .tl-board{--sbw:12px;margin:0 -2px 10px}
  .tl-lab{font-size:min(1.45rem,calc(var(--rh,60px) * .55));border-radius:7px 0 0 7px}
  .tl-row.long .tl-lab{font-size:.78rem}
  .tl-drop{gap:5px;padding:5px}
  .tl-it.tl-card{--cw:3.8rem}.tlr[data-kind="cards"]{--th:calc(3.8rem * 1.4067)}
  .tl-it.tl-rel,.tl-it.tl-pot{--tw:3.1rem}.tlr[data-kind="relics"],.tlr[data-kind="potions"]{--th:3.3rem}
  .tl-it.tl-chr{--tw:3.8rem}.tlr[data-kind="characters"]{--th:calc(3.9rem * 195 / 132 + 1.35rem)}
  .tl-chr .tl-nm{font-size:.66rem}
  .tl-it.tl-evt{--tw:6.6rem}.tlr[data-kind="events"]{--th:calc(7rem * 658 / 1400)}
  .tl-it.tl-mon{--tw:4.4rem}.tlr[data-kind="enemies"],.tlr[data-kind="elites"],.tlr[data-kind="bosses"]{--th:4.6rem}
  .tl-evt .tl-nm,.tl-mon .tl-nm{font-size:.6rem}
  .tl-bar{padding:8px}
  .tl-title{flex-basis:100%}
  .tl-sq{flex-basis:8rem}
  .tl-acts{width:100%;flex-wrap:nowrap;gap:6px}
  .tl-acts>.btn{flex:1 1 auto;min-width:0;padding-left:6px;padding-right:6px}
  .tl-l1{display:none}.tl-l2{display:inline}
  .tl-kinds{gap:10px}
  .tl-kind,.tl-k8 .tl-kind,.tl-k8 .tl-kind:nth-child(n+7),.tl-subs .tl-kind:is([data-s="attack"],[data-s="skill"]){grid-column:span 6;padding:10px 12px 12px}
  .tl-subs .tl-kind:is([data-s="all"],[data-s="power"]){grid-column:span 12}
  .tl-kart{height:6.6rem;margin:0 -12px}
  .tl-pv.tl-card{--cw:3.8rem}.tl-pv.tl-rel,.tl-pv.tl-pot{--tw:2.6rem;margin:0 1px 1rem}.tl-pv.tl-rel:nth-child(n+4),.tl-pv.tl-pot:nth-child(n+4){display:none}
  .tl-pv.tl-chr{--tw:2.6rem;margin:0 -4px}.tl-pv.tl-chr:nth-child(3){--tw:3rem}.tl-pv.tl-chr:nth-child(1),.tl-pv.tl-chr:nth-child(5){display:none}
  .tl-pv.tl-evt{--tw:80%}.tl-pv.tl-evt:nth-child(2){display:none}
  .tl-pv.tl-mon{--tw:4.6rem}.tl-pv.tl-mon:nth-child(2){display:none}
  .tl-kico{width:2.4rem;height:2.4rem}
  .tl-kn{font-size:1.1rem}
  .tl-kd{top:10px}
  .tl-place{left:10px;right:10px;width:auto;translate:none;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}
  .tl-pn{grid-row:1;grid-column:1;align-self:center;max-width:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .tl-px{grid-row:1;grid-column:2}
  .tl-pb{grid-row:2;grid-column:1/-1}}
/* step 2's painted tiles (tierlist.js tlSubArtHtml): one painting size per row. Seven choices go four and three (the second row a third wider), the three
   card types a third each; on a phone two a row. The wide "All" of the old previews would have doubled its painting's height. */
.tl-subs.tl-sp .tl-kind{grid-column:span 3}
.tl-subs.tl-sp .tl-kind:nth-child(n+5),.tl-subs.tl-sp .tl-kind:is([data-s="attack"],[data-s="skill"],[data-s="power"]){grid-column:span 4}
@media (max-width:480px){.tl-subs.tl-sp .tl-kind,.tl-subs.tl-sp .tl-kind:nth-child(n+5),.tl-subs.tl-sp .tl-kind:is([data-s="attack"],[data-s="skill"],[data-s="power"]){grid-column:span 6}}

/* ===== app/tilehousing.css ===== */
/* ===== the housing of a small item tile: relics, potions, powers (wave 4, 21 Sep 2026; docs/wave4/directories.md; markup: app/directories.js houseCell, pages_potions.js ptCell) =====
   Bean: "Give the individual relics outer housing like on the potions page, the issue is I'm not the biggest fan of how the outer potion housing looks, I understand you are
   using an in-game element here as the border, but I don't like that it's wonky and not perfectly symmetrical ... house them in something interesting."
   The potion list used the top bar's potion tray sprite (hand drawn, every corner different). This is the same idea drawn in CSS so it is exact: an eight sided frame
   (the cut corners the site's panels and top bar buttons already have), a metal rim lit from straight above so left and right are mirror images, the rarity colour along
   the lower edge, a rarity gem set into the middle of that edge and a soft pedestal glow under the icon. One frame for relics, potions and powers, so the three lists match.
   The name and the sub line stay OUTSIDE the frame: every frame is the same size whatever the name's length, and no name is cut.
   Two other designs were built and not picked (a rounded inset socket, a whole-tile plate): their CSS is kept in docs/wave4/directories.md.
   Rules: the cuts are drawn on the two pseudo layers, never on the slot, so the hovered icon (it grows and tilts, icons3d.css) is never clipped; no filter, mask or 3D on a
   tile at rest; hover changes colours only, never a size, so nothing reflows. The pseudo layers sit under the icon through negative z-index inside the slot's own
   stacking context, so the icon's hover z-index rules (icons3d.css) are untouched. */
@property --ih-top{syntax:'<color>';inherits:true;initial-value:#86a7b3}
@property --ih-mid{syntax:'<color>';inherits:true;initial-value:#34515c}
@property --ih-glow{syntax:'<percentage>';inherits:true;initial-value:36%}
.itemcell.housed{--rc:#7d8b91;position:relative}
/* the rarity colours are the filter chips' (filters.css .fgrp-rar --rc): a tile and its chip always agree */
.itemcell.housed[data-rar="starter"],.itemcell.housed[data-rar="basic"]{--rc:var(--r-basic)}
.itemcell.housed[data-rar="common"]{--rc:var(--r-common)}
.itemcell.housed[data-rar="uncommon"]{--rc:var(--r-uncommon)}
.itemcell.housed[data-rar="rare"]{--rc:var(--r-rare)}
.itemcell.housed[data-rar="ancient"]{--rc:var(--r-ancient)}
.itemcell.housed[data-rar="shop"]{--rc:var(--gold-d)}
.itemcell.housed[data-rar="event"]{--rc:var(--green-d)}
.itemcell.housed[data-rar="special"]{--rc:#ee82ee}   /* the potion lab's fourth group (Event and Token potions), potions.css */
.itemcell.housed[data-rar="buff"]{--rc:#8fd96b}
.itemcell.housed[data-rar="debuff"]{--rc:var(--red)}
.ih-slot{--cut:15px;--ih-top:#86a7b3;--ih-mid:#34515c;--ih-glow:36%;position:relative;isolation:isolate;display:grid;place-items:center;flex:none;width:5.6rem;height:5.6rem;
  box-shadow:0 9px 10px -13px rgba(0,0,0,.8);transition:--ih-top .14s,--ih-mid .14s,--ih-glow .14s}
.ih-slot::before,.ih-slot::after{content:"";position:absolute;inset:0;z-index:-2;pointer-events:none;
  clip-path:polygon(var(--cut) 0,calc(100% - var(--cut)) 0,100% var(--cut),100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,var(--cut) 100%,0 calc(100% - var(--cut)),0 var(--cut))}
/* the rim: bright top edge, dark sides, the rarity colour along the lower edge */
.ih-slot::before{background:linear-gradient(180deg,var(--ih-top),var(--ih-mid) 22%,#101d23 62%,color-mix(in srgb,var(--rc) 78%,#0c161b))}
/* the well: 2.5 px inside the rim, a little lighter behind the icon, the pedestal glow at its foot */
.ih-slot::after{inset:2.5px;--cut:13.5px;z-index:-1;background:radial-gradient(62% 30% at 50% 92%,color-mix(in srgb,var(--rc) var(--ih-glow),transparent),transparent 72%),radial-gradient(90% 80% at 50% 38%,#1a2f38,#0b151a)}
.ih-slot>:is(.relic,.potion,.power){width:4.2rem;height:4.2rem}
/* THE FRAME IS SQUARE AGAIN (wave 5; Bean, 22 Sep 2026: "a lot of the relics sit too high up within their housing, you can fix this by moving them down slightly, and on
   hover of said boxes just make the diamond not expand as much to get bigger. Make it only get bigger 50% of the current amount it does it. Then with this change I think
   we can actually make the housing square as it was before it doesn't need the extra height, this goes for everywhere we eextended the height as well."). The 15 % taller
   frame of 21 Sep (5.6 x 6.44 rem, the icon held .7 rem under the top edge with all the extra room under it) is gone: the frame is 5.6 rem square on every housed tile,
   the icon stands in its middle, 2 px lower than dead centre (his "moving them down slightly"; the lit rim above and the coloured edge with its gem below make the
   geometric middle read a hair high), and the gem's hover growth is half of what it was (--gem-hov 1.225, was 1.45: see the gem below). What a hovered icon reaches
   was measured again with a real pointer (docs/wave5/filters.md): its image stays clear of the smaller lit gem, the soft rim glow may touch the gem's point. The
   potion page's big slot (potions.css .pt-bigslot) was a centred square all along and is untouched. */
.itemcell.housed .ih-slot{padding-top:4px}   /* border-box: the centred icon lands 2 px under the frame's middle */
.itemcell.housed .ih-gem{bottom:-.4rem}   /* the gem hangs 1.5 px lower on the edge than the big slot's, so the hovered image's foot stays clear of its point (measured: +0.6 to +0.9 px; the soft rim glow may still touch it) */
/* the gem: a real element (the tile's ::after is the playtest sticker), set into the middle of the lower edge */
.ih-gem{position:absolute;left:50%;bottom:-.3rem;z-index:2;width:.6rem;height:.6rem;translate:-50% 0;rotate:45deg;border-radius:1px;pointer-events:none;
  background:linear-gradient(135deg,color-mix(in srgb,var(--rc) 55%,#fff),var(--rc) 55%,color-mix(in srgb,var(--rc) 70%,#000));box-shadow:0 0 0 2px #0a1216,0 0 8px color-mix(in srgb,var(--rc) 70%,transparent)}
/* THE GEM IS AN ORB WHILE THE TILE IS HOVERED (Bean, Addendum 4: "on hover have the little diamond shine or glow like its an orb, it should have a internal glow/particle
   animation that loops and is ongoing during hover."). At rest the gem is the flat faceted diamond above and carries no pseudo-elements: they exist only under the hover /
   focus selectors, so a grid of 600 tiles pays for one gem at a time. While hovered (the tile under the pointer, keyboard focus, or the icon holding the pointer) the
   diamond grows by --gem-hov, its bloom brightens, and inside its own clip (overflow:hidden on the rotated square = the diamond) run three loops, all in the gem's --rc:
     ::before  the inner light: a white-hot core fading to the rarity colour that BREATHES (scale, 1.5 s, alternate), over a bright ray that TURNS round the core like a
               glint crossing the facets (rotate, 2.6 s, linear);   [all three durations x --gem-slow, see below]
     ::after   three tiny motes that DRIFT UP through the diamond without end: a screen-upright strip (the gem is turned 45 deg, so the strip is turned back) whose dot
               pattern repeats every half of its height and slides up by exactly one repeat per loop (1.9 s, linear), so the loop has no seam.
   Only scale / rotate / translate / opacity animate: nothing reflows and nothing repaints outside a 14 px box. Reduced motion: no loops, no motes; the gem is simply the
   bigger, lit one. The icon's own 3D hover is a sibling and is not touched. */
/* THE LOOPS RUN AT A QUARTER OF THEIR FIRST SPEED (Bean, Addendum 6: "The diamond particle animation is a bit fast as well, slow it by 75% please"): --gem-slow multiplies
   the three loop durations below (1.5 / 2.6 / 1.9 s x 4 = 6 / 10.4 / 7.6 s). It is the one dial for the orb's pace. The three motes are one strip with one animation, so
   there is no stagger to scale and the rise stays seamless at any pace. The 160 ms grow and the .2 s fade-in when the pointer arrives keep their speed. */
/* THE GEM GROWS HALF AS MUCH (wave 5; Bean, 22 Sep 2026: "make the diamond not expand as much to get bigger. Make it only get bigger 50% of the current amount it does
   it"): 1.45 x was a growth of .45, so the growth is .225 and --gem-hov is 1.225; the big slot's 1.22 (a growth of .22) becomes 1.11 the same way. */
.ih-gem{--gem-hov:1.225;--gem-slow:4;overflow:hidden;transition:scale .16s cubic-bezier(.2,.7,.3,1),box-shadow .16s}
.pt-bigslot .ih-gem{--gem-hov:1.11}   /* the potion page's big gem (potions.css) is already twice the size */
/* the lit gem's body is deep at its edges so the light inside has something to glow against; the two upper facets catch a highlight.
   THE BLOOM LEANS UP, onto the frame's lower edge, and is tight below the gem (Addendum 5, see .nm below): its two glow shadows are offset towards the top of the SCREEN
   (the gem is turned 45 deg, so "up" is -x -y in its own frame), which keeps the light off the name under the tile. The inset facet light is last in the list so the
   list lines up with the resting gem's two shadows and the 160 ms transition is a real fade. */
:is(.itemcell.housed:is(:hover,:focus-visible),.ih-slot:has(.hov)) .ih-gem{scale:var(--gem-hov);
  background:radial-gradient(circle closest-side,color-mix(in srgb,var(--rc) 70%,#fff),var(--rc) 42%,color-mix(in srgb,var(--rc) 38%,#000) 118%);
  box-shadow:0 0 0 1.5px #0a1216,-.5px -.5px 3px 1px color-mix(in srgb,var(--rc) 70%,#fff),-2px -2px 8px 2px color-mix(in srgb,var(--rc) 80%,transparent),inset 1px 1px 0 rgba(255,255,255,.5)}
:is(.itemcell.housed:is(:hover,:focus-visible),.ih-slot:has(.hov)) .ih-gem::before{content:"";position:absolute;inset:-30%;border-radius:50%;
  background:radial-gradient(circle closest-side,rgba(255,255,255,.97) 0,color-mix(in srgb,var(--rc) 45%,#fff) 16%,color-mix(in srgb,var(--rc) 85%,transparent) 34%,transparent 56%),
    conic-gradient(from 0deg,transparent 0 50%,rgba(255,255,255,.95) 72%,transparent 92%);
  animation:ih-gem-in .2s ease-out both,ih-gem-breathe calc(1.5s*var(--gem-slow)) ease-in-out infinite alternate,ih-gem-turn calc(2.6s*var(--gem-slow)) linear infinite}
:is(.itemcell.housed:is(:hover,:focus-visible),.ih-slot:has(.hov)) .ih-gem::after{content:"";position:absolute;left:-50%;top:-150%;width:200%;height:400%;rotate:-45deg;
  background:radial-gradient(circle at 38% 14%,#fff 0,rgba(255,255,255,.9) 4%,transparent 7.5%),radial-gradient(circle at 61% 47%,#fff 0,rgba(255,255,255,.85) 3.2%,transparent 6%),radial-gradient(circle at 45% 80%,#fff 0,rgba(255,255,255,.9) 3.6%,transparent 6.8%);
  background-size:100% 50%;background-repeat:repeat-y;
  animation:ih-gem-in .25s ease-out both,ih-gem-rise calc(1.9s*var(--gem-slow)) linear infinite}
@keyframes ih-gem-in{from{opacity:0}to{opacity:1}}
@keyframes ih-gem-breathe{from{scale:.7}to{scale:1.14}}
@keyframes ih-gem-turn{to{rotate:360deg}}
/* one repeat of the strip (half its height = 2 gem sides) straight up the SCREEN is (-1,-1)/sqrt2 x 2 sides in the gem's turned frame: -70.71 % of the strip's width, -35.355 % of its height */
@keyframes ih-gem-rise{from{translate:0 0}to{translate:-70.71% -35.355%}}
/* THE NAME STANDS 15 px UNDER THE FRAME (Bean, Addendum 5: "the text below each potion needs to be moved down around 6px or so, because currently on hover ithe diamond
   expands and is covered by said text on the potion directory"): the tile's 6 px gap + 9 px here; it was 6 + 3. The lit gem reaches about 10.5 px under the frame (its
   point and dark ring, at 1.45 x) and its visible bloom a little further, so the name's line box starts below all of it (measured, docs/wave4/directories.md). The room
   is there AT REST: hover changes no size. Every housed tile gets it (the three lists, the potion page's belt, the relic page's synergy tiles): it is the tile's rule. */
.itemcell.housed .nm{margin-top:9px}
/* EVERY TILE IN A GRID IS THE SAME HEIGHT (wave 5; Bean, 22 Sep 2026: "We can't have different heights and spacing between rows"): the name's box is two lines tall on
   every tile (2 x 1.15 x .9rem), whether the name takes one line or two, so a row's height never depends on which names wrapped; a name over 28 characters (.long,
   directories.js houseName) is set a size down so it fits in two lines at every width and never makes a third. Measured after: one tile height per width, 0 cut names. */
.itemcell.housed .nm{min-height:2.07rem}
.itemcell.housed .nm.long{font-size:.82rem}
/* NOTHING UNDER THE NAME BUT THE NAME (wave 5; Bean, 22 Sep 2026, Potions: "Remove the character name below each listing, remove the rarity text below each one as well,
   this is already shown by the outline and diamond color"; Relics: "We can't have different heights and spacing between rows, currently this happens when you list a
   character like "ironclad" on a separate row. Think of another way without text to show its a character relic. If you can't find a way to do that that isn't
   overwhelming let's just not show it at all"). The rarity word and the character line are gone from every housed tile (directories.js houseCell no longer writes them;
   this rule hides any that another caller still writes, so every tile in a grid is the same height). A character's item wears the character's small head instead:
   .ih-who, the top bar's head icon (ui/top_panel/character_icon_<id>), 1.15 rem, set in the frame's top left corner over the rim like a maker's mark, dimmed at rest
   and full colour while the tile is hovered. One quiet picture, no text, no row of its own; the tile stays the same height whether or not it has one. */
.itemcell.housed .sub{display:none}
.ih-who{position:absolute;left:5px;top:5px;z-index:2;width:1.15rem;height:1.15rem;border-radius:50%;background:center/contain no-repeat;box-shadow:0 0 0 1.5px rgba(8,16,20,.85),0 1px 2px rgba(0,0,0,.6);opacity:.78;pointer-events:none;transition:opacity .14s}
.ih-who[data-c="ironclad"]{background-image:url(/img/ui/top_panel/character_icon_ironclad.webp)}.ih-who[data-c="silent"]{background-image:url(/img/ui/top_panel/character_icon_silent.webp)}.ih-who[data-c="defect"]{background-image:url(/img/ui/top_panel/character_icon_defect.webp)}.ih-who[data-c="necrobinder"]{background-image:url(/img/ui/top_panel/character_icon_necrobinder.webp)}.ih-who[data-c="regent"]{background-image:url(/img/ui/top_panel/character_icon_regent.webp)}
.ih-who[data-c="enemy"]{background-image:url(/img/ui/run_history/monster.webp)}   /* the Powers list: a power only enemies apply */
.pt-belt .ih-who{display:none}   /* the potion page's belt: one character's potions already */
/* THE WHOLE HOUSING IS THE HOVER UNIT (wave 5; Bean, 22 Sep 2026: "Whenever you are hovering within the housing of a relic, the relic itself needs to be counted as
   hovering on, you unhover when you leave said housing. Feels more as a unit not different things if we do this which is good."). core.js (pointermove) starts the icon's
   3D hover, the gem and the tip when the pointer is anywhere in .itemcell.housed and ends them when it leaves the tile; here the rim, the pedestal, the gem and the name
   answer the same three states (the tile hovered, keyboard focus, the icon holding .hov), and before app.js has attached, or on a static page before the bundle, the
   plain :hover on the tile already grows the icon the way icons3d.css grows it on its own :hover. */
.itemcell.housed:is(:hover,:focus-visible,:has(.hov)) .ih-slot{--ih-top:#d2e8ef;--ih-mid:#4f7380;--ih-glow:54%}
.itemcell.housed:is(:hover,:focus-visible,:has(.hov)) .nm{color:#fff}
.itemcell.housed:is(:hover,:focus-visible,:has(.hov)) .ih-who{opacity:1}
.itemcell.housed:hover .ih-slot>:is(.relic,.potion,.power):not(.hov):not(.settle){scale:var(--hov-scale)}
/* the playtest sticker (filters.css .itemcell.is-pt::after: size, art and tilt are set there) keeps its place on the icon's bottom right: its bottom right corner is pinned
   .8rem right of the icon and level with its foot (the icon's foot is 4.9rem + 2px under the tile's top in the square frame), so it stays there whatever size it is given */
.itemcell.housed.is-pt::after{left:calc(50% + 2.9rem);top:calc(4.98rem + 2px);translate:-100% -100%}
@media (prefers-reduced-motion:reduce){.ih-slot,.ih-gem{transition:none}.ih-gem::before{animation:none!important}.ih-gem::after{display:none!important}}

/* ===== app/timeline.css ===== */
/* ===== The Timeline (/epochs) and the epoch pages (/epochs/<id>): app/pages_potions.js (the EPOCHS block); docs/wave3/potions-epochs-modes.md, docs/wave4/wp3.md,
   docs/wave5/wp2.md; check tools/timeline_check.js =====
   Three parts, in this order (the list's rules adjust the shared ones, so they come after them):
   1. THE SHARED EPOCH RULES, moved here from potions.css in wave 5 (22 Sep 2026, WP2): the era glyph, the slot, the requirement icon and score bar, the unlocks as
      themselves (cards, relic and potion icons, the character portrait, the ancient / act / mode / event plates), the inspect screen's unlock line. The potion page's
      "Unlocked by" plate and the character page's history draw the slot from here (their own sizes stand in potions.css and character.css). The old milestone's rules
      (.ep, .ep-body, .ep-t, .ep-req, .ep-rt, .era-b: epMilestone, gone since wave 5) are not carried over.
   2. THE EPOCH PAGE: the hero, the SPAN GRID of the facts (.dp-facts.spg, also the /modes boxes), the "What it unlocks" banner and the pair of chapters under it.
   3. THE LIST, revamped 20 Sep 2026. Bean: "the user is forced to endlessly scroll, the "flourish" epoch navigator near the top is cutoff halfway on the right side,
      and there is no good way to navigate once you scroll down ... the navigator needs to look nicer and be pinned to the top while you scroll", "more concise and
      organized for the user".
      - .tl-nav   the era navigator: the timeline screen's line (3 px E6C97A, faded ends) with the five era glyphs on it, names in Bitter italic E6C97A, years in
                  86CEEB. Five EQUAL columns of the content width (never a scroller: nothing can be cut off), pinned under the top bar (z 20: over a hovered card's
                  6, under the phone drawer's 55, the top bar's 60 and the hover box's 80), the era in view lit (aria-current) and the line filled up to it (--tl-p).
      - .era      one dark panel per era (the .room recipe), its header one line: glyph, name, year and count.
      - .epr      ONE ROW PER EPOCH: slot thumb / the name over one requirement line / the unlocks as pictures only (since 22 Sep 2026, Bean's "show less").
                  Columns follow the panel's width (container epl), not the window's: the rail opens and closes beside it.
   Hover changes colour, opacity and transform only. */

/* ---------- 1. the shared epoch rules ---------- */
.tlpage .lead{max-width:70ch}
.era-g{display:block;flex:none;width:2.8rem;height:2.8rem;background:#ffcc66;-webkit-mask:var(--g) center/contain no-repeat;mask:var(--g) center/contain no-repeat;filter:drop-shadow(0 2px 0 rgba(0,0,0,.55))}
.era-g.sm{width:1.7rem;height:1.7rem}
/* the slot of the timeline screen: the 272x168 portrait in the slot_golden shape, the gold slot_outline pulsing on hover the way a revealable slot pulses */
.ep-slot{position:relative;display:block;width:10.2rem;aspect-ratio:272/168;border-radius:9px;background:#0d1a20 url(/img/timeline/ui/slot_golden.webp) center/100% 100% no-repeat;box-shadow:4px 4px 0 rgba(0,0,0,.28);transition:transform .5s cubic-bezier(.16,1,.3,1);-webkit-tap-highlight-color:transparent}
.ep-slot img{display:block;width:100%;height:100%;object-fit:cover;border-radius:9px}
.ep-ring{display:none;position:absolute;inset:-4% -3%;background:#f0c851;-webkit-mask:url(/img/timeline/ui/slot_outline.webp) center/100% 100% no-repeat;mask:url(/img/timeline/ui/slot_outline.webp) center/100% 100% no-repeat;pointer-events:none}
.ep-slot:hover,.ep-slot:focus-visible{transform:scale(1.06);transition-duration:.05s;z-index:2}
.ep-slot:hover .ep-ring,.ep-slot:focus-visible .ep-ring{display:block;animation:ep-pulse 1.26s ease-in-out infinite}
@keyframes ep-pulse{0%,100%{opacity:.25}50%{opacity:.75}}
.ep-slot.sm{width:7rem;box-shadow:3px 3px 0 rgba(0,0,0,.28)}
.ep-story{font-family:var(--font-i);font-style:italic;font-size:.95rem;color:#86ceeb}
/* the requirement's icon (the run summary's sign for what it counts, a character's head with the sign as a small badge) and the score bar itself: the list row's
   .sm sizes stand in part 3, the epoch page's requirement box draws the bar in the icon's place (part 2) */
.ep-ri{position:relative;flex:none;width:2.5rem;height:2.5rem}
.ep-ri img{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ep-ri .ep-rc{position:absolute;right:-.55rem;bottom:-.45rem;width:1.55rem;height:1.55rem;filter:drop-shadow(0 1px 1px rgba(0,0,0,.7))}
.ep-bar{position:relative;flex:none;width:7.4rem;height:1.55rem;border-radius:999px;background:rgba(0,0,0,.55);box-shadow:inset 0 2px 3px rgba(0,0,0,.6),0 0 0 1px rgba(230,201,122,.4);overflow:hidden}
.ep-bar i{position:absolute;left:0;top:0;bottom:0;width:var(--p);border-radius:999px;background:linear-gradient(#ffe08a,#c8962c);box-shadow:inset 0 -3px 0 rgba(0,0,0,.2)}
.ep-bar b{position:absolute;inset:0;display:grid;place-items:center;font-family:var(--font-t);font-size:.86rem;color:#fff6e2;text-shadow:0 1px 0 #000,0 0 3px #000}
/* what it unlocks: the things themselves */
.ep-un{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;padding:4px 0 0 2px}
.ep-un.pad{padding:4px var(--pad) 16px}
.ep-cards{display:flex;flex-wrap:wrap;gap:10px 8px;--cw:6.6rem;padding:4px 6px 6px 4px}
.ep-cards .card{flex:none}
.ep-ico{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-t);font-size:.95rem}
.ep-ico .relic,.ep-ico .potion{width:3.4rem;height:3.4rem}
.ep-ico.lg{gap:10px;font-size:1.05rem}
.ep-ico.lg .relic,.ep-ico.lg .potion{width:4.4rem;height:4.4rem}
.ep-ico>a:last-child{color:var(--gold-x)}
.ep-item{display:inline-flex;align-items:center;gap:9px;padding:4px 13px 4px 5px;border-radius:9px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.1);color:var(--text);font-family:var(--font-t);font-size:.98rem;line-height:1.15;text-decoration:none;transition:border-color .15s,transform .5s cubic-bezier(.16,1,.3,1)}
.ep-item img{width:2.5rem;height:2.5rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.ep-item span{display:flex;flex-direction:column;gap:1px}
.ep-item small{font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}
.ep-item:hover,.ep-item:focus-visible{border-color:var(--gold);color:#fff;text-decoration:none;transform:scale(1.04);transition-duration:.05s}
.ep-mode img{width:3.8rem;height:auto;aspect-ratio:380/288;object-fit:cover;border-radius:4px;box-sizing:border-box;border:1.5px solid #f4d2a9;filter:none}
.ep-ev img{width:3.8rem;height:2.6rem;object-fit:cover;border-radius:4px;filter:none}
.ep-anc img{border-radius:50%;filter:none}
/* a character unlock: the select screen's portrait in its mask and ring (filters.css draws the same for the pool picker) */
.ep-char{--c:var(--gold);display:inline-flex;flex-direction:column;align-items:center;gap:5px;color:var(--text);font-family:var(--font-t);font-size:.9rem;text-decoration:none}
.ep-char-p{position:relative;display:block;width:3.6rem;aspect-ratio:88/130;isolation:isolate;transition:scale .5s cubic-bezier(.16,1,.3,1)}
.ep-char-p::before{content:"";position:absolute;inset:-3.5% -8.5%;z-index:-1;background:var(--c);opacity:.95;-webkit-mask:url(/img/packed/character_select/char_select_outline.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_outline.webp) center/100% 100% no-repeat;pointer-events:none}
.ep-char-p i{display:block;width:100%;height:100%;background:#22343c center/cover no-repeat;-webkit-mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat;mask:url(/img/packed/character_select/char_select_button_mask.webp) center/100% 100% no-repeat}
.ep-char[data-c="ironclad"]{--c:var(--ironclad)}.ep-char[data-c="ironclad"] .ep-char-p i{background-image:url(/img/packed/character_select/char_select_ironclad.webp)}
.ep-char[data-c="silent"]{--c:var(--silent)}.ep-char[data-c="silent"] .ep-char-p i{background-image:url(/img/packed/character_select/char_select_silent.webp)}
.ep-char[data-c="defect"]{--c:var(--defect)}.ep-char[data-c="defect"] .ep-char-p i{background-image:url(/img/packed/character_select/char_select_defect.webp)}
.ep-char[data-c="necrobinder"]{--c:var(--necrobinder)}.ep-char[data-c="necrobinder"] .ep-char-p i{background-image:url(/img/packed/character_select/char_select_necrobinder.webp)}
.ep-char[data-c="regent"]{--c:var(--regent)}.ep-char[data-c="regent"] .ep-char-p i{background-image:url(/img/packed/character_select/char_select_regent.webp)}
.ep-char.lg{font-size:1.02rem}.ep-char.lg .ep-char-p{width:5rem}
.ep-char:hover,.ep-char:focus-visible{text-decoration:none;color:#fff}
.ep-char:hover .ep-char-p,.ep-char:focus-visible .ep-char-p{scale:1.06;transition-duration:.05s}
/* the inspect screen's unlock line: the unlock icon, cream text */
.ep-quote{display:flex;align-items:flex-start;gap:9px;margin:10px 0 0;font-size:1rem;line-height:1.4;color:#e8dcbe}
.ep-quote img{flex:none;width:1.6rem;height:1.6rem;margin-top:1px;object-fit:contain}
.ep-quote span{opacity:.9}
@media (prefers-reduced-motion:reduce){
  .ep-slot:hover .ep-ring,.ep-slot:focus-visible .ep-ring{animation:none;opacity:.6}
}

/* ---------- 2. the epoch page ---------- */
.ep-show{gap:12px}
.ep-card{position:relative;width:min(21rem,100%);aspect-ratio:324/200;border-radius:14px;box-shadow:8px 8px 0 rgba(0,0,0,.25);isolation:isolate;background:#0d1a20 url(/img/timeline/ui/slot_golden.webp) center/100% 100% no-repeat}
.ep-card img{display:block;width:100%;height:100%;object-fit:cover;border-radius:14px}
.ep-card .a3d-t{border-radius:14px}
.ep-glow{position:absolute;inset:-4% -3%;z-index:-1;background:#2de5ff;opacity:.5;-webkit-mask:url(/img/timeline/ui/slot_outline.webp) center/100% 100% no-repeat;mask:url(/img/timeline/ui/slot_outline.webp) center/100% 100% no-repeat;pointer-events:none}
/* THE HERO, NO EMPTY BAND (wave 4, overview audit TL3). The portrait column is as wide as the portrait: it was the shared `auto` track, which the 810 px picture
   blew up to about 700 px, squeezing the story into 18rem and leaving 190 px of nothing under the picture. The story, the game's unlock line and the chapter arrows
   stand beside the portrait, the panel takes the row's height with the picture in its middle, the arrows sit on the column's floor, and the facts are one row under both. */
.eppage .ep-hero{grid-template-columns:calc(21rem + 38px) minmax(0,1fr);align-items:stretch}
.eppage .ep-hero .showcase{justify-content:center;min-width:0}
.eppage .ep-hero .infocol{display:flex;flex-direction:column;max-width:none}
.eppage .ep-hero .gametext{margin-bottom:6px}
.eppage .infocol h1{margin-top:0}
@media (max-width:760px){.eppage .ep-hero{grid-template-columns:minmax(0,1fr)}}
/* a long story in a narrow column stood 550 px tall beside a 200 px portrait (39 of the 55 pages at a 1000 px window had over 140 px of bare panel around the picture):
   under 50rem of room the hero is one column, the portrait over the title and the story at full width. Measured on the hero's own wrapper (.ep-herow), so a folded
   side menu counts */
.ep-herow{container:ephero/inline-size}
@container ephero (max-width:50rem){.eppage .ep-hero{grid-template-columns:minmax(0,1fr)}}
/* THE FACTS ARE THE ENEMY PAGE'S BOXES (the wave's design law; pages_potions.js epFacts builds them with pages_acts.js factBox / factRow, the look is enemyturns.css
   .ew-fact, untouched) ON THE SPAN GRID (wave 5, 22 Sep 2026, WP2; overview audit EU1 / EU2 / MO1: "Play a single run with all charact...", "Tales from t...",
   "Up to your high..." were cut, with no hover to read them). The markup is the detail pages' factGrid (detailpage.css .dp-factwrap, container dpf, .dp-facts,
   .dp-cell) on 24 columns instead of 12, and every cell carries its own span for each of eight ranges of the block's width, six rem apart (--e1 under 28rem, --e2
   from 28rem, --e3 from 34rem ... --e8 from 64rem), computed by pages_potions.js epFactGrid from the value's text: a box is as wide as its value needs and a row
   always adds up to 24, so no value is ever cut and the rows are even. The value is two to four words; its whole sentence is the hover (factbox.css: the small text
   hides, the "i" mark shows). Sized by the block's own width (a container), not the window's: the rail opens and closes beside it. */
.dp-facts.spg{grid-template-columns:repeat(24,minmax(0,1fr))}
.dp-facts.spg>.dp-cell{grid-column:span var(--e1,24)}
@container dpf (min-width:28rem){.dp-facts.spg>.dp-cell{grid-column:span var(--e2,24)}}
@container dpf (min-width:34rem){.dp-facts.spg>.dp-cell{grid-column:span var(--e3,24)}}
@container dpf (min-width:40rem){.dp-facts.spg>.dp-cell{grid-column:span var(--e4,24)}}
@container dpf (min-width:46rem){.dp-facts.spg>.dp-cell{grid-column:span var(--e5,24)}}
@container dpf (min-width:52rem){.dp-facts.spg>.dp-cell{grid-column:span var(--e6,24)}}
@container dpf (min-width:58rem){.dp-facts.spg>.dp-cell{grid-column:span var(--e7,24)}}
@container dpf (min-width:64rem){.dp-facts.spg>.dp-cell{grid-column:span var(--e8,24)}}
.dp-facts.spg .ew-fact-row{flex:1}   /* the boxes of a row share one height: icon and value stand in the middle of what is left under the label */
.eppage .dp-factwrap.ep-factsw{margin:var(--stack) 0 0}
/* the score bar stands where the icon stands (it is wider than the icon cell) */
.ep-facts .ew-fact-i:has(>.ep-bar){width:auto;height:auto}
/* a requirement that names a character: the head is the 3D icon, what it counts is a small badge on its corner (48 px sprites stay under their own size there) */
.ep-facts .ew-fact-i{position:relative}
.ep-fbadge{position:absolute;right:-.5rem;bottom:-.35rem;width:1.4rem;height:1.4rem;object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.75));pointer-events:none}
.ep-facts .ew-fact-i:has(>.ep-fbadge){margin-right:.3rem}
/* the era's glyph is a white sprite that the game tints FFCC66 (timeline_screen); as a 3D icon it is an <img>, so the tint is a filter (white to the same gold, the black outline stays) */
.ew-fact-3d .mi.ep-gly{filter:brightness(.86) sepia(1) saturate(2.6) hue-rotate(-14deg) drop-shadow(0 2px 1px rgba(0,0,0,.6))}
/* a tall sprite stays inside its icon slot: a square box with the sprite contained in it; a square sprite is unchanged (modes.css has the same for /modes) */
.eppage .ew-fact-i .ew-fact-3d .mi{aspect-ratio:1;object-fit:contain}
/* THE BANNER AND THE PAIR (wave 5, overview audit EU3 / EU4). The section banner "What it unlocks" (banner.js secBanner, banner.css; the run summary's discovery
   sign in its socket, the tagline counts the things) is the divider between the hero and the fine detail (Bean, 22 Sep 2026: "to begin fine detail we always need
   that one section as a divider that feels more solid"). Under it the things themselves in their own chapter body (no second heading: the banner is the heading),
   then "How to unlock it". When the unlocks are few (three things or fewer, at most two cards) and the writer's note about them is short, the two chapters stand
   side by side (the audit's "60% of its row empty"; Bean's "stack 2 per row when minimal info") and the note prints inline under the things instead of behind a fold;
   the pair is one column under 52rem of its own width (a 1000 px window's column is 46rem: one column there, two at 1345). Otherwise the things stand alone on
   their row and the how under them at full width; the note is not shown there (no fold: see below).
   THE THINGS SIT WITH THE SAME ROOM ON EVERY SIDE (wave 5, 22 Sep 2026; Bean, on a three-card page: "what is this spacing here under what it unlocks. Like there
   is so much space to the left, barely any space above the cards between the cards and the top of the box, and way too much space below the cards before 'about
   these unlocks'. Remove 'about these unlocks' please"). The body had the shelf's chapter padding (shelf.css .chap>.shelf: 10 px of room above the cards, pad + 10
   at the left, 36 below) and the fold's row under that. Now the body is one padded box (var(--pad) on every side, 12 to 18 px by width) holding its groups 14 px
   apart; a card shelf keeps 12 px of pop room as padding taken back by a negative margin (a scrolling shelf clips at its padding box; a shelf that fits does not
   clip at all), so the cards' own edges stand var(--pad) from the box on all four sides; the icon and portrait groups carry no padding of their own. The fold
   "About these unlocks" is gone (pages_potions.js epDetail); the paragraph still prints inline under the things in the pair, where it fills the plate. */
.eppage .secban.sb-unl+.ep-unl,.eppage .secban.sb-unl+.ep-pair{margin-top:calc(var(--stack) - 4px)}
.eppage .ep-unl{display:flex;flex-direction:column;gap:14px;padding:var(--pad)}
.eppage .ep-unl>.shelf{padding:12px;margin:-12px;scroll-padding-inline:12px;--sb-l:12px;--sb-r:12px}
.eppage .ep-unl>.ep-icons,.eppage .ep-unl>.ep-un.pad{padding:0}
.eppage .ep-unl>.ep-about-in{padding:0;max-width:78ch;font-size:1rem;line-height:1.5;color:var(--text)}
.eppage .ep-unl>.ep-about-in p{margin:.35rem 0 0}
.eppage .ep-unl>.ep-about-in p:first-child{margin-top:0}
.ep-pair{container:eppair/inline-size;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap);align-items:start;margin-top:var(--stack)}
.ep-pair>.chap{margin-top:0;min-width:0}
/* (the pair is its own container, so its children are what the query moves: a container query never matches the container itself) */
@container eppair (max-width:52rem){.ep-pair>.chap{grid-column:1/-1}.ep-pair>.chap+.chap{margin-top:calc(var(--stack) - var(--gap))}}
/* the chapter arrows on the hero's floor */
.ep-nav{display:flex;justify-content:space-between;gap:12px;margin:auto 0 0;padding-top:14px}
.ep-nav a{display:inline-flex;align-items:center;gap:8px;max-width:48%;padding:6px 10px;border-radius:9px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);color:var(--text);font-family:var(--font-t);line-height:1.15;text-decoration:none;transition:border-color .15s}
.ep-nav a span{display:flex;flex-direction:column;min-width:0}
.ep-nav a small{font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}
.ep-nav a i{flex:none;width:1.8rem;height:1.8rem;background:center/contain no-repeat;filter:drop-shadow(0 1px 1px rgba(0,0,0,.6));transition:translate .5s cubic-bezier(.16,1,.3,1)}
.ep-nav .ep-prev i{background-image:url(/img/ui/settings_tiny_left_arrow.webp)}   /* (0,2,1): the shorthand background on .ep-nav a i (0,1,2) would reset the image otherwise */
.ep-next{text-align:right}.ep-nav .ep-next i{background-image:url(/img/ui/settings_tiny_right_arrow.webp)}
.ep-nav a:hover{border-color:var(--gold);color:#fff}
.ep-prev:hover i{translate:-3px 0;transition-duration:.05s}.ep-next:hover i{translate:3px 0;transition-duration:.05s}
/* "Also unlocks" icons and the "Timeline expands" slots */
.ep-icons{display:flex;flex-wrap:wrap;gap:12px 20px;padding:6px var(--pad) 18px}
.ep-expand{padding:6px var(--pad) 16px}
.ep-slots{display:flex;flex-wrap:wrap;gap:12px 16px}
.ep-slotw{display:inline-flex;flex-direction:column;align-items:center;gap:6px;width:7rem;text-align:center;font-family:var(--font-t);font-size:.9rem;line-height:1.15}
.ep-slotw>a:last-child{color:var(--gold-x)}
@media (max-width:640px){
  .ep-nav{flex-direction:column}.ep-nav a{max-width:none}.ep-next{justify-content:flex-end}
}

/* ---------- 3. the list ---------- */
.tllist{--tln-h:5rem}
.tllist .leadmore{margin-bottom:10px}
/* the lead and its fold: the daily hub's expander (daily.js rulesFoldHtml, dailyhub.css), the button on the lead's own line at its far right (Bean, 21 Sep 2026:
   "Let's move it to the far right and have it on the same line as the explanatory text ... doesn't need its own space"). Only the lead's type and the panel's measure are set here */
.rf-wrap.tl-lead{margin:0 0 10px}
.tl-lead>p{max-width:66ch;color:var(--muted);font-size:1.06rem;line-height:2.5rem}
.tl-lead .rf-body{max-width:82ch;color:var(--text)}
.tl-lead .rf-body>:last-child{margin-bottom:10px}
@media (max-width:640px){.tl-lead>p{line-height:1.5}}

/* ---------- the chips (app/filters.js look; two light groups, folded behind "Filters" on a phone) ---------- */
.tl-filt .ffine.toolbar{margin-bottom:8px}
.tl-filt .fhead.toolbar{min-height:2.2rem;margin-bottom:12px;padding-bottom:6px}
.fgrp-tlun .fchip-i,.fgrp-tlch .fchip-i{width:1.2rem;height:1.2rem;opacity:.85}
.fgrp-tlun .fchip[data-v="cards"] .fchip-i{background-image:url(/img/ui/game_over_screen/discovery_card.webp)}
.fgrp-tlun .fchip[data-v="relics"] .fchip-i{background-image:url(/img/ui/game_over_screen/discovery_relic.webp)}
.fgrp-tlun .fchip[data-v="potions"] .fchip-i{background-image:url(/img/ui/game_over_screen/discovery_potion.webp)}
.fgrp-tlun .fchip[data-v="chars"] .fchip-i{background-image:url(/img/packed/character_select/char_select_player_icon.webp)}
.fgrp-tlun .fchip[data-v="other"] .fchip-i{background-image:url(/img/packed/unlock_icon.webp)}
/* A SELECTED CHIP TAKES THE COLOUR OF WHAT IT MEANS (Bean, 21 Sep 2026: "when selected should be relevant to their color"; the filters stream's hook: a chip's --rc feeds
   --fc, filters.css .fchip.on, and the removable tag copies it). The "Play as" chips already take their character's colour there. The "Unlocks" chips take their own
   icon's colour, sampled from the run summary's discovery sprites: the card pack's orange, the chest's gold, the potion's green. Characters and Other have white icons
   and keep the neutral steel. Each colour is one the chip's own icon already shows. */
.fgrp-tlun .fchip[data-v="cards"]{--rc:#e8893d}
.fgrp-tlun .fchip[data-v="relics"]{--rc:#f8c858}
.fgrp-tlun .fchip[data-v="potions"]{--rc:#2fae78}
.fgrp-tlch .fchip[data-v="ironclad"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_ironclad.webp)}
.fgrp-tlch .fchip[data-v="silent"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_silent.webp)}
.fgrp-tlch .fchip[data-v="defect"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_defect.webp)}
.fgrp-tlch .fchip[data-v="necrobinder"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_necrobinder.webp)}
.fgrp-tlch .fchip[data-v="regent"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_regent.webp)}
.fgrp-tlch .fchip[data-v="any"] .fchip-i{background-image:url(/img/ui/top_panel/character_icon_random_character.webp)}
/* both chip groups share ONE line where the character chips can be the top panel's heads alone (a content column of 900 to 1239 px: the pane at about 1200 to
   1600 px). Narrower, the groups take a line each and the names fit; wider, both fit with their names. The name stays in the button for a screen reader and is
   its title. */
.tl-filt{container:tlfilt/inline-size}
@container tlfilt (min-width:900px) and (max-width:1239px){.fgrp-tlch .fchip{padding:3px 8px;gap:0}.fgrp-tlch .fchip-i{width:1.55rem;height:1.55rem;opacity:.8}
  .fgrp-tlch .fchip span{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.fgrp-tlch .fchip{position:relative}
  .tl-filt .fgroups{flex-wrap:nowrap}}
.tl-empty{margin:0 0 var(--stack)}

/* ---------- the navigator ---------- */
.tl-nav{--tl-c:1.05rem;position:relative;z-index:20;margin:0 0 var(--stack);border:2px solid var(--line);border-radius:12px;background:linear-gradient(#17282f,#111e24);box-shadow:0 5px 0 rgba(0,0,0,.42),inset 0 1px 0 rgba(255,255,255,.06);container:tlnav/inline-size}
@media (min-height:560px){.tl-nav{position:sticky;top:calc(var(--tb-h) - 5px)}}
.tl-in{position:relative;display:grid;grid-template-columns:repeat(var(--n,5),minmax(0,1fr));padding:8px 4px 7px}
/* the line runs through the glyph centres: dim for the years ahead, bright up to the era in view */
.tl-line{position:absolute;left:0;right:0;top:calc(8px + var(--tl-c) - 1.5px);height:3px;border-radius:2px;background:linear-gradient(90deg,transparent,#e6c97a 48px,#e6c97a calc(100% - 48px),transparent);opacity:.3;pointer-events:none}
.tl-in::before{content:"";position:absolute;left:0;right:0;top:calc(8px + var(--tl-c) - 1.5px);height:3px;border-radius:2px;background:linear-gradient(90deg,transparent,#ffd98a 48px,#ffd98a calc(100% - 48px),transparent);box-shadow:0 0 8px rgba(255,204,102,.35);clip-path:inset(-10px calc((1 - var(--tl-p,0)) * 100%) -10px 0);transition:clip-path .45s cubic-bezier(.6,0,.4,1);pointer-events:none}
.tl-era{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;min-width:0;padding:0 2px;border-radius:9px;color:var(--text);text-align:center;text-decoration:none;-webkit-tap-highlight-color:transparent}
.tl-era:hover,.tl-era:focus-visible{text-decoration:none}
.tl-era:focus-visible{outline:2px solid var(--teal);outline-offset:1px}
.tl-g{display:block;flex:none;width:calc(var(--tl-c) * 2);height:calc(var(--tl-c) * 2);margin-bottom:2px;background:#c8a24e;-webkit-mask:var(--g) center/contain no-repeat;mask:var(--g) center/contain no-repeat;filter:drop-shadow(0 2px 0 rgba(0,0,0,.6));transition:scale .5s cubic-bezier(.16,1,.3,1),background-color .25s}
.tl-era b{max-width:100%;overflow:hidden;text-overflow:clip;white-space:nowrap;font-family:var(--font-i);font-style:italic;font-weight:500;font-size:clamp(.7rem,3.25cqw,1.1rem);line-height:1.15;color:#e6c97a;text-shadow:2px 2px 0 rgba(0,0,0,.5);transition:color .25s}
.tl-sub{display:flex;flex-wrap:wrap;justify-content:center;gap:0 .45em;max-width:100%;font-family:var(--font-t);font-size:clamp(.62rem,1.55cqw,.78rem);line-height:1.2;color:var(--dim);white-space:nowrap}
.tl-y{font-family:var(--font-i);font-style:italic;color:#86ceeb}
.tl-era:hover .tl-g,.tl-era:focus-visible .tl-g{scale:1.15;transition-duration:.05s;background:#ffe3a6}
.tl-era:hover b{color:#fff3cf}
/* the era in view: the glyph lights, the name turns cream, a gold bar sits on the box's bottom edge */
.tl-era::after{content:"";position:absolute;left:22%;right:22%;bottom:-9px;height:3px;border-radius:2px 2px 0 0;background:var(--gold);opacity:0;transition:opacity .25s;pointer-events:none}
.tl-era[aria-current] .tl-g{background:#ffedc2;scale:1.2;filter:drop-shadow(0 0 5px rgba(255,204,102,.85)) drop-shadow(0 2px 0 rgba(0,0,0,.6))}
.tl-era[aria-current] b{color:#fff3cf}
.tl-era[aria-current]::after{opacity:1}
.tl-era.off{opacity:.3;pointer-events:none}
.tl-era.off::after{opacity:0}
@container tlnav (max-width:640px){.tl-n{display:none}}
@container tlnav (max-width:460px){.tl-in{padding:6px 2px 5px}.tl-line,.tl-in::before{top:calc(6px + var(--tl-c) - 1.5px)}.tl-era{padding:0}.tl-era::after{bottom:-7px}.tl-era b{text-shadow:1px 1px 0 rgba(0,0,0,.5)}}
@media (max-width:640px){.tl-nav{--tl-c:.82rem;border-radius:10px}.tllist{--tln-h:3.9rem}}

/* ---------- an era: one panel, its header one line ---------- */
/* THE LIST BREATHES (wave 5, 22 Sep 2026, WP2; Bean: "TImeline and unlocks page is overbearing with info, space it out more ans show less for each thing"): the eras
   stand 1.5 stacks apart (was one stack less 2 px), an era's header has more room, and the rows below (.epr) are taller with air between them */
.tl-eras{display:flex;flex-direction:column;gap:calc(var(--stack) * 1.5)}
.era{position:relative;min-width:0;scroll-margin-top:calc(var(--tb-h) + var(--tln-h,5rem) + 8px);outline:none;border:2px solid var(--line);border-radius:12px;background:linear-gradient(rgba(23,40,47,.94),rgba(17,30,36,.96));box-shadow:0 6px 0 rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.06)}
.era[hidden],.epr[hidden]{display:none}
.era-h{display:flex;flex-wrap:wrap;align-items:center;gap:2px 12px;padding:12px 18px 10px;border-bottom:1px solid rgba(230,201,122,.3)}
.era-h .era-g{width:2.1rem;height:2.1rem}
.era-h h2{margin:0;font-family:var(--font-i);font-style:italic;font-weight:500;font-size:1.45rem;line-height:1.1;color:#e6c97a;text-shadow:3px 2px 0 rgba(0,0,0,.5)}
.era-y{display:inline-flex;align-items:baseline;gap:14px;font-family:var(--font-i);font-style:italic;font-size:.95rem;color:#86ceeb}   /* the year and the count stand 14 px apart, no dot between them (Bean, 22 Sep 2026: "these texts are all a little too close to each other, remove the dot, add space inbetween") */
.era-n{font-family:var(--font-t);font-style:normal;color:var(--dim)}

/* ---------- the ledger: one row per epoch ---------- */
/* A ROW IS THE PORTRAIT, THE NAME, ONE LINE AND THE PICTURES OF WHAT IT UNLOCKS (wave 5, WP2; pages_potions.js epRow, the comment there quotes Bean). The row was
   thumb 5rem / title + story chapter over the requirement with its fine print / the unlocks with their names, 7 px of padding and a hairline: dense. Now a 6rem
   thumb, the name, the requirement on its one line, and the unlocks as small pictures only (the real card at icon size, the directories' housing round a relic,
   potion, ancient, act or Ascension sign, a character's portrait, a mode's painting, an event's art), 12 px of padding, 6 px between rows, the hairline kept.
   Hover changes colour, scale and translate only (the housing's rim and gem, the icon's 3D tilt, the card's scale): nothing reflows. */
.epl{container:epl/inline-size;padding:8px 12px 12px}
.epr{position:relative;display:grid;grid-template-columns:6rem minmax(0,1fr) minmax(0,1.05fr);align-items:center;gap:4px 20px;padding:12px 10px;border-radius:10px;box-shadow:inset 0 -1px 0 rgba(255,255,255,.06);scroll-margin-top:calc(var(--tb-h) + var(--tln-h,5rem) + 8px);transition:background-color .15s}
.epr+.epr{margin-top:6px}
.epr:last-child{box-shadow:none}
.epr:hover{background-color:rgba(255,255,255,.035)}
.ep-slot.xs{width:6rem;border-radius:7px;box-shadow:3px 3px 0 rgba(0,0,0,.3)}
.ep-slot.xs img{border-radius:7px}
.epr-m{min-width:0}
.epr-m h3{margin:0;font-size:1.22rem;line-height:1.2}
.epr-m h3 a{color:var(--gold-x)}
.epr-m h3 a:hover{color:#fff;text-decoration:none}
.epr-q{display:flex;align-items:center;gap:9px;min-width:0;margin-top:6px}
.ep-ri.sm{width:1.45rem;height:1.45rem}
.ep-ri.sm .ep-rc{right:-.5rem;bottom:-.3rem;width:1.05rem;height:1.05rem}
.epr-q .ep-ri.sm:has(.ep-rc){margin-right:.35rem}
.ep-bar.sm{width:4.3rem;height:1.12rem}
.ep-bar.sm b{font-size:.74rem;letter-spacing:.01em;paint-order:stroke fill;-webkit-text-stroke:2px rgba(0,0,0,.8)}   /* the number stays readable where the gold fill runs under it (1,250 on a half-full bar) */
.epr-qt{min-width:0;font-size:.92rem;line-height:1.25}
.epr-qt b{font-family:var(--font-t);font-weight:700;color:#fff6e2}
/* the unlocks: pictures only, one height, a name on hover */
.epr-u{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;min-width:0}
.epu{display:inline-flex;flex:none;align-items:center;gap:6px}
.epu .card{--cw:2.4rem}
.card.epmc{cursor:pointer}
.card.epmc.hov,.card.epmc:focus-visible{scale:1.22}
/* the directories' housing at row size (tilehousing.css .ih-slot: 5.6rem with 15 px cuts on a directory; here 2.9rem with 8 px cuts, the icon at 2.2rem, the gem
   and the character head scaled with it). The link is the housing's hover: its rim lights and the gem shines the way a directory tile's do */
.epu-h{display:inline-flex;flex:none;text-decoration:none;--rc:#7d8b91}
.epu-h .ih-slot{--cut:8px;width:2.9rem;height:2.9rem;padding-top:2px;box-shadow:0 5px 6px -8px rgba(0,0,0,.8)}
.epu-h .ih-slot::after{inset:2px;--cut:6.5px}
.epu-h .ih-slot>:is(.relic,.potion){width:2.2rem;height:2.2rem}
.epu-h .ih-slot>.epu-pic{width:1.9rem;height:1.9rem;object-fit:contain;filter:drop-shadow(0 2px 2px rgba(0,0,0,.6))}
.epu-h.k-anc .ih-slot>.epu-pic{border-radius:50%}
.epu-h .ih-gem{width:.5rem;height:.5rem;bottom:-.25rem}
.epu-h .ih-who{left:2px;top:2px;width:.9rem;height:.9rem}
/* the link is the hover unit on the row (core.js gives a [data-tip] link .hov; a relic or potion icon inside gets its own .hov, tilt and tip when the pointer is on it):
   the rim lights, the head icon wakes, the gem lights the way a directory tile's does (tilehousing.css; the loops only when the icon itself holds .hov) */
.epu-h:is(:hover,:focus-visible,.hov) .ih-slot{--ih-top:#d2e8ef;--ih-mid:#4f7380;--ih-glow:54%}
.epu-h:is(:hover,:focus-visible,.hov) .ih-who{opacity:1}
.epu-h:is(:hover,:focus-visible,.hov) .ih-gem{scale:var(--gem-hov);background:radial-gradient(circle closest-side,color-mix(in srgb,var(--rc) 70%,#fff),var(--rc) 42%,color-mix(in srgb,var(--rc) 38%,#000) 118%);
  box-shadow:0 0 0 1.5px #0a1216,-.5px -.5px 3px 1px color-mix(in srgb,var(--rc) 70%,#fff),-2px -2px 8px 2px color-mix(in srgb,var(--rc) 80%,transparent),inset 1px 1px 0 rgba(255,255,255,.5)}
/* a character's select portrait alone (its mask and ring are the shared .ep-char rules above); a mode's painting; an event's art */
.ep-char.ico .ep-char-p{width:2.2rem}
.epu-mode,.epu-ev{display:inline-flex;flex:none;border-radius:5px;transition:transform .5s cubic-bezier(.16,1,.3,1)}
.epu-mode .epu-pic{display:block;width:3.7rem;height:auto;aspect-ratio:380/288;object-fit:cover;border-radius:5px;box-sizing:border-box;border:1.5px solid #f4d2a9;box-shadow:0 2px 0 rgba(0,0,0,.45)}
.epu-ev .epu-pic{display:block;width:4rem;height:2.7rem;object-fit:cover;object-position:36% 55%;border-radius:5px;box-shadow:0 2px 0 rgba(0,0,0,.45),0 0 0 1px rgba(255,255,255,.12);filter:brightness(1.3)}   /* the three event arts are dark 1400x658 scenes with their subject a third in from the left: the thumb is cut around it and lifted a little */
.epu-mode:is(:hover,:focus-visible),.epu-ev:is(:hover,:focus-visible){transform:scale(1.06);transition-duration:.05s}
/* QoL (wave 6, 23 Sep 2026): a keyboard stop on the row shows the site's focus ring (style.css :focus-visible, 3 px white): the rim light and the 6 % scale alone
   were too faint to follow with Tab. On a touch screen every picture is at least 40 px across: the card at icon size grows to 2.75rem (41 px at the phone's
   15 px root), the portrait gets 4 px of room each side; the name's link reaches 40 px tall without moving a line (padding taken back by the margin), all of it
   ABOVE the name: grown both ways it lay over the links of the requirement line under it (measured: "Scribbles" took the clicks on "Neow"); above it there is the
   row's own padding and the gap between rows (26 px at 390), no link. */
.epr-m h3 a{display:inline-block;padding-top:calc(40px - 1.2em);margin-top:calc(1.2em - 40px)}
@media (hover:none) and (pointer:coarse){.epu .card{--cw:2.75rem}.epr .ep-char.ico{padding:0 4px}.epr-m h3 a{min-width:40px}}   /* the shortest names were 15 to 39 px wide; 40 px to a finger */
/* the same on an epoch page: the name under a slot (16 px tall), the name beside a housed relic or potion (23 px) and the fact links (Era, Unlocked by: 23 px) reach
   40 px on a touch screen, the padding taken back by the margin so no line moves; each name goes where its picture goes */
@media (hover:none) and (pointer:coarse){.eppage .ep-slotw>a:last-child{padding-block:12px;margin-block:-12px}.eppage .ep-ico>a:last-child,.eppage .ew-fact-t>b>a{display:inline-block;padding-block:9px;margin-block:-9px}}
/* narrower panels: the pictures (at most four things, 212 px measured) keep their column down to a 520 px panel; on a phone they go under the words, beside the thumb */
@container epl (max-width:900px){.epr{grid-template-columns:6rem minmax(0,1fr) minmax(0,16rem);gap:4px 16px}}
@container epl (max-width:680px){.epr{grid-template-columns:5.4rem minmax(0,1fr) minmax(0,15rem);gap:4px 14px}.ep-slot.xs{width:5.4rem}}
@container epl (max-width:520px){.epr{grid-template-columns:4.6rem minmax(0,1fr);gap:8px 12px;padding:10px 4px;align-items:start}.ep-slot.xs{width:4.6rem}.epr-u{grid-column:2}.epr-m h3{font-size:1.1rem}.epl{padding:6px 8px 10px}}
@media (max-width:640px){.era-h{padding:9px 12px 8px}.era-h h2{font-size:1.3rem}}
@media (prefers-reduced-motion:reduce){.tl-in::before,.tl-g,.tl-era b,.tl-era::after{transition:none}}

/* ===== app/tipbox.css ===== */
/* ===== the hover pop-up of a linked item (wave 5, 22 Sep 2026; CORE stream; markup core.js tpPlate / tipHtml / factTipHtml; docs/wave5/core.md 1b) =====
   Bean: "on hover the card should pop up so you can see it quickly if you want. This goes for all pages where small things like relics, powers, potions, enemies, events,
   or characters are shown. A little box showing said thing popping up looking cool would be great, if its a card/enemy/act no need to show text because we can read it,
   if its a relic, potion, power, then show text above it that says what it does."
   The plate is the site's box language (the fact box's dark gradient, the tile housing's rarity colour): a 2 px rim in the item's rarity colour --rc, a hard ledge under
   it, a lit top edge, a colour stripe down the left; inside: the kind in small caps, the name in the game's tip gold, the rules text, then the picture. A relic, potion or
   power stands in the directory's housed slot (tilehousing.css .ih-slot: rim, well, pedestal glow, gem) under its text; a card IS the card (cardHtml at 10.5rem); an enemy,
   character, ancient or epoch is its still; an act or an event its painting. A game term, a power named on a card and a note are the term plate (.tp-line, below; the
   game's nine-slice, style.css .tipbox, is no tip any more: Bean, 22 Sep 2026, "All tool tips should be styled like that"). The pop-up arrives with a short rise
   (160 ms) and none under reduced motion. #tip is pointer-events:none, so nothing inside is ever a target. */
.tipwrap.tp{gap:6px}
.tip .tp-plate{--rc:#7d8b91;position:relative;border:0;border-image:none;border-radius:12px;padding:0 0 0 4px;overflow:hidden;color:#f3ead9;font-family:var(--font-b);font-size:.95rem;line-height:1.35;
  background:linear-gradient(rgba(25,43,51,.985),rgba(14,25,31,.99));
  box-shadow:0 0 0 2px color-mix(in srgb,var(--rc) 48%,#243c46),0 5px 0 rgba(0,0,0,.55),0 10px 22px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.09)}
.tip .tp-plate::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(color-mix(in srgb,var(--rc) 80%,#fff),var(--rc) 40%,color-mix(in srgb,var(--rc) 70%,#000))}
/* the rarity colours are the tile housing's (tilehousing.css), so tip, tile and filter chip agree */
.tip .tp-plate[data-rar="basic"]{--rc:var(--r-basic)}.tip .tp-plate[data-rar="common"]{--rc:var(--r-common)}.tip .tp-plate[data-rar="uncommon"]{--rc:var(--r-uncommon)}.tip .tp-plate[data-rar="rare"]{--rc:var(--r-rare)}
.tip .tp-plate[data-rar="ancient"]{--rc:var(--r-ancient)}.tip .tp-plate[data-rar="shop"]{--rc:var(--gold-d)}.tip .tp-plate[data-rar="event"]{--rc:var(--green-d)}.tip .tp-plate[data-rar="special"]{--rc:#ee82ee}
.tip .tp-plate[data-rar="buff"]{--rc:#8fd96b}.tip .tp-plate[data-rar="debuff"]{--rc:var(--red)}
.tip .tp-plate[data-rar="boss"]{--rc:#c4382e}.tip .tp-plate[data-rar="elite"]{--rc:#b04ac0}
.tip .tp-plate[data-rar="ironclad"]{--rc:var(--ironclad)}.tip .tp-plate[data-rar="silent"]{--rc:var(--silent)}.tip .tp-plate[data-rar="defect"]{--rc:var(--defect)}.tip .tp-plate[data-rar="necrobinder"]{--rc:var(--necrobinder)}.tip .tp-plate[data-rar="regent"]{--rc:var(--regent)}
.tip .tp-fact{--rc:var(--gold-d)}
/* the head: kind (small caps, in the rarity colour), an optional short line, the name in the game's tip gold */
.tp-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 8px;padding:9px 13px 0 12px}
.tp-kind{font-family:var(--font-t);font-size:.66rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;line-height:1;color:color-mix(in srgb,var(--rc) 72%,#d6dfe2)}
.tp-sub{font-family:var(--font-t);font-size:.78rem;line-height:1;color:var(--muted)}
.tp-sub .tp-ch{color:var(--muted)}
.tp-sub .tp-ch[data-c="ironclad"]{color:#ff7a5c}.tp-sub .tp-ch[data-c="silent"]{color:#7ed48a}.tp-sub .tp-ch[data-c="defect"]{color:#7fc7f0}.tp-sub .tp-ch[data-c="necrobinder"]{color:#d99cf2}.tp-sub .tp-ch[data-c="regent"]{color:#f0cf7a}
.tp-dot{display:inline-block;width:3px;height:3px;margin:0 6px;vertical-align:.2em;border-radius:50%;background:var(--dim)}
.tp-name{flex-basis:100%;font-family:var(--font-t);font-size:1.12rem;font-weight:700;line-height:1.15;color:#efc851;text-shadow:2px 1px 0 rgba(0,0,0,.3)}
/* the rules text: the game's keyword gold and number blue, as in every tip */
.tp-body{padding:6px 13px 9px 12px;max-width:21rem}
.tp-body .kw{color:var(--gold)}.tp-body .num{color:var(--blue)}.tp-body .energy-ico{display:inline-block;width:1em;height:1em;vertical-align:-.15em;background:center/contain no-repeat}
.tp-fact .tp-name{flex-basis:auto}   /* the fact tip's value shares the label's line: "ACHIEVEMENTS 33", then the small text (Bean, 22 Sep 2026: "move the 33 into the top line so the tooltip can be 2 lines instead of 3") */
.tp-fact .tp-body{color:#fff6e2}
.tp-fact .tp-body a{color:var(--gold);text-decoration:none}
/* the term plate (core.js tpTerm): kind and name share the first line, a power's icon before them; grey unless the power's Buff / Debuff colours it */
.tp-line .tp-head{align-items:center}
.tp-line .tp-name{flex-basis:auto;font-size:1.05rem}
.tp-ico{width:1.5rem;height:1.5rem;margin:-3px 0 -3px -2px;object-fit:contain;filter:drop-shadow(0 1px 0 rgba(0,0,0,.5))}
/* a card's stack: the terms named on it, three at most, in compact plates (Bean, 22 Sep 2026: "on the cards page it's overwhelming. Can we compress the tooltips in anyway?
   They are quite big and some cards have 3 off them"): smaller type, tighter padding, a shallower ledge, 18rem of text */
.tipwrap.tp-stack{gap:5px}
.tp-stack .tp-plate{font-size:.86rem;line-height:1.3;border-radius:10px;box-shadow:0 0 0 2px color-mix(in srgb,var(--rc) 48%,#243c46),0 3px 0 rgba(0,0,0,.55),0 8px 16px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.09)}
.tp-stack .tp-head{padding:6px 10px 0 9px;gap:2px 6px}
.tp-stack .tp-kind{font-size:.6rem}
.tp-stack .tp-name{font-size:.95rem}
.tp-stack .tp-body{padding:3px 10px 7px 9px;max-width:18rem}
.tp-stack .tp-ico{width:1.25rem;height:1.25rem}
/* the picture under the text: a hairline over it, the pedestal glow in the rarity colour behind it */
.tp-stage{display:flex;justify-content:center;align-items:flex-end;gap:10px;padding:8px 14px 12px;border-top:1px solid rgba(255,255,255,.08);background:radial-gradient(70% 55% at 50% 100%,color-mix(in srgb,var(--rc) 24%,transparent),transparent 72%)}
.tp-noline .tp-stage{border-top:0;padding-top:4px}
.tp-head+.tp-stage{border-top:0;padding-top:6px}
/* the housed slot (tilehousing.css .ih-slot is 5.6rem square): the gem hangs on its lower edge, so the stage leaves it room */
.tp-stage .ih-slot{width:5.6rem;height:5.6rem;margin-bottom:.35rem}
.tp-stage>.relic,.tp-stage>.potion,.tp-stage>.power{width:4.2rem;height:4.2rem}
.tp-stage .relic,.tp-stage .potion,.tp-stage .power{cursor:default}
/* stills and paintings */
.tp-still{display:block;max-width:100%;max-height:8.5rem;width:auto;height:auto;object-fit:contain;filter:drop-shadow(0 4px 4px rgba(0,0,0,.6))}
.tp-char{max-height:9.5rem}
.tp-epoch{max-height:6.5rem;border-radius:8px;filter:none;box-shadow:0 3px 0 rgba(0,0,0,.45)}
.tp-member{max-height:6rem}
.tp-room{display:block;width:100%;max-width:18rem;height:auto;max-height:8rem;object-fit:cover;border-radius:8px;box-shadow:0 0 0 1px rgba(255,255,255,.1),0 3px 0 rgba(0,0,0,.45)}
.tp-events .tp-room{object-fit:contain;max-height:10rem;box-shadow:none;border-radius:6px}
/* a card is the card: no head, no text, just the component at a size that reads (cardHtml, style.css .card) */
.tip .tp-cardbox{padding:8px 8px 8px 12px;background:linear-gradient(rgba(25,43,51,.985),rgba(14,25,31,.99))}
.tp-card{display:grid;place-items:center;padding:4px 2px 6px}
.tp-card .card{--cw:10.5rem;cursor:default;pointer-events:none}
/* arrival: a short rise; none under reduced motion (the tip's own .1 s opacity fade stays) */
.tip.show .tipwrap.tp{animation:tp-in .16s cubic-bezier(.16,1,.3,1)}
@keyframes tp-in{from{opacity:0;translate:0 6px;scale:.97}}
@media (prefers-reduced-motion:reduce){.tip.show .tipwrap.tp{animation:none}}
/* a hint (core.js hintify / hintTipHtml: the text a title attribute held; Bean, 23 Sep 2026: "all tool tips need to be styled like the tooltips on power / card / potion
   hover across the whole site"): the term plate's grey rim, the text alone */
.tp-hint .tp-body{padding:8px 13px 9px 12px;max-width:19rem;color:#fff6e2}
/* the pop-up keeps its own width wherever it lands: a fixed box placed near the right edge would otherwise shrink to the room left of it and wrap early */
.tip{width:max-content}

/* ===== app/titles.css ===== */
/* ---------- page titles: the game icon left of every section h1 (core.js h1row / h1IcoHtml, H1_ICO) ----------
   Bean, 17 Sep 2026: "Every sub page title should have an icon to the left of the main title". Sized from the h1's own font size so the two scale together;
   centred on the title's cap height rather than the row's bottom edge (the row aligns its count chips to the baseline side). */
.ptitle-ico{flex:none;align-self:center;width:clamp(1.9rem,1.5rem + 1.1vw,2.4rem);height:clamp(1.9rem,1.5rem + 1.1vw,2.4rem);object-fit:contain;margin-right:-8px;filter:drop-shadow(0 2px 2px rgba(0,0,0,.55))}
.dl-head .ptitle-ico{margin-right:0}
/* a closed fold right under a section page's lead: the long background text that used to be the intro (Bean: intros are 1 to 2 short lines) */
.leadmore{margin:-2px 0 14px;max-width:78ch}
.leadmore>p{margin:.6rem 0 0}

/* ===== app/topbar.css ===== */
/* ===== the top bar never moves (wave 4, shell stream; docs/wave4/shell.md) =====
   Bean, 21 Sep 2026: "When you change tabs the top bar kind of shifts around and the daily puzzle button / mute button glitch out. Everything in the top bar and
   left nav should be static when changing tabs". What moved, measured frame by frame on the static site:
   - the Daily button was served as "Daily puzzles" and grew by 20 px when the script added " #7" after the first paint, which pushed the Sound button and the
     search box 10 to 20 px to the left on EVERY page load;
   - the button plates, the rail icons and the toggle chevron were image files named from CSS: the first frame of a page had none of them;
   - a muted Sound button was drawn unmuted first (the state was read by the deferred script);
   - a page short enough to have no scrollbar would make the bar 10 px wider than on the page before.
   Now every box in the bar has a size that does not depend on its text, its font or a script: the brand word and the Daily button have fixed widths, the day
   number and the states (Sound, played today) are written by the inline script that follows the header in shell.html, BEFORE the first paint, into boxes that
   already have their final size, the pictures travel inside the stylesheet (app/shellsprites.css) and the scrollbar's room is always reserved. */
html{scrollbar-gutter:stable}
/* the brand icon is a CSS picture from the stylesheet (it was an <img> file) */
.brand-icon{display:block;background:var(--spr-brand) center/contain no-repeat}
/* the logo, Bean's pick #1 "Sword" (23 Sep 2026: "#1 is the best"; docs/wave6/logo/make_assets.py): the STS mark 40 px tall at its own 1.58:1, with its own ink outline and
   shadow like the page titles, so the old square plate around the pixel-card icon is gone */
.brand-box{width:auto;height:44px;border:0;border-radius:0;background:none;box-shadow:none;overflow:visible}
/* wide screens wear the STS.WIKI lockup (Bean, 23 Sep 2026: "we should include the .WIKI as apart of the logo here probably"; 3.71:1), 980 px and under the STS mark
   alone (1.87:1), where the word used to hide, so the search keeps its room */
.brand-icon{width:143px;height:38px;background-image:var(--spr-brandw)}
@media (max-width:980px){.brand-icon{width:71px;background-image:var(--spr-brand)}}
/* Bean, 23 Sep 2026: "Can we move the whole logo over to the left 4 px please, then make the sts 5% smaller": the STS 5% smaller on screen (38 px, .WIKI kept at its
   size, docs/wave6/logo/make_assets.py STS_K), the whole logo 4 px further left */
.brand{margin-left:-4px}

.tb-right{align-items:center}

/* ===== app/upgrade.css ===== */
/* ---------- card page: the Base / Upgraded showcase (build/app/pages.js showcaseSet + smithFx; docs/wave2/upgrade.md) ----------
   Both card states are in the HTML, stacked in one grid cell; the toggle swaps a class, so it works on the static export before any data bundle loads.
   Base -> Upgraded is the game's upgrade: the hand flash (NHandCardHolder.Flash: card_flash.png, the game tints it #9DFFFE; Bean asked for orange, so #FFB347 here; alpha 0.6 in 0.15 s then 0 in 0.3 s),
   the star burst and hammer sparks drawn on a canvas by smithFx, and the card jolting the way NCardSmithVfx rotates it (20, -10, 5 deg, Elastic-out)
   with hits 120 ms apart instead of the game's 250 ms so the whole thing fits 0.6 s. Upgraded -> Base is a plain crossfade. */
.upg-stage{position:relative;display:grid;place-items:center}
.upg-stage>.cs{grid-area:1/1;display:block;transform-origin:50% 50%}
.upg-stage>.cs-up,.upg-stage.is-up>.cs-base{opacity:0;visibility:hidden;pointer-events:none}
.upg-stage.is-up>.cs-up{opacity:1;visibility:visible;pointer-events:auto}
/* .fade is set for the Base direction only: the outgoing card fades and hides at the end, the incoming one shows at once and fades in */
.upg-stage.fade>.cs{transition:opacity .22s ease,visibility 0s linear .22s}
.upg-stage.fade>.cs-base,.upg-stage.fade.is-up>.cs-up{transition:opacity .22s ease,visibility 0s}
/* the smith jolt on the wrapper (not the card, whose scale/transform belong to hover and tilt): hits at 0 / 20 % / 40 % of 600 ms, each an Elastic-out overshoot
   past the game's target angle, then the card settles home (the game leaves it at 5 deg and flies it to the deck) */
.upg-stage>.cs.jolt{animation:upg-jolt .75s cubic-bezier(.4,0,.2,1) both;z-index:2}
/* Bean (16 Sep 2026): the game's elastic 20/-10/5 deg jolt read as too abrupt here, so the card sways gently instead */
@keyframes upg-jolt{0%{rotate:0deg;scale:1}28%{rotate:6deg;scale:1.05}58%{rotate:-4deg;scale:1.03}82%{rotate:1.5deg;scale:1.01}100%{rotate:0deg;scale:1}}
/* effects layer: the card's box; the flash is the game's sprite (341x582 around the 300x422 card) as a mask over the flash colour, the canvas overflows for the sparks */
.upg-fx{position:absolute;inset:0;pointer-events:none;z-index:7}
.upg-flash{position:absolute;left:50%;top:50%;width:114%;height:138%;translate:-50% -50%;background:#FFB347;-webkit-mask:var(--flash) center/100% 100% no-repeat;mask:var(--flash) center/100% 100% no-repeat;opacity:0;animation:upg-flash .45s linear both}
@keyframes upg-flash{0%{opacity:0}33%{opacity:.6}100%{opacity:0}}
.upg-cv{position:absolute;left:50%;top:50%;translate:-50% -50%}
/* the toggle (.upg-toggle.game) is styled in app/buttons.css: the game's popup Yes / No plate sprite, the active side shifted to gold (docs/wave2/buttons.md);
   scoped to .game so the list page and the sandbox keep their old toggle */

/* ---------- the card LIST: the Upgraded sweep (app/directories.js gridUpgFx; docs/wave4/directories.md) ----------
   Bean (21 Sep 2026): "When the "Upgraded" button is clicked we need the "Upgraded" animation from the individual card pages to play here as well ... maybe we just show
   one big animation? Idk, try both and find a stylistic middle ground that looks cool." gridUpgFx tags only the cards inside the window (.gu-c, or .gu-a / .gu-b for the
   two variants that were not picked, or .gu-r going back to Base) with --gd, the moment the light reaches that card, and lays ONE overlay (.gu-over) on the visible grid.
   Everything per card is translate / rotate / opacity (compositor only; scale and transform stay free for the hover and the tilt) plus a STEPPED colour flip: the new
   numbers and the title read in the base colours until the light arrives, go white, then the upgrade green: two repaints, never a colour animated per frame.
   Nothing changes size, so nothing moves. The keyframes never run under reduced motion (gridUpgFx returns first; the media rule below is the belt to its braces). */
#cgrid{position:relative}
/* WAVE 5 (Bean, 22 Sep 2026: "The swipe across the screen for the upgrade animation is a good idea, we just need to lower it's opacity by 30%, fade it out quickly
   towards the edges as you can currently see it cutoff, and make it quicker upon click, its delayed as of now."): the overlay is masked so the light dies away before
   the grid's four edges instead of being cut by them (a horizontal and a vertical fade, intersected; the sparks on the canvas fade with it), the band's own opacity is
   .7, and it starts already inside the grid on a linear run (directories.js gridBandAt; it used to ease in from -110 % of its width, which read as a delay after the
   click, on top of the redraw of 600 cards that has to come first). */
.gu-over{position:absolute;left:-10px;right:-10px;z-index:9;overflow:hidden;pointer-events:none;contain:strict;mix-blend-mode:screen;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent),linear-gradient(180deg,transparent,#000 14%,#000 86%,transparent);-webkit-mask-composite:source-in;
  mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent),linear-gradient(180deg,transparent,#000 14%,#000 86%,transparent);mask-composite:intersect}   /* light adds to the cards under it, it never hazes them */
.gu-over canvas{position:absolute;left:10px;top:0}
/* C, the one in use: the band of forge light. A soft orange body with a white-hot core, leaning like a swung hammer's arc; it crosses the grid once in --gs */
.gu-band{position:absolute;top:-10%;bottom:-10%;left:0;width:34%;opacity:.7;transform:translateX(-70%) skewX(-14deg);will-change:transform;
  background:linear-gradient(90deg,rgba(255,179,71,0),rgba(255,179,71,.16) 30%,rgba(255,190,96,.5) 46%,rgba(255,246,222,.85) 50%,rgba(255,190,96,.5) 54%,rgba(255,179,71,.16) 70%,rgba(255,179,71,0));
  animation:gu-band var(--gs,420ms) linear both}
@keyframes gu-band{0%{transform:translateX(-70%) skewX(-14deg)}100%{transform:translateX(270%) skewX(-14deg)}}
/* back to Base: the same band, steel coloured, faint, right to left */
.gu-over-r .gu-band{background:linear-gradient(90deg,rgba(150,190,205,0),rgba(150,190,205,.12) 35%,rgba(214,236,244,.36) 50%,rgba(150,190,205,.12) 65%,rgba(150,190,205,0));animation-name:gu-band-r}
@keyframes gu-band-r{0%{transform:translateX(270%) skewX(14deg)}100%{transform:translateX(-70%) skewX(14deg)}}
/* each visible card as the band passes it: a small hop and sway, the green ring on its own .glow layer, the stepped colour flip */
.card.gu-c{animation:gu-hop .3s cubic-bezier(.2,.7,.3,1) var(--gd,0ms) both}
@keyframes gu-hop{0%{translate:0 0;rotate:0deg}30%{translate:0 -5px;rotate:1.6deg}62%{translate:0 1px;rotate:-.8deg}100%{translate:0 0;rotate:0deg}}
.card.gu-c .glow,.card.gu-a .glow,.card.gu-b .glow{box-shadow:0 0 0 calc(3*var(--u)) rgba(127,255,0,.85),0 0 calc(24*var(--u)) calc(7*var(--u)) rgba(127,255,0,.4);transition:none;animation:gu-ring .32s ease-out var(--gd,0ms) both}
@keyframes gu-ring{0%{opacity:0}25%{opacity:.85}100%{opacity:0}}
.card:is(.gu-a,.gu-b,.gu-c) .desc .up,.card:is(.gu-a,.gu-b,.gu-c) .desc .up .num{animation:gu-tick .34s step-end var(--gd,0ms) both}
.card:is(.gu-a,.gu-b,.gu-c) .title{animation:gu-tick-t .34s step-end var(--gd,0ms) both}
@keyframes gu-tick{0%{color:#87CEEB}35%{color:#fff}75%,100%{color:#7FFF00}}
@keyframes gu-tick-t{0%{color:#FFF6E2}35%{color:#fff}75%,100%{color:#7FFF00}}
/* back to Base: the card dips as the steel band passes (opacity only) */
.card.gu-r{animation:gu-dip .28s ease-out var(--gd,0ms) both}
@keyframes gu-dip{0%{opacity:1}35%{opacity:.55}100%{opacity:1}}
/* variant A (not picked, ?upgfx=a): every visible card plays the card page's flash (the game's card_flash sprite as a mask over the orange) and its sway, by column and row */
.card.gu-a{animation:gu-sway .5s cubic-bezier(.4,0,.2,1) var(--gd,0ms) both}
@keyframes gu-sway{0%{rotate:0deg;translate:0 0}28%{rotate:4deg;translate:0 -4px}58%{rotate:-2.5deg;translate:0 0}82%{rotate:1deg}100%{rotate:0deg;translate:0 0}}
.card.gu-a::before{content:"";position:absolute;left:50%;top:50%;width:114%;height:138%;translate:-50% -50%;z-index:8;pointer-events:none;background:#FFB347;
  -webkit-mask:url(/img/packed/card_template/card_flash.webp) center/100% 100% no-repeat;mask:url(/img/packed/card_template/card_flash.webp) center/100% 100% no-repeat;opacity:0;animation:upg-flash .45s linear var(--gd,0ms) both}
/* variant B (not picked, ?upgfx=b): one flash over the whole visible grid; the burst and the hammer hits are on the canvas */
.gu-over-b .gu-flash{position:absolute;inset:0;background:radial-gradient(ellipse at 50% 50%,rgba(255,200,120,.75),rgba(255,179,71,.4) 38%,rgba(255,179,71,0) 72%);opacity:0;animation:upg-flash .5s linear both}
@media (prefers-reduced-motion:reduce){.card:is(.gu-a,.gu-b,.gu-c,.gu-r),.card:is(.gu-a,.gu-b,.gu-c) :is(.glow,.title,.up,.num),.gu-band,.gu-flash{animation:none!important}.gu-over{display:none}}

/* ===== app/wp1pages.css ===== */
/* ===== the search results page (app/wp1pages.js searchPageW4; wave 4 overview S1, docs/wave4/wp1.md) =====
   A card's thumbnail is its painting at the painting's own 4:3 (250 x 190). It was forced into a tall 38 x 53 box and cropped to a sliver. Every other kind keeps the
   row's icon. The row markup and the rest of its look are style.css .move (whose `.move .icons img` rule these selectors out-rank). */
.move.srow{align-items:center}
.move.srow .icons{flex:none;width:3.4rem;min-width:0;display:grid;place-items:center}
.move.srow .icons img.srow-i{width:2.5rem;height:2.5rem;object-fit:contain}
.move.srow .icons img.srow-card{width:3.4rem;height:auto;aspect-ratio:250/190;object-fit:cover;border-radius:4px;box-shadow:0 2px 0 rgba(0,0,0,.5)}
.move.srow .mn{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px}

/* ===== app/wp45.css ===== */
/* ===== wave 5, WP45 (22 Sep 2026): the site pages (About / Contact / Privacy), the 404 and the search rows; docs/wave5/wp45.md =====
   The pages themselves are pages.js (about / contact / privacy), core.js notFound and wp1pages.js searchRowW4; every component they use is shared (factGrid / dpFact,
   secBanner, chapHtml, tagChip, homeDirsW4Html) and styled in its own file. Only what these pages add is here. Sorts after wp1pages.css (name order), so the search
   row rules below win at equal specificity. */

/* the site pages' fact boxes go one to a row on a phone: their values are short phrases ("Until you clear it", "Browser and device") that a half-width box cuts;
   detailpage.css lays a fact grid 2 per row under 35rem, this makes it 1 under 26rem (the same rule the enchantment / affliction pages and the orb facts use) */
@container dpf (max-width:26rem){.sitepage .dp-cell{grid-column:span 12}}

/* the privacy page: what the site keeps, in plain words, as a list (never a 350-word wall); the exact key names live in the fold under it */
.sitepage .pv-list{margin:.4rem 0 .9rem;padding-left:1.15rem}
.sitepage .pv-list li{margin:.4rem 0}
.sitepage .pv-list li b{color:var(--gold);font-weight:700}
.sitepage .pv-list ul{margin:.3rem 0 0;padding-left:1.1rem}
.sitepage .pv-list ul li{margin:.2rem 0;color:var(--text)}
.sitepage details.more{margin-top:10px}
.sitepage .more-b{max-width:78ch}
.sitepage .more-b p{margin:.5rem 0 0}
.sitepage code{font-size:.88em;padding:1px 5px;border-radius:4px;background:rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.1);white-space:nowrap}

/* the search rows: the tag chips (core.js tagChip, tags.css) share the name's line, a step smaller than under a page title, so a row stays two lines */
.move.srow .mn .tagc{font-size:.8rem;min-height:1.5rem;padding:0 8px 0 6px;gap:5px}
.move.srow .mn .tagc .ftag-head{width:1.1rem;height:1.1rem}
.move.srow .mn .tagc-kind .kind-i{width:1rem;height:1rem}
