:root{--ink:#f4f7f5;--muted:#aebbb7;--aqua:#D7C84F;--aqua2:#F0E58A;--night:#050b0b;--panel:#0c1716;--line:rgba(255,255,255,.12);--shadow:0 24px 80px rgba(0,0,0,.48);font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;color:var(--ink);background:var(--night);color-scheme:dark}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-width:320px;background:radial-gradient(circle at 90% -10%,#123b36 0,transparent 35rem),var(--night);overflow-x:hidden}button,a,input{font:inherit}.topbar{position:fixed;z-index:50;inset:0 0 auto;display:flex;align-items:center;gap:2rem;height:72px;padding:0 clamp(1rem,4vw,4rem);background:linear-gradient(#04100fee,transparent);transition:background .25s}.topbar.scrolled{background:#06100ff2;border-bottom:1px solid var(--line)}.brand{display:flex;align-items:center;gap:.7rem;color:white;text-decoration:none;font-weight:800;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}.brand-mark{display:grid;place-items:center;width:46px;height:46px;border:1px solid #74f5dc66;border-radius:50%;background:linear-gradient(145deg,#1ed6b5,#0b736e);font-size:.85rem;box-shadow:0 0 28px #20d6b144}.brand-name{font-size:1.05rem;letter-spacing:.08em}.nav{display:flex;align-items:center;gap:clamp(.85rem,2.2vw,2rem);margin-left:auto}.nav a{color:#d7dfdc;text-decoration:none;font-size:1rem;font-weight:700;letter-spacing:.02em;padding:.7rem 0;position:relative}.nav a::after{content:"";position:absolute;inset:auto 50% 0;height:2px;background:var(--aqua);transition:inset .2s}.nav a:hover::after,.nav a.active::after{inset:auto 0 0}.nav a.active{color:white}.loading{height:100vh;display:grid;place-content:center;text-align:center;color:var(--muted)}.loader{width:42px;height:42px;margin:auto;border:2px solid #ffffff22;border-top-color:var(--aqua);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.hero{min-height:min(38vh,420px);display:flex;flex-direction:column;justify-content:flex-end;position:relative;padding:6.5rem clamp(1rem,5vw,5rem) 2.25rem;background-position:center 20%;background-size:cover;isolation:isolate}.hero::before{content:"";position:absolute;z-index:-1;inset:0;background:linear-gradient(90deg,#030807f5 0,#030807c7 34%,transparent 68%),linear-gradient(0deg,var(--night) 0,transparent 45%),linear-gradient(180deg,#02080866,transparent 30%)}.hero::after{content:"";position:absolute;z-index:-1;inset:auto 0 0;height:min(15rem,60%);background:linear-gradient(180deg,transparent,var(--night))}.hero-copy{width:min(400px,85vw)}.eyebrow,.type-pill{font-size:.8rem;letter-spacing:.16em;text-transform:uppercase;font-weight:800;color:var(--aqua)}.hero h1{font-size:clamp(1.8rem,3vw,2.9rem);line-height:1.02;margin:.45rem 0 .6rem;letter-spacing:-.02em;font-weight:800;overflow-wrap:break-word}
/* Home North Star, first corrections -- the Continue strip is part of the hero but must not span
   its full width: constrained so ~3-4 cards show at wide desktop, leaving the right side of the
   hero clear for artwork; extra real items stay reachable by scrolling within this strip. */
.hero-continue-row{width:100%;max-width:1130px;margin-top:1.75rem}
.episode-line{font-size:.98rem;font-weight:600;color:#ccd6d3;margin:.35rem 0 0;letter-spacing:.005em}
.hero-continue-row .media-row{padding-bottom:.2rem}
.hero-progress{max-width:420px;margin:.9rem 0 0}
.hero-progress .remaining{font-size:.78rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--aqua);margin:0 0 .45rem}
.hero-progress .track{height:5px;border-radius:9px;background:#ffffff2b;overflow:hidden}
.hero-progress .track i{display:block;height:100%;background:var(--aqua);border-radius:inherit}.meta-line{display:flex;align-items:center;gap:.7rem;color:#c7d1ce;font-size:1rem;margin:.6rem 0}.meta-line>*+*::before{content:"•";margin-right:.7rem;color:#6f827d}.actions{display:flex;flex-wrap:wrap;gap:.7rem;margin-top:1.1rem}.button{border:0;border-radius:10px;padding:.85rem 1.2rem;display:inline-flex;align-items:center;justify-content:center;gap:.45rem;text-decoration:none;font-weight:800;cursor:pointer;min-height:46px;font-size:1.1em}.button.primary{background:var(--aqua);color:#03100e}.button.primary:hover{background:#72f5dc}.button.secondary{background:#ffffff18;color:white;backdrop-filter:blur(12px);border:1px solid #ffffff24}.button.secondary:hover{background:#ffffff29}.button.ghost{background:transparent;color:var(--muted);border:1px solid transparent;padding:.85rem .3rem;min-height:auto}.button.ghost:hover{color:var(--ink);text-decoration:underline}.content{position:relative;margin-top:-2.5rem;padding:0 clamp(1rem,4vw,4rem) 5rem}.browse-page{padding:7rem clamp(1rem,4vw,4rem) 5rem;min-height:100vh}.page-head{display:flex;align-items:end;justify-content:space-between;gap:1rem;margin:1rem 0 2rem}.page-head h1{font-size:clamp(2rem,6vw,4rem);margin:0;letter-spacing:-.04em}.page-head p{color:var(--muted);margin:.35rem 0}.row-section{margin:0 0 1.6rem}.row-title{display:flex;align-items:baseline;gap:.75rem;margin:0 0 .65rem}.row-title h2{font-size:clamp(1.1rem,1.6vw,1.2rem);margin:0;letter-spacing:.06em;text-transform:uppercase;font-weight:650;color:#e4e9e6}.row-title span{font-size:.87rem;color:var(--muted)}.media-row{display:grid;grid-auto-flow:column;grid-auto-columns:clamp(150px,12vw,260px);gap:clamp(.7rem,1.3vw,1.3rem);overflow-x:auto;padding:.25rem .2rem 1.2rem;margin:0 -.2rem;scroll-snap-type:x proximity;scrollbar-width:thin;scrollbar-color:#31534d transparent}
/* Continue card dimensions are shared in continue-cards.css. */
/* Recently Added, half-width band context -- tuned so ~6 posters are visible at wide desktop. */
.recent-row{grid-auto-columns:clamp(110px,8vw,170px)}.card{scroll-snap-align:start;cursor:pointer;min-width:0}.poster{aspect-ratio:2/3;border-radius:8px;overflow:hidden;background:linear-gradient(145deg,#17302d,#08110f);position:relative;box-shadow:0 8px 30px #0008;transition:transform .22s,box-shadow .22s}.card:hover .poster,.card:focus-visible .poster{transform:translateY(-6px) scale(1.018);box-shadow:0 16px 42px #000c}.poster img{width:100%;height:100%;object-fit:cover;display:block}.badge{position:absolute;top:.55rem;left:.55rem;background:#06100ddd;color:#dffaf3;border:1px solid #ffffff22;padding:.3rem .5rem;border-radius:999px;font-size:.62rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em}.progress{position:absolute;left:.55rem;right:.55rem;bottom:.55rem;height:4px;border-radius:9px;background:#ffffff33;overflow:hidden}.progress i{display:block;height:100%;background:var(--aqua);border-radius:inherit}.card h3{font-size:.9rem;margin:.75rem .1rem .2rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.card p{font-size:.84rem;color:var(--muted);margin:0 .1rem}.fallback-cover{width:100%;height:100%;display:flex;flex-direction:column;justify-content:flex-end;padding:1.1rem;background:radial-gradient(circle at 75% 18%,#49e5c750,transparent 28%),linear-gradient(145deg,#163f39,#07100f 65%);position:relative;overflow:hidden}.fallback-cover::before{content:"";position:absolute;width:160%;height:30%;left:-30%;top:28%;border:1px solid #55f3d455;border-radius:50%;transform:rotate(-18deg)}.fallback-cover strong{font-family:Georgia,serif;font-size:1.2rem;line-height:1.05;position:relative}.fallback-cover small,.fallback-brand{color:#9fcac1;font-size:.65rem;text-transform:uppercase;letter-spacing:.12em;margin-top:.4rem;position:relative}.fallback-brand{position:absolute;top:1rem;left:1rem}.fallback-glyph{position:absolute;font-size:6rem;color:#53e5ca1f;right:-.3rem;top:18%}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(155px,1fr));gap:1.5rem clamp(.75rem,1.4vw,1.2rem)}.grid .card{max-width:260px}.music-grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))}.music-grid .poster{aspect-ratio:1/1;border-radius:12px}.filters{display:flex;gap:.55rem;flex-wrap:wrap}.chip{border:1px solid var(--line);background:#ffffff0b;color:#d9e2df;border-radius:99px;padding:.55rem .85rem;cursor:pointer}.chip.active{background:#dffbf5;color:#07110f}.search-wrap{max-width:850px;margin:1rem auto 2rem}.search-controls-row{margin-top:.85rem;align-items:center}.search-controls-row .chip{padding:.42rem .8rem;font-size:.82rem}.search-controls-divider{width:1px;align-self:stretch;min-height:1.4rem;background:var(--line)}.search-discovery-indicator{margin:.6rem 0 0;font-size:.78rem;color:var(--muted);display:flex;align-items:center;gap:.4rem}.search-discovery-indicator::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--aqua);animation:af-pulse 1.4s ease-in-out infinite}@keyframes af-pulse{0%,100%{opacity:.35}50%{opacity:1}}.searchbox{width:100%;border:1px solid #ffffff25;border-radius:16px;background:#ffffff0c;color:white;font-size:clamp(1.1rem,3vw,1.6rem);padding:1rem 1.2rem;outline:none}.searchbox:focus{border-color:var(--aqua);box-shadow:0 0 0 3px #39dcbc22}.search-empty{text-align:center;color:var(--muted);padding:5rem 1rem}.detail-shell{position:fixed;z-index:100;inset:0;overflow:auto;background:#030807f5;backdrop-filter:blur(14px)}.detail{min-height:100%;position:relative}.detail-backdrop{position:absolute;inset:0 0 auto;height:min(66vh,620px);background-size:cover;background-position:center 20%;opacity:.52;mask-image:linear-gradient(#000 35%,transparent 100%)}.detail-close{position:fixed;z-index:2;right:clamp(1rem,3vw,2rem);top:1rem;width:46px;height:46px;border:1px solid #ffffff25;border-radius:50%;background:#07100dcc;color:#fff;font-size:1.5rem;cursor:pointer}.detail-body{position:relative;display:grid;grid-template-columns:minmax(180px,260px) minmax(0,760px);gap:clamp(1.5rem,4vw,4rem);align-items:end;padding:clamp(9rem,28vh,18rem) clamp(1rem,7vw,7rem) 4rem}.detail-poster{aspect-ratio:2/3;border-radius:12px;overflow:hidden;box-shadow:var(--shadow);background:#10201d}.detail-poster img{width:100%;height:100%;object-fit:cover}.detail-copy h1{font-size:clamp(2.4rem,6vw,5.6rem);line-height:.95;letter-spacing:-.05em;margin:.4rem 0 1rem}.detail-copy .overview{color:#ccd7d3;line-height:1.7;font-size:1rem}.title-logo{margin:.5rem 0 1.1rem}.title-logo img{display:block;max-width:min(420px,70vw);max-height:150px;width:auto;height:auto;object-fit:contain;filter:drop-shadow(0 6px 28px rgba(0,0,0,.6))}.credit-line,.collection-line{color:#c7d1ce;font-size:1rem;line-height:1.6;margin:.5rem 0 0}.collection-line{color:var(--aqua);font-weight:700}.cast-block h3{margin:0 0 .8rem;font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;font-weight:800;color:var(--muted)}.cast-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.7rem 1.5rem;list-style:none;margin:0;padding:0}.cast-grid li{display:flex;flex-direction:column;gap:.15rem;min-width:0}.cast-grid strong{font-size:.9rem;color:var(--ink);font-weight:700;white-space:normal;overflow-wrap:break-word}.cast-grid span{font-size:.87rem;color:var(--muted);white-space:normal;overflow-wrap:break-word}.rich-detail .detail-hero{position:relative;height:min(62vh,660px);display:flex;align-items:flex-end;overflow:hidden;isolation:isolate;--nitros-art-media-start:42%}.rich-detail .detail-hero-bg{position:absolute;inset:0;background-size:cover;background-position:center 20%}/* Confirmed cause of the hard rectangular trailer / separate black left panel: .detail-hero-player
   (below) carried its OWN opaque background:#000 across the ENTIRE hero at ALL times -- it is never
   hidden itself, only its children are -- painted after (so visually above) .detail-hero-bg in the
   same z-index:auto paint order, so the cinematic backdrop was never visible at all, trailer active
   or not. Fixed below by removing that background entirely.
   Separately, .detail-hero-trailer's own `inset:0` tied in CSS specificity (0,2,0) with the shared
   ".nitros-art-hero .nitros-art-media{left:var(--nitros-art-media-start);mask-image:...}" rule
   declared later in this file -- so the trailer's rendered box DID already start at the same ~42%
   boundary as the backdrop and DID already inherit the same blend mask, but only via an incidental
   tie far from the rule it depends on. Declared explicitly here instead (same selector, now
   self-sufficient) so the blend no longer depends on that tie -- it reproduces the backdrop's own
   positioning + mask directly, so the trailer's left edge fades into the hero rather than forming a
   hard boundary, and still correctly defers to the existing mobile override
   (".nitros-art-hero .nitros-art-media{left:0;mask-image:none}" at <=760px, declared even later and
   still wins there, matching the backdrop's own full-bleed mobile treatment with no change needed).
   pointer-events:none here is the item 3 fix: mouse/touch can no longer reach the YouTube iframe
   mounted inside (hover/click no longer reveal or operate YouTube's native controls), while nothing
   about loading, playback or postMessage commands is affected -- pointer-events has no bearing on
   any of those. .trailer-controls (a sibling, not a descendant) is untouched and stays interactive. */
.rich-detail .detail-hero-trailer{position:absolute;top:0;right:0;bottom:0;left:var(--nitros-art-media-start);width:auto;overflow:hidden;background:#000;z-index:0;pointer-events:none;-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 var(--nitros-art-blend));mask-image:linear-gradient(90deg,transparent 0,#000 var(--nitros-art-blend))}.rich-detail .detail-hero-trailer .continuity-trailer-video,.rich-detail .detail-hero-trailer .continuity-trailer-frame{position:absolute;top:50%;left:50%;width:100%;height:100%;min-width:150%;min-height:150%;transform:translate(-50%,-50%);border:0;object-fit:cover}.rich-detail .detail-hero::before{content:"";position:absolute;z-index:1;inset:0;pointer-events:none;background:linear-gradient(0deg,var(--night) 0,transparent 42%),linear-gradient(90deg,#030807ee 0,#030807b0 38%,transparent 72%)}.rich-detail .detail-hero.trailer-playing::before{opacity:.55;transition:opacity .3s}.trailer-controls{position:absolute;z-index:3;right:clamp(1rem,3vw,2rem);bottom:1.2rem;align-items:center;gap:.6rem}.trailer-controls[hidden]{display:none}.trailer-controls:not([hidden]){display:flex}.trailer-controls .af-seek{width:84px}.rich-detail .detail-hero>.detail-hero-media{position:absolute;inset:0;z-index:0}.rich-detail .detail-hero-media>.detail-hero-player{position:absolute;inset:0;overflow:hidden}
/* Optional real foreground artwork (e.g. the Audiobook cover) over the dimmed/blended backdrop --
   explicit z-index:2, the same level .detail-hero-content itself uses, so it is never left to the
   scrim's own z-index:1 gradient (.rich-detail .detail-hero::before above) to decide whether it
   stays visible. Anchored toward the right of the media region (clear of the scrim's own left-to-
   right fade) and vertically centred; sized by height so a portrait cover keeps its real 2/3
   aspect ratio, never stretched. Hidden on phone (see the <=760px block at the end of this file) --
   the dimmed backdrop atmosphere alone already carries the same artwork there. */
.rich-detail .detail-hero-media-content{position:absolute;z-index:2;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:clamp(2rem,8vw,6rem);pointer-events:none}
.rich-detail .detail-hero-media-content .detail-poster{height:min(52vh,460px);width:auto;aspect-ratio:2/3;margin:0;box-shadow:0 30px 70px #000c;pointer-events:auto}.rich-detail .detail-hero-content{position:relative;z-index:2;width:min(42vw,760px);min-width:min(560px,88vw);padding:clamp(6rem,20vh,9rem) clamp(1.25rem,5vw,4.5rem) clamp(1.75rem,4.5vh,2.75rem);transition:opacity .25s}
/* "Approved Torrent UI": overlays the hero's own ARTWORK area only -- starting at the same left edge
   where .detail-hero-content's own established width ends, so the title/actions column is never
   covered, resized or shifted. position:absolute within .detail-hero (already position:relative) --
   opening/closing this never changes hero height or moves anything below it. */
/* "Approved Torrent UI" reference proportions (1740px-wide mockup): left media area ~430px (~25%),
   panel spanning from there to near the right edge, with a small (~12px) margin on top/right/bottom --
   a floating rounded card over the artwork, not an edge-to-edge sheet. Proportional (min()/%), not
   fixed pixels, so it adapts at other viewport widths per the spec's own instruction. */
/* "Uploaded mockup" visual authority: a deliberate overlay filling the hero's own right-side space --
   flush to the hero's own top/right/bottom (no floating-card margins), with a left border dividing it
   from the artwork, blending from translucent (artwork still visible behind the header) to a solid
   dark ground where the comparison rows sit. left:max(...) + a capped width is the explicit fix for
   "the panel can visually extend badly or waste huge amounts of space on ultrawide screens" (the
   previous min()-based left offset stayed pinned at a small fixed value as the viewport grew, so the
   panel's own width grew unbounded with it) -- width now has a real ceiling regardless of viewport,
   and never becomes a narrow wasted strip on an ordinary desktop width either, since it still claims
   all the remaining space up to that ceiling. */
/* ROOT CAUSE (confirmed via real rendered-DOM inspection, not guesswork): .torrent-panel is a direct
   child of .detail-hero.nitros-art-hero, and .nitros-art-hero>:not(.nitros-art-media){position:
   relative;z-index:2} (an existing, unrelated rule that lifts the hero's own content above the
   backdrop art) has HIGHER specificity (two classes) than a bare .torrent-panel{...} rule (one class)
   -- it was silently overriding position:absolute back to position:relative. With position:relative,
   the panel stayed in NORMAL FLEX FLOW as a flex item of .detail-hero (display:flex;align-items:
   flex-end), sized purely by its own CONTENT (confirmed ~1250px tall against a ~610px hero) and
   bottom-aligned by the hero's own flex cross-axis alignment -- which is exactly "extends beyond the
   visible screen" (bottom-aligned content taller than its container overflows UPWARD, off the top of
   the viewport) and "narrow areas" (its `left` computed as a position:relative OFFSET from its normal
   flex position, not as an absolute inset from the hero's own edge, so its rendered width/position
   varied unpredictably with content and viewport rather than being deterministic). The real fix is a
   selector with genuinely higher specificity than the generic rule (three classes), never another
   speculative width/position number. */
.rich-detail .nitros-art-hero>.torrent-panel{position:absolute;z-index:3;top:0;right:0;bottom:0;left:max(420px,28%);width:min(1300px,calc(100% - max(420px,28%)));background:linear-gradient(135deg,#07100d99 0%,#040a08f2 22%,#030706fa 100%);backdrop-filter:blur(14px);border-left:1px solid #ffffff22;padding:clamp(1.3rem,2.6vw,2.2rem) clamp(1.3rem,2.6vw,2.4rem);overflow-y:auto;display:flex;flex-direction:column}
/* Confirmed live defect: the `hidden` attribute (set by closeNitrosRecommends()) has no visual effect
   once the rule above sets `display:flex` -- an author-stylesheet declaration always beats the
   user-agent stylesheet's own `[hidden]{display:none}` regardless of specificity, so the empty panel's
   background/blur/absolute box kept rendering as a dark rectangle over the hero even when closed. Same
   established pattern already used elsewhere in this file for the same reason (.dock-menu[hidden],
   .next-episode[hidden], .music-mini[hidden], .book-mini[hidden], .showcase-trailer[hidden],
   .showcase-nav button[hidden]) -- scoped through the same compound selector as the base rule so it
   isn't itself defeated by it. */
.rich-detail .nitros-art-hero>.torrent-panel[hidden]{display:none}
.rich-detail .detail-hero-content h1{font-size:clamp(1.6rem,4.6vw,4rem);line-height:1.05;letter-spacing:-.04em;margin:.3rem 0 1rem;text-shadow:0 10px 34px rgba(0,0,0,.55);overflow-wrap:break-word}.rich-detail .detail-hero-content .overview{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.rich-detail .title-logo img{max-width:min(400px,80%);max-height:150px}/* Supporting information band: a compact horizontal strip below the hero, not a tall side column.
   Director/creator credit sits above the cast grid; the cast grid itself already distributes into
   as many compact columns as the available width allows (reused from .cast-grid, unchanged) rather
   than a single vertical list. */
.detail-support{padding:1.1rem clamp(1.5rem,6vw,5rem) 1.75rem;max-width:1800px;margin:0 auto}
.detail-support .overview{max-width:70ch}
.detail-support .credit-line{margin:0 0 .9rem}
.detail-support .collection-line{margin:0 0 .9rem}
.detail-support .cast-block{margin-top:0}
.detail-support .cast-grid{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.5rem 1.5rem}
.rich-detail .season-browser{margin-top:0}.detail-progress{margin:1rem 0;max-width:400px}.detail-progress .track{height:5px;background:#ffffff2b;border-radius:9px}.detail-progress .track i{display:block;height:100%;background:var(--aqua)}.episodes,.tracklist{margin:0 clamp(1rem,7vw,7rem) 5rem;max-width:1050px}.episodes h2,.tracklist h2{font-size:1.6rem}.episode,.track-item{display:grid;grid-template-columns:auto 1fr auto;gap:1rem;align-items:center;padding:.9rem .2rem;border-bottom:1px solid var(--line);cursor:pointer}.episode:hover{color:var(--aqua)}.number{color:var(--muted);font-variant-numeric:tabular-nums}.empty-card{border:1px solid var(--line);border-radius:12px;padding:2rem;color:var(--muted)}.error{min-height:100vh;display:grid;place-content:center;text-align:center;padding:2rem}.error h1{font-size:2rem}.mobile-nav{display:none}
@media(max-width:760px){.topbar{height:62px;padding:0 .9rem}.brand-name{display:none}.brand-mark{width:34px;height:34px}.nav{position:fixed;z-index:60;left:0;right:0;bottom:0;height:68px;background:#06100ff5;border-top:1px solid var(--line);padding:0 .45rem;padding-bottom:env(safe-area-inset-bottom);justify-content:space-around;gap:0;backdrop-filter:blur(18px)}.nav a{font-size:.67rem;padding:1.2rem .36rem}.nav a::after{bottom:.7rem}.hero{min-height:46vh;padding:6rem 1rem 1.75rem;background-position:62% 20%}.hero::before{background:linear-gradient(0deg,var(--night),transparent 60%),linear-gradient(90deg,#030807d9,transparent)}.hero h1{font-size:2.1rem;max-width:90%}.content{margin-top:-1rem;padding:0 1rem 6rem}.media-row{grid-auto-columns:42vw}.browse-page{padding:5.2rem 1rem 6rem}.grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.1rem .7rem}.music-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.page-head{display:block}.detail-body{display:block;padding:8rem 1rem 2rem}.detail-poster{width:36vw;min-width:130px;margin-bottom:1.5rem}.detail-copy h1{font-size:2.7rem}.title-logo img{max-width:80vw;max-height:90px}.credit-line,.collection-line{font-size:.85rem}.cast-grid{grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}.episodes,.tracklist{margin:0 1rem 6rem}.episode{grid-template-columns:auto 1fr}.button{flex:1}.detail-close{top:.7rem;right:.7rem}.brand{margin-right:auto}/* Phone: the hero's content region now carries metadata/actions/synopsis/progress that used to
   live in a separate section below it, so a fixed desktop-style hero height here risks clipping --
   height:auto (floored by the same min-height the fixed value used to be) lets it grow with
   whatever the content genuinely needs instead. */
.rich-detail .detail-hero{height:auto;min-height:min(58vh,560px)}.rich-detail .detail-hero-content{width:100%;padding:5.5rem 1rem 1.25rem}.rich-detail .detail-hero-content h1{font-size:2.2rem}.rich-detail .title-logo img{max-width:75vw;max-height:80px}.rich-detail .detail-hero-media-content{display:none}.rich-detail .nitros-art-hero>.torrent-panel{left:0;right:0;top:0;bottom:0;width:auto;border-left-width:0;padding:4.5rem 1rem 1.25rem}
/* Same cascade-ordering issue as the base panel fix above, confirmed the same way (real rendered
   computed-style inspection): this @media block sits EARLIER in the file than the base .torrent-row-
   grid/.torrent-col-labels rules (added later, elsewhere in the stylesheet), so an equal-specificity
   override here loses to the later base rule regardless of the media query matching. Scoped through
   .torrent-panel (itself now unambiguously specific) so these mobile overrides win regardless of
   physical file position. */
.rich-detail .nitros-art-hero>.torrent-panel .torrent-panel-head-status{padding-right:0;flex-direction:column;align-items:flex-end;gap:.3rem}
.rich-detail .nitros-art-hero>.torrent-panel .torrent-col-labels{display:none}
.rich-detail .nitros-art-hero>.torrent-panel .torrent-row-grid{grid-template-columns:1fr;row-gap:.5rem}
.rich-detail .nitros-art-hero>.torrent-panel .torrent-col-size{text-align:left}
.rich-detail .nitros-art-hero>.torrent-panel .torrent-col-seeders{justify-content:flex-start}
.rich-detail .nitros-art-hero>.torrent-panel .torrent-col-action{justify-self:stretch}.detail-support{padding:1rem 1rem 1.25rem}.detail-support .cast-grid{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.book-series-shelf{padding:0 1rem 1.75rem}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;animation:none!important;transition:none!important}}
.account-button{border:1px solid #76ebd06b;background:linear-gradient(145deg,#20cbb0,#0b6b65);color:white;border-radius:50%;width:38px;height:38px;cursor:pointer;margin-left:.4rem;font-size:.72rem;font-weight:900}.account-button[data-avatar="coral"],.avatar-preview.coral,.avatar-choice.coral span{background:linear-gradient(145deg,#ff8b76,#a33946)}.account-button[data-avatar="violet"],.avatar-preview.violet,.avatar-choice.violet span{background:linear-gradient(145deg,#a68bff,#51369b)}.account-button[data-avatar="amber"],.avatar-preview.amber,.avatar-choice.amber span{background:linear-gradient(145deg,#ffc65c,#9c5d0f)}.account-button[data-avatar="midnight"],.avatar-preview.midnight,.avatar-choice.midnight span{background:linear-gradient(145deg,#4e6e86,#14222e)}.account-menu{position:fixed;z-index:70;right:clamp(1rem,4vw,4rem);top:64px;width:210px;padding:.75rem;border:1px solid var(--line);border-radius:14px;background:#091311f4;box-shadow:var(--shadow);backdrop-filter:blur(18px)}.account-menu strong{display:block;padding:.5rem .6rem .8rem}.account-menu button{display:block;width:100%;text-align:left;border:0;background:transparent;color:#dce7e3;padding:.7rem .6rem;border-radius:8px;cursor:pointer}.account-menu button:hover{background:#ffffff12}.account-view{min-height:100%;padding:5rem 1rem;background:radial-gradient(circle at 75% 0,#12453d,transparent 36rem),#050b0b}.account-inner{width:min(980px,100%);margin:auto}.account-inner>h1{font-size:clamp(2.5rem,7vw,5rem);letter-spacing:-.05em;margin:.4rem 0 1.5rem}.account-intro{color:var(--muted)}.account-form{display:grid;gap:1rem;padding:1.4rem;border:1px solid var(--line);border-radius:16px;background:#ffffff08;margin:1rem 0 2rem}.account-form h2{margin:0}.account-form label{display:grid;gap:.4rem;color:#cbd6d2;font-size:.8rem;font-weight:700}.account-form input,.account-form select{border:1px solid #ffffff25;border-radius:10px;background:#07100f;color:white;padding:.8rem;outline:none}.account-form fieldset{border:0;padding:0;margin:0}.account-form legend{margin-bottom:.7rem}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem}.avatar-options{display:flex;gap:.8rem;flex-wrap:wrap}.avatar-choice input{position:absolute;opacity:0}.avatar-choice span,.avatar-preview{display:grid;place-items:center;width:48px;height:48px;border-radius:50%;background:linear-gradient(145deg,#20cbb0,#0b6b65);font-weight:900}.avatar-choice small{font-size:.65rem;text-align:center}.avatar-choice:has(input:checked) span{outline:3px solid white;outline-offset:3px}.form-message{color:var(--aqua)}.form-message.bad{color:#ff9d9d}.user-list{display:grid;gap:.8rem}.user-admin{display:grid;grid-template-columns:auto 1fr;gap:1rem;padding:1rem;border:1px solid var(--line);border-radius:14px;background:#ffffff08}.user-admin.disabled{opacity:.58}.user-main{display:grid;gap:.2rem}.user-main span,.user-main small{color:var(--muted)}.user-actions{grid-column:2;display:flex;gap:.45rem;flex-wrap:wrap}.chip.danger{color:#ff9d9d;border-color:#ff8d8d44}.password-form{margin-top:2rem}.login-page{min-height:100vh;background:radial-gradient(circle at 70% 10%,#164c43,transparent 40rem),linear-gradient(145deg,#030807,#071513)}.login-main{min-height:100vh;display:grid;place-items:center;padding:1.2rem}.login-card{width:min(430px,100%);padding:clamp(1.6rem,6vw,3rem);border:1px solid #ffffff18;border-radius:24px;background:#081311dd;box-shadow:var(--shadow);backdrop-filter:blur(20px)}.login-mark{margin-bottom:2rem}.login-card h1{font-size:clamp(2.2rem,8vw,3.7rem);letter-spacing:-.05em;margin:.45rem 0}.login-card>p{color:var(--muted);margin:0 0 2rem}.login-card form{display:grid;gap:1rem}.login-card label{display:grid;gap:.45rem;color:#cad5d1;font-size:.82rem;font-weight:700}.login-card input{width:100%;border:1px solid #ffffff24;background:#ffffff0b;color:white;border-radius:12px;padding:.9rem 1rem;outline:none}.login-card input:focus{border-color:var(--aqua);box-shadow:0 0 0 3px #43dfc022}.login-card .button{width:100%;margin-top:.4rem}#login-error{color:#ff9d9d;min-height:1.2rem;font-size:.82rem}.login-card button:disabled{opacity:.65}
@media(max-width:760px){.account-button{position:fixed;right:.8rem;top:.75rem}.account-menu{right:.75rem;top:56px}.account-view{padding:4.5rem .8rem 5rem}.form-grid{grid-template-columns:1fr}.user-admin{grid-template-columns:auto 1fr}.user-actions{grid-column:1/-1}.account-inner>h1{font-size:2.7rem}}

/* Narrow-screen overflow safeguards. */
.row-section{min-width:0}.media-row{max-width:100%}
@media(max-width:760px){
  .nav{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));width:100vw;margin:0;padding-left:.2rem;padding-right:.2rem}
  .nav a{font-size:0;min-width:0;padding-left:.1rem;padding-right:.1rem;text-align:center}
  .nav a::before{content:attr(data-mobile);font-size:.62rem}
  .hero{width:100vw;max-width:100vw}
  .hero-copy{width:calc(100vw - 2rem);max-width:calc(100vw - 2rem)}
  .hero .actions{display:grid;grid-template-columns:1fr;width:100%}
  .hero .button{min-width:0;padding:.75rem .5rem;font-size:.9rem;white-space:nowrap}
}

/* 1.2 streaming interaction refinements */
:focus-visible{outline:3px solid var(--aqua);outline-offset:3px}.row-title{justify-content:space-between}.row-title>div:first-child{display:flex;align-items:baseline;gap:.75rem}.rail-controls{display:flex;gap:.45rem}.rail-controls button{width:40px;height:40px;border:1px solid var(--line);border-radius:50%;background:#07110ed9;color:white;font-size:1.8rem;line-height:1;cursor:pointer;transition:opacity .2s,background .2s}.rail-controls button:hover:not(:disabled){background:#ffffff25}.rail-controls button:disabled{opacity:.22;cursor:default}.media-row{scroll-padding-inline:.2rem;overscroll-behavior-inline:contain}/* Build 218: poster media-type badges (the task's own specific reference) -- internal symbols +~40%,
   circular background (width/height:28px) deliberately unchanged. */
.type-mark,.watched,.availability-mark{position:absolute;display:grid;place-items:center;width:28px;height:28px;border:1px solid #ffffff29;border-radius:50%;background:#06100de8;color:#eafff9;font-size:1rem;box-shadow:0 4px 16px #0008}.type-mark{top:.55rem;left:.55rem}.watched{top:.55rem;right:.55rem;color:var(--aqua);font-weight:900}.availability-mark{top:.55rem;right:.55rem;color:var(--aqua)}.availability-mark svg{width:20px;height:20px}.availability-mark.availability-external{color:#dde6e3}.availability-mark.availability-upcoming{color:#f3c969}
/* "Media Presentation Corrections", Task 2: a plain, non-interactive label for a collection member
   that is genuinely upcoming -- same visual weight as a .button but deliberately not one (no hover/
   focus affordance, never a click target of its own; the card/hero itself still opens the detail page). */
.upcoming-indicator{display:inline-flex;align-items:center;gap:.45rem;padding:.85rem 1.2rem;border-radius:10px;background:#ffffff0c;color:#f3c969;font-weight:800;min-height:46px}
.upcoming-indicator svg{width:18px;height:18px}
.torrent-panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:1.2rem;flex:0 0 auto}
.torrent-panel-head h2{font-size:1.7rem;font-weight:800;margin:0;letter-spacing:-.01em}
.torrent-panel-subtitle{margin:.3rem 0 0;color:var(--muted);font-size:.85rem}
.torrent-panel-head-status{display:flex;align-items:center;gap:1rem;flex:0 0 auto;padding-right:2.6rem}
.torrent-result-count{color:var(--muted);font-size:.8rem;white-space:nowrap}
.torrent-status-pill{display:flex;align-items:center;gap:.5rem;color:var(--aqua);font-size:.8rem;font-weight:700;white-space:nowrap}
.torrent-status-spinner{width:15px;height:15px;border-radius:50%;border:2px solid #ffffff25;border-top-color:var(--aqua);animation:torrent-spin .8s linear infinite;flex:0 0 auto}
@keyframes torrent-spin{to{transform:rotate(360deg)}}
.torrent-panel-close{position:absolute;top:clamp(1.3rem,2.6vw,2.2rem);right:clamp(1.3rem,2.6vw,2.4rem);flex:0 0 auto;width:34px;height:34px;border:1px solid #ffffff25;border-radius:50%;background:#ffffff0f;color:#fff;font-size:1.3rem;line-height:1;cursor:pointer}
.torrent-panel-body{min-height:60px;margin-top:1.1rem;overflow-y:auto;flex:1 1 auto;display:flex;flex-direction:column}
.torrent-progress-track{width:100%;height:3px;border-radius:3px;background:#ffffff1c;overflow:hidden;flex:0 0 auto;margin-bottom:1.3rem}
.torrent-progress-fill{width:30%;height:100%;background:var(--aqua);border-radius:inherit;animation:torrent-progress-slide 1.3s ease-in-out infinite}
@keyframes torrent-progress-slide{0%{transform:translateX(-120%)}100%{transform:translateX(430%)}}
/* Clean, generously-spaced comparison rows ("uploaded mockup" visual authority): bold quality, small
   source/encoding chips, size and seeders right-aligned in fixed columns, action button far right --
   filename demoted to small secondary text beneath, never the row's primary content. */
.torrent-col-labels,.torrent-row-grid{display:grid;grid-template-columns:1fr 90px 110px 140px;align-items:center;column-gap:1.2rem}
.torrent-col-labels{color:var(--muted);font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;font-weight:700;padding:0 1.1rem;margin-bottom:.5rem;flex:0 0 auto}
.torrent-col-labels span:nth-child(2),.torrent-col-labels span:nth-child(3){text-align:right}
.torrent-row-list{display:flex;flex-direction:column;flex:0 0 auto;gap:.6rem}
.torrent-row{border:1px solid #ffffff1a;border-radius:12px;padding:.9rem 1.1rem;background:#0a120fb3;position:relative}
.torrent-row.recommended{border-color:#f3c969;background:#2a230ccc;margin-top:.6rem}
.torrent-recommends-tag{position:absolute;top:-13px;left:1rem;display:inline-flex;align-items:center;gap:.3rem;background:var(--aqua);color:#1a1400;font-size:.68rem;font-weight:800;padding:.25rem .65rem;border-radius:999px;letter-spacing:.02em}
.torrent-recommends-tag::before{content:"★"}
.torrent-col-main{display:flex;align-items:center;gap:.6rem;min-width:0;flex-wrap:wrap}
.torrent-col-quality{font-size:1rem;font-weight:800;color:var(--ink)}
.torrent-col-encoding,.torrent-col-source{font-size:.72rem;font-weight:700;color:#c7d1ce;background:#ffffff14;padding:.22rem .55rem;border-radius:6px;white-space:nowrap}
.torrent-col-size{font-size:.88rem;color:var(--ink);text-align:right;white-space:nowrap}
.torrent-col-seeders{display:flex;align-items:center;justify-content:flex-end;gap:.35rem;font-size:.88rem;color:#6ee7a8;font-weight:700;white-space:nowrap}
.torrent-col-seeders svg{width:14px;height:14px}
.torrent-col-action{justify-self:end;padding:.55rem 1rem;min-height:38px;font-size:.82rem;white-space:nowrap}
.torrent-row-filename{margin-top:.5rem;color:var(--muted);font-size:.7rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.torrent-panel-footer{display:flex;align-items:center;justify-content:space-between;margin-top:1rem;flex:0 0 auto}
.file-selection-list{display:flex;flex-direction:column;gap:.4rem;max-height:40vh;overflow-y:auto;margin:.8rem 0}.file-selection-row{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;border:1px solid #ffffff14;border-radius:8px;font-size:.82rem}.file-selection-row span:first-of-type{flex:1;overflow-wrap:break-word}.file-selection-actions{display:flex;gap:.6rem;margin-top:.6rem;flex:0 0 auto}.file-selection-tools{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.6rem}.file-selection-tools .button{min-height:32px;padding:0 .8rem;font-size:.75rem}.file-selection-group{display:flex;flex-direction:column;gap:.3rem}.file-selection-group-head{display:flex;align-items:center;gap:.6rem;padding:.45rem .2rem;font-size:.8rem;font-weight:800;color:var(--ink)}.file-selection-group-head span:first-of-type{flex:1;overflow-wrap:anywhere}.file-selection-group [data-file-group-files]{display:flex;flex-direction:column;gap:.3rem;padding-left:1.2rem}.torrent-row-scope{margin-top:.45rem;color:var(--muted);font-size:.72rem}.torrent-row-scope.plausible{color:#e8c46a}.square-card .poster{aspect-ratio:1/1}.browse-controls{display:flex;align-items:center;justify-content:flex-end;gap:.8rem;flex-wrap:wrap}.sort-control{display:flex;align-items:center;gap:.55rem;color:var(--muted);font-size:.78rem;font-weight:700}.sort-control select{border:1px solid var(--line);border-radius:999px;background:#0b1715;color:white;padding:.62rem 2.2rem .62rem .9rem;cursor:pointer}.search-field{position:relative}.search-field .searchbox{padding-right:3.5rem}.search-field button{position:absolute;right:.65rem;top:50%;transform:translateY(-50%);width:38px;height:38px;border:0;border-radius:50%;background:transparent;color:var(--muted);font-size:1.5rem;cursor:pointer}.search-empty{border:1px dashed var(--line);border-radius:18px;margin:2rem auto;max-width:680px}.search-empty h2{color:var(--ink);margin:0 0 .5rem}.search-empty p{margin:0}.empty-state{grid-column:1/-1;border:1px dashed var(--line);border-radius:18px;padding:4rem 1rem;text-align:center;color:var(--muted)}.empty-state h2{color:var(--ink)}.detail-back{position:fixed;z-index:2;left:clamp(1rem,3vw,2rem);top:1rem;min-height:46px;border:1px solid #ffffff25;border-radius:999px;background:#07100de8;color:#fff;padding:0 1rem;font-weight:800;cursor:pointer;backdrop-filter:blur(12px)}.card h3{line-height:1.25}.poster img{background:#10201d}
@media(max-width:760px){.rail-controls{display:none}.browse-controls{justify-content:flex-start;margin-top:1rem}.sort-control{width:100%;justify-content:space-between}.sort-control select{flex:1;max-width:260px}.row-title>div:first-child{display:block}.row-title span{display:block;margin-top:.2rem}.media-row{grid-auto-columns:42vw;scroll-snap-type:x mandatory;padding-right:16vw}.detail-back{top:.7rem;left:.7rem}.detail-back span{display:none}.topbar{padding-right:4rem}.card h3{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:2.25em}.card p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}
.account-loading{display:grid;place-items:center;min-height:220px;color:var(--muted);text-align:center}.account-loading .loader{margin-bottom:1rem}

/* 1.3 native Photos */
.photos-page{min-height:100vh;padding:7rem clamp(1rem,4vw,4rem) 6rem}.photos-head{display:flex;align-items:end;justify-content:space-between;gap:1.5rem;margin-bottom:2rem}.photos-head h1{font-size:clamp(2.8rem,7vw,5.5rem);line-height:.9;letter-spacing:-.055em;margin:.45rem 0}.photo-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.55rem}.photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));grid-auto-rows:190px;gap:.5rem}.photo-tile{position:relative;border:0;border-radius:8px;padding:0;overflow:hidden;background:#10201d;cursor:pointer;min-width:0}.photo-tile img{width:100%;height:100%;display:block;object-fit:cover;transition:transform .25s,filter .25s}.photo-tile:hover img,.photo-tile:focus-visible img{transform:scale(1.045);filter:brightness(1.08)}.photo-tile span{position:absolute;right:.6rem;bottom:.5rem;text-shadow:0 2px 8px #000;font-size:1.2rem}.photo-group{margin:0 0 2.4rem}.photo-group h2{position:sticky;top:72px;z-index:2;width:max-content;background:#06100fe8;border:1px solid var(--line);border-radius:999px;padding:.5rem .85rem;font-size:.85rem;backdrop-filter:blur(12px)}.album-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:1rem}.photo-album{border:1px solid var(--line);border-radius:14px;overflow:hidden;padding:0 0 1rem;background:#0b1715;color:white;text-align:left;cursor:pointer}.photo-album img{width:100%;aspect-ratio:16/10;object-fit:cover;display:block;margin-bottom:.8rem}.photo-album strong,.photo-album span{display:block;padding:0 1rem}.photo-album span{color:var(--muted);font-size:.78rem;margin-top:.25rem}.photo-viewer{min-height:100%;display:grid;grid-template-columns:minmax(0,1fr) 260px;background:#020504}.photo-stage{min-height:100vh;display:grid;place-items:center;padding:4.5rem 1rem 1rem}.photo-stage img,.photo-stage video{max-width:100%;max-height:calc(100vh - 5.5rem);object-fit:contain}.photo-viewer aside{display:flex;flex-direction:column;gap:.7rem;padding:5rem 1.4rem 2rem;border-left:1px solid var(--line);background:#09110f}.photo-viewer aside span{color:var(--muted);font-size:.85rem}.photo-loading{height:45vh}.upload-state{min-height:45vh;display:grid;place-content:center;text-align:center;color:var(--muted)}.photo-search{margin-top:2.5rem}.photo-more{margin:1.5rem auto;display:flex}

@media(max-width:760px){.nav{grid-template-columns:repeat(5,minmax(0,1fr))}.nav a::before{font-size:.56rem}.photos-page{padding:5.2rem .65rem 6rem}.photos-head{display:block}.photo-actions{justify-content:flex-start;overflow-x:auto;flex-wrap:nowrap;padding:.8rem 0;scrollbar-width:thin;scrollbar-color:#31534d transparent}.photo-actions>*{flex:0 0 auto}.photo-actions [data-photo-upload]{position:sticky;right:0}.photo-grid{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:32vw;gap:3px}.photo-viewer{display:block}.photo-stage{min-height:calc(100vh - 110px);padding:4rem .3rem .3rem}.photo-viewer aside{border:0;border-top:1px solid var(--line);padding:1rem 1rem 5rem}.album-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.6rem}.photo-group h2{top:62px}.photo-search .photo-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}

.photo-stage{position:relative}.photo-nav{position:absolute;z-index:4;top:50%;translate:0 -50%;display:grid;place-items:center;width:48px;height:64px;border:1px solid #ffffff2b;border-radius:999px;background:#020504b8;color:white;font-size:2.3rem;cursor:pointer;backdrop-filter:blur(12px)}.photo-nav.previous{left:1.25rem}.photo-nav.next{right:1.25rem}.backup-panel{display:grid;gap:1rem;margin:0 0 2rem;padding:1.4rem;border:1px solid #65e2c43d;border-radius:18px;background:linear-gradient(145deg,#0f2823,#081310)}.backup-panel h2,.backup-panel p{margin:.2rem 0}.backup-panel p,.backup-panel small{color:var(--muted)}.backup-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:.55rem}.backup-groups span{display:grid;gap:.2rem;padding:.7rem;border-radius:10px;background:#ffffff08;color:var(--aqua);font-size:.78rem}.backup-groups strong{color:white}
.intake-launch,.intake-upload{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin:0 0 1.2rem;padding:1.4rem;border:1px solid #65e2c43d;border-radius:18px;background:linear-gradient(145deg,#0f2823,#081310)}.intake-launch h2,.intake-launch p,.intake-upload h2,.intake-upload p{margin:.2rem 0}.intake-launch p,.intake-upload p,.intake-section>p{color:var(--muted)}.intake-upload{flex-wrap:wrap}.intake-upload-actions,.intake-actions{display:flex;gap:.65rem;flex-wrap:wrap}.intake-progress{flex-basis:100%;padding:.75rem;border-radius:10px;background:#ffffff0b;color:var(--aqua)}.intake-progress.bad{color:#ff9d9d}.intake-section{margin:2rem 0}.section-heading{display:flex;align-items:end;justify-content:space-between;gap:1rem;margin-bottom:1rem}.section-heading h2{margin:.2rem 0}.section-heading>span{color:var(--muted)}.intake-card{display:grid;gap:1rem;margin:0 0 1rem;padding:1.2rem;border:1px solid var(--line);border-radius:16px;background:#ffffff08}.intake-card-head{display:flex;justify-content:space-between;gap:1rem}.intake-card-head h3{margin:.45rem 0 .25rem}.intake-card-head p{margin:0;color:var(--muted)}.intake-state{display:inline-block;padding:.25rem .55rem;border-radius:999px;background:#ffffff10;color:#ffcb79;font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em}.intake-state.ready{color:var(--aqua);background:#43dfc014}.intake-state.failed{color:#ff9d9d;background:#ff9d9d14}.progress-track{height:6px;border-radius:999px;background:#ffffff10;overflow:hidden}.progress-fill{height:100%;background:var(--aqua);border-radius:999px}.intake-files{display:grid;gap:.45rem;margin:0;padding:0;list-style:none}.intake-files li{display:grid;gap:.15rem;padding:.6rem .7rem;border-radius:9px;background:#02070666;overflow-wrap:anywhere}.intake-files small,.health-review small{color:var(--muted)}.intake-proposal{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.intake-proposal span{color:var(--muted);margin-right:.25rem}.intake-proposal strong{padding:.4rem .6rem;border-radius:8px;background:#43dfc014;color:var(--aqua)}.health-review{display:grid;gap:.3rem;margin:.6rem 0;padding:.85rem;border-left:3px solid #ffbd69;border-radius:8px;background:#ffffff08;overflow-wrap:anywhere}.healthy-list{margin-top:1rem;padding:1rem;border:1px solid var(--line);border-radius:12px}.healthy-list summary{cursor:pointer;color:var(--aqua)}.healthy-list div{display:grid;gap:.15rem;padding:.6rem 0;border-bottom:1px solid #ffffff0d;overflow-wrap:anywhere}.healthy-list small{color:var(--muted)}.empty-state.compact{min-height:0;padding:2rem}
@media(max-width:760px){.intake-launch,.intake-upload,.section-heading,.intake-card-head{align-items:stretch;flex-direction:column}.intake-upload-actions .button,.intake-actions .button{flex:1}.intake-card-head>strong{color:var(--muted)}}
.native-player{position:fixed;inset:0;z-index:90;background:#020504;color:white}.playback-error{position:fixed;inset:0;z-index:90;display:grid;place-items:center;padding:2rem;background:radial-gradient(circle at 70% 20%,#164c43,transparent 40rem),#030807}.playback-error>div{max-width:580px}body.has-music-player,body.has-book-player,body.has-music-player .detail-shell,body.has-book-player .detail-shell{padding-bottom:120px}.track-play{border:0;border-radius:50%;width:34px;height:34px;display:grid;place-items:center;background:var(--aqua);color:#04100e;cursor:pointer;flex:0 0 auto}.track-play svg{width:21px;height:21px}.continue-card p{color:var(--aqua)}
/* Shared Aqua Fortis loading / error / busy states */
.af-loading{display:grid;place-items:center;gap:.9rem;padding:3rem 1rem;text-align:center;color:var(--muted)}
.af-loading p{margin:0;font-size:.85rem}
.af-loading-ring{width:34px;height:34px;position:relative}
.af-loading-ring::before{content:"";position:absolute;inset:0;margin:auto;width:14px;height:14px;background:var(--aqua);transform:rotate(45deg);border-radius:3px;animation:af-spin 1s linear infinite;box-shadow:0 0 16px #43dfc066}
@keyframes af-spin{to{transform:rotate(405deg)}}
.af-loading-screen{position:fixed;inset:0;z-index:90;display:grid;place-items:center;background:radial-gradient(circle at 70% 20%,#164c43,transparent 40rem),#030807;color:white}
.af-loading-screen [data-player-back],.af-loading-screen [data-back]{position:absolute;top:1.1rem;left:1.25rem}
.af-error{display:grid;place-items:center;gap:.8rem;padding:3rem 1.5rem;text-align:center;color:#ffb3a9;max-width:420px;margin:0 auto}
.af-error p{margin:0}
.af-busy{position:relative;pointer-events:none;opacity:.55}
.af-busy::after{content:"";position:absolute;inset:0;margin:auto;width:16px;height:16px;background:var(--aqua);transform:rotate(45deg);border-radius:3px;animation:af-spin 1s linear infinite}
.af-toast{position:fixed;z-index:120;left:50%;bottom:24px;transform:translate(-50%,20px);padding:.8rem 1.2rem;border-radius:12px;background:#0c1918f2;border:1px solid var(--line);color:#ffb3a9;font-size:.85rem;box-shadow:var(--shadow);backdrop-filter:blur(16px);opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;max-width:min(360px,80vw);text-align:center}
.af-toast.visible{opacity:1;transform:translate(-50%,0)}
/* Channels */
.channel-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1.5rem}
/* Channel card: artwork spans the whole card as a layered background (not a cropped strip above a
   separate panel) and fades into the info area via .channel-scrim, per the composition principle
   that different source artwork (posters, programme stills, channel logos) should stay recognisable
   rather than being forced into one aggressive crop. Aspect ratio is fixed on the card itself (not
   derived from content) specifically so every card in a row stretches to the same height regardless
   of title/programme text length -- the artwork fit adapts to the image inside it instead. */
.channel-card{position:relative;border:1px solid var(--line);border-radius:16px;overflow:hidden;background:#10201d;aspect-ratio:3/4;display:block}
.channel-art{position:absolute;inset:0;overflow:hidden;background:#10201d}
/* Blurred continuation of the SAME real artwork, shown only behind a contain-fit image so a
   portrait poster or a narrow logo doesn't leave flat bare bars -- never a different/generated image. */
.channel-art .art-backdrop{position:absolute;inset:-14%;background-size:cover;background-position:center;filter:blur(20px) brightness(.7) saturate(1.25);transform:scale(1.06);opacity:0;transition:opacity .25s}
.channel-art.contain-fit .art-backdrop{opacity:1}
.channel-art>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center top;display:block}
/* Toggled by measuring the real image's natural dimensions once loaded (see the capture-phase
   'load' listener) -- landscape-ish artwork (programme stills, wide logos) covers naturally; anything
   notably taller/narrower (movie posters, square/tall logos) is fully preserved via contain instead
   of being zoomed until part of it disappears. */
.channel-art.contain-fit>img{object-fit:contain}
.channel-art .fallback-cover{position:absolute;inset:0;width:100%;height:100%}
/* Top edge, not bottom -- the info overlay now occupies the bottom of the whole card, so a
   bottom-anchored bar would sit hidden behind/under the programme text instead of being visible. */
.channel-art .progress{position:absolute;left:0;right:0;top:0;height:4px;background:#ffffff33;z-index:2}
.channel-art .progress i{display:block;height:100%;background:var(--aqua)}
/* Gradient fade standing in for the old hard image/panel seam -- artwork dominates the upper card
   and gradually disappears behind the info region rather than stopping at a visible line. */
.channel-scrim{position:absolute;inset:0;background:linear-gradient(180deg,transparent 0%,transparent 38%,rgba(5,11,11,.5) 60%,rgba(5,11,11,.92) 80%,#050b0b 100%);pointer-events:none}
.channel-info{position:absolute;left:0;right:0;bottom:0;padding:1rem 1.1rem 1.2rem;display:flex;flex-direction:column}
.channel-number{display:inline-block;font-size:.72rem;font-weight:800;letter-spacing:.08em;color:var(--aqua);background:#43dfc014;border-radius:999px;padding:.2rem .55rem;margin-bottom:.5rem;align-self:flex-start}
.channel-info h3{margin:0 0 .4rem;font-size:1.15rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* NOW titles may wrap once; truncation only after the second line. */
.channel-now{color:var(--ink);font-weight:700;margin:0;white-space:normal;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:anywhere}
.channel-now.no-epg{color:var(--muted);font-weight:600;font-style:italic}
.channel-next{color:var(--muted);font-size:.82rem;margin:.2rem 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Now / Next: a small label, then the programme; the episode line carries the full SxEy identifier. */
.channel-label{display:inline-block;margin-right:.4rem;font-size:.66rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--aqua);vertical-align:.12em}
.channel-next .channel-label{color:#c9d4d2}
.channel-next{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-top:.45rem}
.channel-episode{margin:.15rem 0 0;color:#dbe5e3;font-size:.84rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Official channel logo as the identity mark. Dark-ink logos (RIFF, EMBER, SPN) sit on a light plate. */
.channel-info h3.channel-identity{margin:0 0 .55rem;line-height:0}
.channel-info h3.channel-identity.is-artwork{margin:0}
.channel-logo{display:block;height:30px;width:auto;max-width:72%;object-fit:contain;object-position:left center;filter:drop-shadow(0 1px 3px #000c)}
.channel-logo:is([src*="/riff."],[src*="/ember."],[src*="/spn."]){height:32px;padding:4px 9px;border-radius:6px;background:#f4f1eaf0;box-sizing:border-box}
/* The same logos as tier-2 artwork (no programme artwork): centred in the upper card, plated likewise. */
.channel-art>img[src^="/channel-logos/"]{object-fit:contain;padding:12% 10% 50%;box-sizing:border-box}
.channel-art>img:is([src*="/riff."],[src*="/ember."],[src*="/spn."])[src^="/channel-logos/"]{background:#f1eee6}
.channel-card.compact .channel-info{padding:.8rem .85rem .9rem}
.channel-card.compact .channel-logo{height:26px}
.channel-card.compact .channel-logo:is([src*="/riff."],[src*="/ember."],[src*="/spn."]){height:28px}
.channel-card.compact .channel-now{font-size:.95rem}
.channel-info .actions{margin-top:.9rem;display:flex;align-items:center;gap:.6rem;flex-wrap:wrap}
.channel-info .actions .button{padding:.5rem .85rem;min-height:32px;font-size:.78rem}
.channel-info .actions .button.icon-only{padding:0;width:32px;height:32px;min-height:32px;border-radius:50%;flex:0 0 auto}
.channel-info .actions .button.icon-only .icon{width:21px;height:21px}
.live-badge{display:inline-block;background:#ff4d4f;color:white;font-size:.65rem;font-weight:800;letter-spacing:.06em;border-radius:4px;padding:.15rem .4rem;margin-right:.5rem;vertical-align:middle}
.live-indicator{display:inline-flex;align-items:center;gap:.35rem;color:#ff6b6d;font-size:.78rem;font-weight:800;letter-spacing:.04em}
/* Channels/Surf/Guide sub-nav */
.channels-subnav{display:flex;gap:.5rem;margin:0 0 1.5rem}
.channels-subnav .chip{cursor:pointer}
.surf-guide-link{margin-left:auto}
.surf-episode{color:var(--muted);font-size:.9rem;margin:-.4rem 0 .6rem}
/* Guide */
.guide-nav{display:flex;align-items:center;gap:.7rem;margin-bottom:1.2rem}
.guide-nav.mobile{display:none;margin-top:1rem}
.guide-grid{position:relative;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#ffffff05}
.guide-now-line{position:absolute;top:0;bottom:0;width:2px;background:var(--aqua);box-shadow:0 0 8px #43dfc088;z-index:3;pointer-events:none}
.guide-header{display:flex;border-bottom:1px solid var(--line);background:#07110fcc}
.guide-row{display:flex;border-bottom:1px solid var(--line)}
.guide-row:last-child{border-bottom:0}
.guide-channel-label{flex:0 0 150px;padding:.7rem .9rem;display:flex;flex-direction:column;justify-content:center;gap:.15rem;border-right:1px solid var(--line)}
.guide-channel-label strong{font-size:.85rem;line-height:1.2}
.guide-header .guide-channel-label{border-right:1px solid var(--line)}
.guide-timeline{position:relative;flex:1;min-height:58px}
.guide-header .guide-timeline{min-height:34px}
.guide-hour{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding-left:.4rem;color:var(--muted);font-size:.72rem;font-variant-numeric:tabular-nums;border-left:1px solid var(--line)}
.guide-block{position:absolute;top:.3rem;bottom:.3rem;border:1px solid var(--line);border-radius:7px;background:#ffffff0c;color:var(--ink);text-align:left;padding:.4rem .55rem;overflow:hidden;cursor:pointer;transition:background .15s}
.guide-block:hover{background:#ffffff1c}
.guide-block.current{background:#43dfc01c;border-color:#43dfc055}
.guide-block-title{display:block;font-size:.78rem;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Guide mobile list */
.guide-mobile{display:none}
.guide-mobile-heading{font-size:1.3rem;margin:0 0 1rem}
.guide-mobile-card{display:grid;grid-template-columns:auto 1fr;align-items:center;column-gap:.8rem;row-gap:.15rem;width:100%;text-align:left;border:1px solid var(--line);border-radius:12px;background:#ffffff08;color:var(--ink);padding:.8rem .9rem;margin-bottom:.7rem;cursor:pointer}
.guide-mobile-card .channel-number{grid-row:1/3}
.guide-mobile-card strong{font-size:.95rem}
.guide-mobile-title{font-weight:700}
.guide-mobile-sub{color:var(--muted);font-size:.8rem}
.guide-mobile-time{color:var(--muted);font-size:.78rem;font-variant-numeric:tabular-nums}
/* Guide detail panel */
.guide-panel-root{position:fixed;inset:0;z-index:95;display:grid;place-items:center;padding:1rem}
.guide-panel-backdrop{position:absolute;inset:0;background:#020504cc;backdrop-filter:blur(6px)}
.guide-panel{position:relative;width:min(420px,100%);border-radius:18px;overflow:hidden;background:#0c1918f5;border:1px solid var(--line);box-shadow:var(--shadow)}
.guide-panel-close{position:absolute;top:.8rem;left:.8rem;z-index:2}
.guide-panel-art{width:100%;aspect-ratio:16/9;object-fit:cover;display:block}
.guide-panel-body{padding:1.3rem 1.4rem 1.6rem}
.guide-panel-body h2{margin:0 0 .2rem;font-size:1.4rem;letter-spacing:-.02em}
.guide-panel-sub{color:var(--aqua);font-size:.82rem;font-weight:700;margin:0 0 .6rem}
.guide-panel-channel{color:var(--muted);margin:0}
.guide-panel-time{color:#cfe0db;margin:.2rem 0}
.guide-panel-state{color:var(--aqua);font-size:.78rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;margin:0 0 1rem}
.guide-panel-body .actions{display:flex;gap:.6rem;flex-wrap:wrap}
/* Surf mode */
.surf-view{position:relative;overflow:hidden;display:grid;grid-template-rows:auto 1fr auto;place-items:center;text-align:center;padding:0 1.5rem}
.surf-atmosphere{position:absolute;inset:0;z-index:0;background-image:var(--surf-art);background-size:cover;background-position:center;filter:blur(80px) brightness(.32) saturate(1.3);transform:scale(1.35)}
.surf-view::after{content:"";position:absolute;inset:0;z-index:0;background:radial-gradient(circle at 50% 30%,transparent,#030807e0 75%)}
.surf-view .player-top{position:relative;justify-self:start}
.surf-content{position:relative;z-index:1;display:grid;justify-items:center;gap:.4rem;max-width:640px}
.surf-content .channel-number{display:inline-block;font-size:.75rem;font-weight:800;letter-spacing:.1em;color:var(--aqua);background:#43dfc014;border-radius:999px;padding:.25rem .7rem}
.surf-content h2{margin:.3rem 0 0;font-size:1rem;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}
.surf-content h1{margin:.4rem 0 .8rem;font-size:clamp(2.2rem,6vw,3.6rem);letter-spacing:-.03em;line-height:1.02}
.surf-status{color:#cfe0db;font-size:.9rem;line-height:1.5;margin:0 0 1.3rem}
.surf-content .actions{display:flex;gap:.7rem;flex-wrap:wrap;justify-content:center}
.surf-next{color:var(--muted);font-size:.85rem;line-height:1.6;margin-top:1.6rem}
.surf-next strong{color:var(--ink);display:block;font-size:1rem}
.surf-nav{position:relative;z-index:1;display:flex;gap:1rem;padding:1.8rem 0 2.2rem;flex-wrap:wrap;justify-content:center}
.card.now-playing .poster{outline:2px solid var(--aqua);outline-offset:2px}
.card.now-playing h3{color:var(--aqua)}
.track-item.now-playing,.episode-card.now-playing strong{color:var(--aqua)}
.track-item.now-playing .track-play,.episode-card.now-playing .episode-play{background:var(--aqua);box-shadow:0 0 0 3px #43dfc033}
/* Restrained live progress treatment (Global Music Playback Presentation, Pass 1): a plain fill behind
   the row's own existing text/border, width driven by --track-progress (set from the same global
   musicAudio.currentTime/duration already used everywhere else) -- no new child element, no row
   restructuring, so it fits the current .track-item grid exactly as it already exists. */
.track-item.now-playing{background:linear-gradient(90deg,#D7C84F1f var(--track-progress,0%),transparent var(--track-progress,0%))}
.track-item .track-time{font-variant-numeric:tabular-nums}
.book-shelf-card.now-playing .book-cover{outline:2px solid var(--aqua);outline-offset:2px}

/* ===========================================================================
   AUDIO CORRECTION PASS -- Artist split (Popular Songs / Albums & Releases)
   Corrects: identity too large/duplicated, loose/detached song rows, no
   internal-scroll trap, undersized release artwork, over-prominent Jellyfin
   link. See renderArtistDetail/renderAlbumDetail (app.js) and the shared
   .artist-header/.detail-backdrop sizing correction further below.
   =========================================================================== */
/* Both intentions visible together on wide layouts without travelling through one entire section to
   reach the other. Releases get a touch more of the width since its artwork needs it more than the
   now-compact song rows do. .single (no releases at all) collapses to one column so a sparse artist
   never leaves a fabricated empty second panel. No internal scroll on the Songs column any more -- a
   dense artist's tracklist is allowed to make the page taller, never a nested scrolling pane. */
.artist-split{display:grid;grid-template-columns:minmax(300px,1fr) minmax(400px,1.25fr);gap:clamp(1.5rem,3vw,3rem);align-items:start}
.artist-split.single{grid-template-columns:1fr}
.artist-songs .tracklist,.album-tracks .tracklist{margin:0;max-width:none}
/* Release artwork scaled up substantially -- this is the visual browsing alternative to immediately
   playing a song, so it needs to actually be recognisable, matching the same minmax the rest of the
   app already uses for square album art (.music-grid). */
.artist-release-grid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:1.2rem}
.album-artist-link{appearance:none;border:0;background:none;padding:0;margin:.35rem 0 0;display:block;color:var(--aqua);font:700 1.05rem inherit;cursor:pointer;text-align:left}
.album-artist-link:hover,.album-artist-link:focus-visible{text-decoration:underline}
.album-artist{color:var(--aqua);font-weight:700;margin:.35rem 0 0}
/* The only action a bare Artist page has today is "Open in Jellyfin" -- as the sole button in the
   header it read as the star action, more prominent than the real NitrOS listening/browsing below it.
   Downgraded to the same restrained, borderless treatment .button.ghost already uses elsewhere,
   scoped to real external links only (the Play button, a <button>, is untouched). */
.artist-header .actions a.button{background:transparent;border:1px solid transparent;color:var(--muted);padding:.85rem .3rem;min-height:auto;backdrop-filter:none}
.artist-header .actions a.button:hover{color:var(--ink);text-decoration:underline}
@media(max-width:900px){.artist-split{grid-template-columns:1fr}}
/* Compact, coherent music row: one leading play control, one title+secondary text block, one trailing
   time -- corrects the previous 4-child row that had no matching 4th grid column (the play button was
   silently wrapping underneath the title). Reuses .ctrl-btn's existing icon-button chrome instead of an
   unstyled bare <button>. */
.track-item{grid-template-columns:auto minmax(0,1fr) auto;gap:.85rem;padding:.5rem .3rem;border-radius:10px}
.track-item:hover:not(.now-playing){background:#ffffff08}
.track-item .track-play{width:36px;height:36px;flex:none}
.track-item.now-playing .track-play,.track-item:hover .track-play{background:var(--aqua);color:#03100e;border-color:transparent}
.track-copy{display:flex;flex-direction:column;gap:.1rem;min-width:0}
.track-copy strong{font-size:.94rem;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.track-number{color:var(--muted);font-variant-numeric:tabular-nums;margin-right:.5rem;font-size:.95rem}
.track-secondary{color:var(--muted);font-size:.87rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.track-item .track-time{color:var(--muted);font-size:.92rem;white-space:nowrap;justify-self:end}
@media(max-width:760px){.track-item{grid-template-columns:auto minmax(0,1fr) auto}}

/* ===========================================================================
   AUDIO EXPERIENCE PASS -- Audiobook personal-library shelf (Library, Author
   Library, Book-page series row) + book focus/peek
   =========================================================================== */
/* flex-wrap (not the fixed-column .grid) so an inline A-Z divider or a series spine can
   sit directly in the sequence with the cards -- still fully responsive, still no hardcoded per-row
   count. Natural 2:3 cover geometry, same as every other poster in the app. */
.book-shelf{display:flex;flex-wrap:wrap;align-items:flex-end;gap:1.6rem 1.2rem;padding:.4rem 0 1rem}
.book-shelf-card{position:relative;width:172px;flex:0 0 auto;outline:none;cursor:pointer}
.book-shelf-card.shelf-group-start{margin-left:1rem}
.shelf-az{align-self:flex-end;height:238px;min-width:34px;display:flex;align-items:center;justify-content:center;border-left:1px solid #43dfc04d;border-right:1px solid var(--line);color:var(--aqua);font:700 2rem "Georgia",serif;margin:0 .3rem}.shelf-spine{align-self:flex-end;position:relative;width:38px;height:258px;flex:0 0 38px;display:grid;place-items:center;overflow:hidden;border-left:1px solid #43dfc04d;border-right:1px solid var(--line);background:linear-gradient(90deg,#0a1715,#10231f 48%,#091310);box-shadow:inset 1px 0 #ffffff0d,inset -1px 0 #0008;color:var(--aqua);margin:0 .1rem}.shelf-spine span{max-height:calc(100% - 1.4rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;writing-mode:vertical-rl;transform:rotate(180deg);font:700 clamp(.68rem,.9vw,.88rem)/1.1 system-ui,sans-serif;letter-spacing:.055em;text-transform:uppercase}.book-cover{aspect-ratio:2/3;border-radius:6px;overflow:hidden;background:#10201d;position:relative;box-shadow:0 10px 26px #0007;transition:transform .2s ease,box-shadow .2s ease}
.book-cover img{width:100%;height:100%;object-fit:cover;display:block}
.book-shelf-card:hover,.book-shelf-card:focus-within{z-index:20}
/* The focused cover is the primary visual object -- scaled ~1.35x (not the info panel, which stays its
   own fixed size) and layered above neighbours via z-index/transform only, so the shelf itself never
   reflows. */
.book-shelf-card:hover .book-cover,.book-shelf-card:focus-within .book-cover{transform:translateY(-20px) scale(1.35);box-shadow:0 26px 54px #000c}
.book-peek{position:absolute;top:0;left:calc(100% + 20px);width:250px;padding:1rem 1.1rem;background:#07100dfa;border:1px solid #43dfc040;border-radius:12px;box-shadow:0 22px 50px #000c;opacity:0;pointer-events:none;transform:translateY(4px);transition:opacity .16s ease,transform .16s ease}
/* "Movie UI Refinements", Task C: the movie hero's hover/focus/tap-to-expand synopsis -- the SAME
   opacity+pointer-events overlay mechanism .book-peek above already uses, absolutely positioned so the
   expanded text covers whatever sits below it (the collection rail further down the page) rather than
   pushing it down. `.touched` is the tap-toggle class the dedicated click listener applies on touch. */
.synopsis-reveal{position:relative}.synopsis-reveal.is-truncated{cursor:pointer}
.synopsis-reveal .overview{margin:.8rem 0 0}
.synopsis-full{position:absolute;bottom:0;left:0;right:0;z-index:3;padding:1rem 1.2rem;background:#07100dfa;border:1px solid #43dfc040;border-radius:12px;box-shadow:0 22px 50px #000c;opacity:0;pointer-events:none;max-height:min(60vh,480px);overflow-y:auto}
.synopsis-full p{margin:0;color:#ccd7d3;line-height:1.7;font-size:1rem}
/* Build 273: opened only by the 400 ms hover/focus intent, a tap or Enter (app.js armSynopsis), and only
   when the text is truncated; it fades in but closes at once. */
.synopsis-reveal.is-truncated.expanded .synopsis-full{opacity:1;pointer-events:auto;transition:opacity .16s ease}
.book-shelf-card.peek-left .book-peek{left:auto;right:calc(100% + 20px)}
.book-shelf-card:hover .book-peek,.book-shelf-card:focus-within .book-peek{opacity:1;transform:none;pointer-events:auto}
.book-peek h3{font-size:1.15rem;margin:.25rem 0;line-height:1.15}
.book-peek .eyebrow{font-size:.71rem}
.book-peek-author,.book-peek-meta{color:var(--muted);font-size:.8rem;margin:.15rem 0}
/* Build 273: the complete synopsis, no line clamp; the peek scrolls only if it is taller than the viewport. */
.book-peek-synopsis{color:#c8d0d0;font-size:.82rem;line-height:1.45;margin:.5rem 0 0}
.book-peek{max-height:calc(100vh - 1rem);overflow-y:auto;overscroll-behavior:contain}

/* Author Library reuses the rich detail canvas. These rules only compose its permanent Author
   identity and rotating book content within that canvas. */
.author-library .detail-hero{--nitros-art-media-start:30%;--nitros-art-blend:22%;align-items:stretch;min-height:clamp(500px,58vh,680px)}
.author-library .detail-hero .detail-back{position:absolute;top:clamp(4.75rem,8vh,6.5rem);left:clamp(1rem,3vw,2rem)}
/* Movie/TV detail needs the exact same correction Author Library already carries above: .detail-back
   is a direct child of .nitros-art-hero, and .nitros-art-hero>:not(.nitros-art-media){position:
   relative;z-index:2} (specificity (0,2,0)) always wins over .detail-back's own generic position:
   fixed rule (0,1,0), turning it into an in-flow flex item that lands bottom-left instead of staying
   pinned top-left. This selector's specificity (0,3,0) wins outright, regardless of source order. */
.rich-detail .detail-hero .detail-back{position:absolute;top:clamp(1rem,3vh,1.5rem);left:clamp(1rem,3vw,2rem);z-index:5}
.author-feature-atmosphere{transition:opacity .18s ease}.author-feature-atmosphere.is-changing{opacity:0}
/* .dimmed-art-atmosphere is the cross-media detail alignment's shared name for this exact same
   treatment -- merged here rather than duplicated (richHero()'s own backdropUrl/atmosphereClass
   options for Audiobook/Artist/Album/Track all pass this class). .author-book-art is kept as a
   second selector on the same rule purely so Author Library's own markup needs no change. */
.author-book-art,.dimmed-art-atmosphere{filter:brightness(.34) saturate(.52)}
.author-feature-layout{position:relative;z-index:2;display:grid;grid-template-columns:minmax(300px,.78fr) minmax(360px,1fr);align-items:center;gap:clamp(2rem,7vw,8rem);width:100%;padding:clamp(8.5rem,18vh,11rem) clamp(1.5rem,6vw,5rem) clamp(2.25rem,6vh,3.5rem)}
.author-library .author-feature-identity{display:flex;align-items:center;gap:clamp(1.15rem,2.5vw,2rem);min-width:0}
.author-library .author-feature-identity .detail-poster{width:clamp(154px,15vw,230px);margin:0;flex:none;box-shadow:0 18px 44px #000b}
.author-library .author-feature-identity h2{font-size:clamp(1.7rem,3vw,2.65rem);line-height:1;margin:.3rem 0 .5rem;text-shadow:0 10px 34px rgba(0,0,0,.55)}
.author-library .author-feature-identity p{margin:0;color:var(--muted)}
.author-feature-book{justify-self:end;width:min(100%,640px);min-width:0;text-shadow:0 10px 34px rgba(0,0,0,.68);transition:opacity .18s ease}.author-feature-book.is-changing{opacity:0}
.author-feature-book h1{font-size:clamp(2rem,4vw,3.7rem);line-height:.98;letter-spacing:-.04em;margin:0 0 .85rem}
.author-feature-overview{max-width:60ch;margin:0;color:#d4dfdb;line-height:1.55;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.author-feature-book .meta-line{margin:.85rem 0 0;color:var(--aqua);font-weight:700}
.author-feature-book .actions{margin-top:1.25rem}
.author-feature-indicators{display:flex;align-items:center;gap:.65rem;color:#d7e1de;font-size:.75rem;white-space:nowrap}
.author-feature-indicators i{display:flex;gap:.28rem;font-style:normal}.author-feature-indicators b{width:.35rem;height:.35rem;border-radius:50%;background:#ffffff66;transition:background .18s,transform .18s}.author-feature-indicators b.active{background:var(--aqua);transform:scale(1.25)}
.author-library .author-book-shelf{margin-top:0}
/* The compact identity header above no longer needs a full 66vh atmospheric backdrop behind it -- at
   that height it just duplicated the same artist/album artwork the (now much smaller) poster already
   shows. Capped well below the header's own height so it reads as a subtle atmosphere, not a second
   copy of the artwork. */
/* .artist-detail/.album-detail now use richHero()'s .detail-hero, not .detail-backdrop -- this
   rule's selector no longer matches anything live and was removed; see the cross-media detail
   alignment comments on renderArtistDetail()/renderAlbumDetail() in web/app.js. */
/* .book-detail now uses richHero()/.detail-hero -- no backdrop at all when the item has no genuine
   one is handled there (dimmed-art-atmosphere over the cover instead), and the old .book-lower-split
   side-by-side synopsis/series-shelf layout is gone with it (the series shelf now simply follows
   .detail-support in normal flow, same as every other rich-detail page's related content). See the
   cross-media detail alignment comment above renderBookDetail() in web/app.js. */
/* The series shelf now sits directly below .detail-support in normal flow (the old narrow
   .book-lower-split sidebar column is gone -- see the cross-media detail alignment comment on
   renderBookDetail()), so it had no width/padding rule of its own at all and was rendering
   edge-to-edge. Matches .detail-support's own content-width convention for visual alignment, and
   the book-shelf-card-width override that used to shrink cards to fit that old narrow column is
   removed entirely -- cards now use the same 172px default size as every other book shelf
   (Audiobook Home, Author Library), and audiobookShelf()/bookShelfCard() themselves are completely
   unchanged: flex-wrap already accommodates any number of books without clipping, exactly as it
   already does everywhere else this same component is used. */
.book-series-shelf{padding:0 clamp(1.5rem,6vw,5rem) 2.5rem;max-width:1800px;margin:0 auto}
@media(max-width:900px){.book-peek{width:220px}}
@media(max-width:760px){
 .book-shelf-card{width:126px}
 .shelf-az{height:188px;min-width:28px;font-size:1.5rem} .shelf-spine{width:30px;height:189px;flex-basis:30px}.shelf-spine span{max-height:calc(100% - 1rem);font-size:.65rem;letter-spacing:.04em}
 /* No real hover on touch -- the peek becomes a fixed bottom sheet, matching the accepted concept
    material, so the left/right edge computation (a desktop-only concern) simply doesn't apply here. */
 .book-peek{position:fixed;left:.8rem;right:.8rem;top:auto;bottom:5.5rem;width:auto;max-height:calc(100vh - 12rem)}
 .book-shelf-card.peek-left .book-peek{right:.8rem}
}
/* Aqua Fortis playback presentation: shared icon + control language */
/* Build 218: app-wide visual legibility -- interactive-control icons +~30%. This is the ONE shared base
   rule every icon() call (play/pause/seek/volume/shuffle/repeat/queue/fullscreen/back/close/search/
   settings/etc, across the video player, music/audiobook mini-players and full-page players, and every
   icon+text button) renders through, so this single change is what propagates the increase broadly
   without per-instance overrides. em-based, so it already scales with each button's own font-size --
   button/badge DIMENSIONS are untouched; only the artwork inside grows. The handful of contexts below
   that override .icon's width/height explicitly (informational/standalone icons, or an interactive
   control whose own container is sized in px rather than em) get their own matching +30%/+40% treatment
   at their own rule, never a second base-rule change. */
.icon{width:1.5em;height:1.5em;display:block}
.ctrl-btn{display:inline-flex;align-items:center;justify-content:center;width:42px;height:42px;flex:0 0 auto;border-radius:50%;border:1px solid var(--line);background:#0c1a18b3;color:#eafff9;cursor:pointer;backdrop-filter:blur(10px);transition:background .15s,transform .12s}
.ctrl-btn:hover{background:#ffffff26}
.ctrl-btn:active{transform:scale(.94)}
.ctrl-btn.primary{background:var(--aqua);color:#03100e;border-color:transparent}
.ctrl-btn.primary:hover{background:#72f5dc}
.ctrl-btn.large{width:62px;height:62px}
.ctrl-btn.large .icon{width:1.8em;height:1.8em}
.ctrl-btn.select-wrap{position:relative;overflow:hidden}
.ctrl-btn.select-wrap select{position:absolute;inset:0;opacity:0;cursor:pointer;border:0}
input[type=range].af-seek{-webkit-appearance:none;appearance:none;background:transparent;cursor:pointer;--fill:0%}
input[type=range].af-seek::-webkit-slider-runnable-track{height:4px;border-radius:3px;background:linear-gradient(90deg,var(--aqua) 0%,var(--aqua) var(--fill),#ffffff2b var(--fill),#ffffff2b 100%)}
input[type=range].af-seek::-webkit-slider-thumb{-webkit-appearance:none;width:13px;height:13px;margin-top:-4.5px;background:var(--aqua);transform:rotate(45deg);border-radius:3px;box-shadow:0 0 0 4px #43dfc026;cursor:pointer}
input[type=range].af-seek::-moz-range-track{height:4px;border-radius:3px;background:#ffffff2b}
input[type=range].af-seek::-moz-range-progress{height:4px;border-radius:3px;background:var(--aqua)}
input[type=range].af-seek::-moz-range-thumb{width:13px;height:13px;background:var(--aqua);transform:rotate(45deg);border:0;border-radius:3px;box-shadow:0 0 0 4px #43dfc026}
.dock-more{position:relative}
.dock-menu{position:absolute;bottom:52px;right:0;min-width:200px;padding:.4rem;border:1px solid var(--line);border-radius:12px;background:#0c1918f2;backdrop-filter:blur(16px);box-shadow:var(--shadow);display:grid;gap:.15rem;z-index:6}
.dock-menu[hidden]{display:none}
.dock-menu a{color:#dce7e3;text-decoration:none;padding:.6rem .7rem;border-radius:8px;font-size:.85rem;display:block}
.dock-menu a:hover{background:#ffffff14}
/* Video */
.video-stage{overflow:hidden}
.video-stage video{position:absolute;inset:0;width:100%;height:100%;background:#000;object-fit:contain}
.player-scrim{position:absolute;left:0;right:0;z-index:1;pointer-events:none;transition:opacity .3s}
.player-scrim.top{top:0;height:150px;background:linear-gradient(#000a,transparent)}
.player-scrim.bottom{bottom:0;height:220px;background:linear-gradient(transparent,#000c)}
.player-top{position:absolute;z-index:3;top:0;left:0;right:0;display:flex;align-items:center;gap:1rem;padding:1.1rem 1.25rem;transition:opacity .3s}
.player-title{display:grid;min-width:0}
.player-title strong{font-size:1rem;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.player-title span{color:#b9c7c2;font-size:.9rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.player-dock{position:absolute;z-index:3;left:0;right:0;bottom:0;padding:.4rem clamp(1rem,3vw,2.2rem) 1.2rem;display:grid;gap:.7rem;transition:opacity .3s}
.seek-row{padding:0 .1rem}
.seek-row .af-seek{width:100%}
.dock-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
.dock-row .time-elapsed,.dock-row .time-sep,.dock-row .time-total{color:#cfe0db;font-variant-numeric:tabular-nums;font-size:.8rem}
.dock-spacer{flex:1}
.volume-group{display:flex;align-items:center;gap:.5rem}
.volume-group .af-seek{width:84px}
.video-player.controls-hidden .player-top,.video-player.controls-hidden .player-dock,.video-player.controls-hidden .player-scrim{opacity:0;pointer-events:none}
.video-player.controls-hidden{cursor:none}
.next-episode{position:absolute;z-index:4;right:clamp(1rem,3vw,2.2rem);bottom:6.5rem;display:inline-flex;align-items:center;gap:.5rem}
.next-episode[hidden]{display:none}
/* Build 273: Skip Intro/Recap/Credits sits where Play Next Episode does (they are never shown together). */
.skip-segment{position:absolute;z-index:4;right:clamp(1rem,3vw,2.2rem);bottom:6.5rem;display:inline-flex;align-items:center;gap:.5rem}
.skip-segment[hidden]{display:none}
.player-message{position:absolute;z-index:4;left:1.25rem;right:1.25rem;bottom:8rem;color:#ffb3a9;text-align:center}
/* AFM Live continuity -- takes over the entire player surface for a scheduler Flex window, exactly
   like the video itself normally does, so nothing of Tunarr's own Channel Offline/Flex slate is
   ever visible underneath. Sits above the video and its scrims but below the back button/dock
   (z-index 3) so playback controls stay reachable throughout. The host itself carries an opaque
   background (not just a gradient) so there is never a gap -- even mid-crossfade -- where the raw
   stream could show through. Reuses the same ink/muted/aqua tokens and font stack as the rest of
   the app -- never a separate look. */
.live-continuity{position:absolute;inset:0;z-index:2;overflow:hidden;background:#020706;pointer-events:none}
/* One .continuity-scene per continuity card, each a full-player composition (backdrop + scrim +
   copy) rather than a small centred card. Two can exist briefly at once during a transition -- the
   outgoing scene has .continuity-scene-in removed (fading back to the base opacity:0/scale here)
   while the incoming one gets it added a frame later, giving a plain crossfade+drift with nothing
   but a CSS transition; see transitionToScene() in app.js. */
.continuity-scene{position:absolute;inset:0;overflow:hidden;opacity:0;transform:scale(1.015);transition:opacity .7s ease,transform .9s ease}
.continuity-scene.continuity-scene-in{opacity:1;transform:scale(1)}
/* Gentle, slow "Ken Burns" drift on still artwork -- restrained on purpose (a broadcast infotainment
   break, not a showcase). Runs for as long as the scene is mounted; a fresh element per scene change
   means it always restarts cleanly rather than needing manual resets. */
.continuity-backdrop{position:absolute;inset:-4%;background-size:cover;background-position:center;filter:brightness(.6) saturate(1.05);animation:continuityDrift 20s ease-in-out infinite alternate}
.continuity-backdrop-fallback{background:radial-gradient(circle at 70% 20%,#164c43,transparent 40rem),var(--panel);animation:none}
@keyframes continuityDrift{from{transform:scale(1)}to{transform:scale(1.07)}}
.continuity-scrim{position:absolute;inset:0;background:linear-gradient(180deg,#02070633 0%,#020706b3 55%,#020706f7 100%)}
.continuity-content{position:relative;z-index:1;height:100%;display:flex;align-items:flex-end;justify-content:center;padding:0 clamp(1.5rem,6vw,5rem) clamp(3rem,11vh,6.5rem)}
.continuity-copy{display:flex;align-items:flex-end;gap:1.75rem;max-width:1040px;width:100%}
.continuity-art{width:150px;height:225px;border-radius:10px;object-fit:cover;flex:none;box-shadow:0 22px 48px #000a;border:1px solid var(--line)}
.continuity-art-fallback{display:grid;place-items:center;background:var(--panel);color:var(--muted)}
.continuity-copy-text{min-width:0}
.continuity-eyebrow{display:block;font-size:.78rem;letter-spacing:.18em;text-transform:uppercase;font-weight:800;color:var(--aqua);margin-bottom:.4rem}
.continuity-copy-text h2{margin:0 0 .3rem;font-size:clamp(1.9rem,4vw,3.2rem);line-height:1.05;font-weight:800;color:var(--ink)}
.continuity-sub{margin:0 0 .5rem;color:var(--aqua2);font-size:1.05rem;font-weight:600}
.continuity-synopsis{margin:0 0 .6rem;color:#cfe0db;font-size:1rem;line-height:1.45;max-width:62ch;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.continuity-time{margin:0;color:var(--muted);font-size:.9rem}
.continuity-countdown{margin:.2rem 0 0;font-size:2rem;font-weight:800;color:var(--aqua);font-variant-numeric:tabular-nums;letter-spacing:.03em}
.continuity-content-later{align-items:flex-end;flex-direction:column;gap:1rem}
.continuity-later-list{list-style:none;margin:0;padding:0;display:flex;gap:2rem;flex-wrap:wrap;max-width:1040px}
.continuity-later-list li{display:flex;align-items:center;gap:.85rem;min-width:0}
.continuity-later-list .continuity-art{width:64px;height:96px;border-radius:7px}
.continuity-later-list h3{margin:0 0 .15rem;font-size:1.05rem;font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}
@media (max-width:640px){.continuity-copy{gap:1rem}.continuity-art{width:96px;height:144px}.continuity-content{padding-bottom:7.5rem}.continuity-later-list{gap:1rem}.continuity-later-list .continuity-art{width:48px;height:72px}}
/* AFM trailer continuity scene -- the existing working trailer player, but now filling the whole
   surface like every other scene rather than a bounded 16:9 box. The mount clips to the scene and
   the video/iframe is oversized + centred using the classic full-bleed "object-fit:cover" trick
   (real object-fit doesn't apply to an <iframe>), safe here because the live player itself is
   always a fixed, full-viewport element (see .native-player), so vw/vh map directly to it. A slim
   label strip (title + eyebrow only) is the sole chrome on top, so the trailer itself reads as the
   broadcast, not a video embedded in a card. */
.continuity-trailer-mount{position:absolute;inset:0;overflow:hidden;background:#000}
.continuity-trailer-video,.continuity-trailer-frame{position:absolute;top:50%;left:50%;width:100vw;height:56.25vw;min-height:100vh;min-width:177.78vh;transform:translate(-50%,-50%);border:0;background:#000}
.continuity-trailer-label{position:absolute;z-index:1;left:0;right:0;bottom:0;padding:0 clamp(1.5rem,6vw,5rem) clamp(1.75rem,5vh,3rem);background:linear-gradient(180deg,transparent,#020706f2 75%);pointer-events:none}
.continuity-trailer-label h2{margin:0;font-size:clamp(1.15rem,2.2vw,1.6rem);font-weight:800;color:var(--ink)}
/* Music dock */
.music-mini{position:fixed;z-index:105;left:1rem;right:1rem;bottom:1rem;display:grid;grid-template-columns:60px minmax(140px,1fr) auto minmax(160px,2fr) auto;align-items:center;gap:1rem;padding:.7rem .9rem;border:1px solid #ffffff20;border-radius:16px;background:#07110ff2;box-shadow:0 20px 60px #000a;backdrop-filter:blur(18px)}
.music-mini[hidden]{display:none}
.mini-art{width:60px;height:60px;border-radius:10px;overflow:hidden}
.mini-art img,.mini-art .fallback-cover{width:100%;height:100%;object-fit:cover}
.mini-art .fallback-cover>*:not(.fallback-glyph){display:none}
.mini-copy{display:grid;min-width:0}
.mini-copy strong,.mini-copy span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mini-copy span{color:var(--muted);font-size:.78rem}
.mini-controls{display:flex;align-items:center;gap:.4rem}
.mini-progress{display:flex;align-items:center;gap:.7rem;min-width:0}
.mini-progress .af-seek{flex:1}
.mini-progress span{color:var(--muted);font-size:.75rem;font-variant-numeric:tabular-nums;white-space:nowrap}
.mini-volume{display:flex;align-items:center;gap:.4rem}
.mini-volume .af-seek{width:84px}
/* Book mini dock */
.book-mini{position:fixed;z-index:105;left:1rem;right:1rem;bottom:1rem;display:grid;grid-template-columns:60px minmax(140px,1fr) auto minmax(160px,2fr);align-items:center;gap:1rem;padding:.7rem .9rem;border:1px solid #ffffff20;border-radius:16px;background:#07110ff2;box-shadow:0 20px 60px #000a;backdrop-filter:blur(18px);cursor:pointer}
.book-mini[hidden]{display:none}
/* Audiobook full player */
.audiobook-player{position:relative;overflow-x:hidden;overflow-y:auto;background:#030807}
.book-atmosphere{position:absolute;inset:0;z-index:0;background-image:var(--book-art);background-size:cover;background-position:center;filter:blur(70px) brightness(.35) saturate(1.3);transform:scale(1.3)}
.audiobook-player::after{content:"";position:absolute;inset:0;z-index:0;background:radial-gradient(circle at 30% 15%,transparent,#030807dd 72%)}
.audiobook-player .player-top{position:sticky;background:none}
.book-player-main{position:relative;z-index:1;min-height:calc(100% - 5rem);display:grid;grid-template-columns:minmax(200px,320px) minmax(280px,560px);align-items:center;justify-content:center;gap:clamp(2rem,6vw,6rem);padding:1.5rem 1.5rem 3rem}
.book-player-cover .fallback-cover,.book-player-cover img{width:100%;aspect-ratio:2/3;object-fit:cover;border-radius:18px;box-shadow:0 35px 80px #000b}
.book-player-copy h1{font-size:clamp(1.7rem,3.6vw,2.9rem);letter-spacing:-.03em;line-height:1.05;margin:.3rem 0 .2rem}
.book-author{color:var(--muted);font-size:1rem;margin:0 0 1rem}
.book-chapter{color:var(--aqua);font-size:.78rem;text-transform:uppercase;letter-spacing:.08em;font-weight:800;margin:0 0 1.3rem;min-height:1em}
.book-controls{display:flex;align-items:center;gap:1.1rem;margin:0 0 1.2rem}
#book-seek{width:100%;margin:0 0 .3rem}
.book-time{display:flex;justify-content:space-between;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.92rem}
.book-meta-row{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;margin-top:1.3rem}
.chip-select{display:inline-flex;align-items:center;gap:.45rem;border:1px solid var(--line);background:#ffffff0c;border-radius:999px;padding:.6rem .9rem;font-size:.8rem;color:var(--muted);position:relative}
.chip-select .icon{width:21px;height:21px;color:var(--aqua)}
.chip-select select{border:0;background:transparent;color:white;font-weight:700;outline:none}
.chip-select select option{background:#0c1a18;color:white}
.ctrl-btn.select-wrap select option{background:#0c1a18;color:white}
#book-message{color:#ffb3a9;margin-top:1rem}
/* Album prominent play */
.album-detail .album-play{width:64px;height:64px;border-radius:50%;display:grid;place-items:center;padding:0;flex:0 0 auto;box-shadow:0 12px 32px #000a}
.album-detail .album-play .icon{width:34px;height:34px}
@media(max-width:760px){
 .player-dock{padding-bottom:max(1.1rem,env(safe-area-inset-bottom))}
 .dock-row{gap:.4rem}
 .volume-group .volume-slider{display:none}
 .book-meta-row{flex-wrap:wrap;justify-content:center}
 .chip-select{padding:.5rem .7rem;font-size:.75rem}
 .music-mini,.book-mini{left:.5rem;right:.5rem;bottom:calc(68px + env(safe-area-inset-bottom) + .5rem);padding:.6rem .7rem;gap:.7rem;grid-template-columns:46px 1fr auto;grid-template-areas:"art copy controls" "progress progress volume";row-gap:.5rem}
 body.has-music-player,body.has-book-player,body.has-music-player .detail-shell,body.has-book-player .detail-shell{padding-bottom:calc(68px + env(safe-area-inset-bottom) + 116px)}
 .music-mini .mini-art,.book-mini .mini-art{grid-area:art;width:46px;height:46px}
 .music-mini .mini-copy,.book-mini .mini-copy{grid-area:copy}
 .music-mini .mini-controls,.book-mini .mini-controls{grid-area:controls}
 .music-mini .mini-progress,.book-mini .mini-progress{grid-area:progress}
 .music-mini .mini-volume{grid-area:volume}
 .music-mini .mini-volume [data-music-volume]{display:none}
 .music-mini [data-music-time],.book-mini [data-book-mini-time]{display:none}
 .book-player-main{grid-template-columns:1fr;padding-top:1rem;align-content:start;text-align:center}
 .book-player-cover{width:min(55vw,250px);margin:0 auto 1.5rem}
 .book-controls{justify-content:center}
 .book-meta-row{justify-content:center}
 .player-title span{display:none}
 .next-episode span{display:none}
 .guide-grid,.guide-nav:not(.mobile){display:none}
 .guide-mobile{display:block}
 .guide-nav.mobile{display:flex;justify-content:space-between}
 .surf-guide-link{display:none}
 .channel-grid{grid-template-columns:1fr}
 .guide-panel{max-height:88vh;overflow-y:auto}
}
@media(max-width:760px){.photo-nav{width:42px;height:54px;background:#0205048a}.photo-nav.previous{left:.4rem}.photo-nav.next{right:.4rem}.backup-groups{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* 1.4 media hubs */
.hub-head{min-height:440px;display:flex;align-items:end;padding:8rem clamp(1rem,5vw,5rem) 3rem;background-size:cover;background-position:center;border-bottom:1px solid var(--line)}.hub-head>div{max-width:760px}.hub-head h1{font-size:clamp(4rem,11vw,8rem);line-height:.82;letter-spacing:-.065em;margin:.5rem 0 1.2rem}.hub-head p{max-width:540px;color:#c5d1cd;font-size:1.05rem}.hub-tabs{display:flex;gap:.35rem;flex-wrap:wrap;margin-top:1.4rem}.hub-tabs a{color:#b8c5c1;text-decoration:none;padding:.65rem 1rem;border-radius:999px;border:1px solid #ffffff20;background:#081210b5;backdrop-filter:blur(12px)}.hub-tabs a.active,.hub-tabs a:hover{color:white;background:#ffffff1c;border-color:#63e7c65c}.genre-strip{padding:1rem 0 3rem}.genre-strip>div{display:flex;gap:.6rem;flex-wrap:wrap}.genre-chip{border:1px solid #ffffff1d;background:linear-gradient(145deg,#112824,#091512);color:white;padding:1rem 1.3rem;border-radius:12px;cursor:pointer}.hub-note{color:var(--muted);border-left:2px solid var(--aqua);padding:.3rem 0 .3rem 1rem;margin:2rem 0}.home-photos{margin-top:2rem}.photo-grid.compact{grid-template-columns:repeat(8,minmax(0,1fr));grid-auto-rows:140px}.author-grid{padding:1rem 0 3rem}.inline-back{border:0;background:transparent;color:white;padding:6rem 0 0;cursor:pointer}.season-browser{padding:0 clamp(1rem,5vw,5rem) 5rem}.season-tabs{display:flex;gap:.55rem;overflow-x:auto;padding:1rem 0}.episode-list{display:grid;gap:.7rem}/* Compact horizontal row, not a bordered/tinted tile -- the same border-bottom row convention
   .episode/.track-item already use elsewhere. The third (auto) column is .episode-row-menu: an
   intentionally EMPTY reserved slot for the approved design's future three-dot per-episode menu,
   so that control can be added later without redesigning the row -- no placeholder is rendered
   there now. */
.episode-card{display:grid;grid-template-columns:minmax(180px,280px) 1fr auto auto;gap:1rem;align-items:center;padding:.7rem .2rem;border-bottom:1px solid var(--line);cursor:pointer}
.episode-card:last-child{border-bottom:0}
.episode-still{aspect-ratio:16/9;overflow:hidden;border-radius:8px;background:#10201d}.episode-still img,.episode-still .fallback-cover{width:100%;height:100%;object-fit:cover}.episode-row-copy{display:flex;flex-direction:column;justify-content:center;gap:.4rem;min-width:0}/* justify-content:flex-start (not space-between) -- the line must group number/title and runtime
   together with one small, consistent gap rather than distributing them across the full width of
   .episode-row-copy, which was pushing the runtime out near the Play-button column. */
.episode-row-line{display:flex;align-items:baseline;justify-content:flex-start;gap:.6rem}.episode-row-copy p{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.episode-card span,.episode-card p{color:var(--muted);margin:0}.episode-card .track{height:3px;background:#ffffff18}.episode-card .track i{display:block;height:100%;background:var(--aqua)}.episode-play{white-space:nowrap}.episode-row-menu{width:2.25rem}.utility-gap{width:1rem}.chip.utility{opacity:.8}

@media(max-width:760px){.nav{grid-template-columns:repeat(5,minmax(0,1fr))}.hub-head{min-height:360px;padding:6rem 1rem 2rem}.hub-head h1{font-size:4.2rem}.hub-tabs{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:thin;scrollbar-color:#31534d transparent}.hub-tabs a{flex:0 0 auto}.photo-grid.compact{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:24vw}.episode-card{grid-template-columns:120px 1fr auto auto;padding:.55rem;gap:.7rem}.episode-card p{display:none}.episode-row-line{flex-wrap:wrap}.episode-play{padding:0 .8rem}.episode-row-menu{width:1.5rem}.utility-gap{display:none}}

/* Home North Star, Slice 1 — Continue Watching landscape rail cards */
.continue-rail-card{overflow:hidden;position:relative;background:linear-gradient(145deg,#17302d,#08110f);box-shadow:0 8px 30px #0008;transition:transform .22s,box-shadow .22s;cursor:pointer}
.continue-rail-card:hover,.continue-rail-card:focus-visible{transform:translateY(-6px) scale(1.018);box-shadow:0 16px 42px #000c}
.continue-rail-card img{width:100%;height:100%;object-fit:cover;display:block}
.continue-rail-card .fallback-cover{width:100%;height:100%}
.continue-rail-card::after{content:"";position:absolute;inset:0;background:linear-gradient(0deg,#000000e6 0,#00000099 38%,transparent 68%);pointer-events:none}
.continue-rail-card .rail-copy{position:absolute;left:.85rem;right:.85rem;bottom:.7rem;z-index:1}
.continue-rail-card .rail-copy strong{display:block;font-size:.96rem;font-weight:800;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 2px 8px #000a}
.continue-rail-card .rail-copy span{display:block;font-size:.74rem;color:#d7ddda;margin-top:.15rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.continue-rail-card .rail-progress{position:absolute;left:0;right:0;bottom:0;height:4px;background:#ffffff2b;z-index:1}
.continue-rail-card .rail-progress i{display:block;height:100%;background:var(--aqua)}

/* Home North Star, Slice 1B — compact horizontal cards for Continue Listening / Recently Played */
.listening-card{display:flex;align-items:center;background:#ffffff08;cursor:pointer;transition:background .2s,border-color .2s,transform .22s}
.listening-card:hover,.listening-card:focus-visible{background:#ffffff12;border-color:#ffffff2a;transform:translateY(-3px)}
.listening-card .listening-art{flex:0 0 auto;aspect-ratio:2/3;border-radius:6px;overflow:hidden;background:#10201d;box-shadow:0 6px 18px #0007}
.listening-card .listening-art.square{aspect-ratio:1/1}
.listening-card .listening-art img{width:100%;height:100%;object-fit:cover;display:block}
.listening-card .listening-art .fallback-cover{width:100%;height:100%;padding:.5rem}
.listening-card .listening-art .fallback-cover strong{font-size:.62rem}
.listening-card .listening-copy{min-width:0;flex:1 1 auto}
.listening-card .listening-copy strong{display:block;font-size:1.02rem;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.listening-card .listening-copy .listening-secondary{display:block;font-size:.86rem;color:#c7d1ce;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:.2rem}
.listening-card .listening-copy .listening-meta{display:block;font-size:.72rem;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:.35rem}
.listening-card .listening-progress{margin-top:.5rem;height:3px;border-radius:9px;background:#ffffff2b;overflow:hidden;max-width:220px}
.listening-card .listening-progress i{display:block;height:100%;background:var(--aqua)}
.listening-card .listening-play{flex:0 0 auto;width:40px;height:40px;border-radius:50%;border:0;background:var(--aqua);color:#03100e;display:grid;place-items:center;cursor:pointer}
.listening-card .listening-play svg{width:17px;height:17px}


/* Home North Star, first corrections — Live Now shows only a small real preview (3 cards,
   selected server-side by genuine per-profile watch history -- see /api/channels/home), given
   substantially more visual presence so the card/section height reads comparably to Recently
   Added, rather than the earlier compact icon-row treatment. */
.live-card{position:relative;display:flex;flex-direction:column;border:1px solid var(--line);border-radius:12px;background:#ffffff08;cursor:pointer;transition:background .2s,border-color .2s,transform .22s;min-width:0;width:100%;height:100%;overflow:hidden}
.live-card:hover,.live-card:focus-visible{background:#ffffff12;border-color:#ffffff2a;transform:translateY(-4px)}
.live-card .live-art{position:relative;width:100%;aspect-ratio:3/2;overflow:hidden;background:#10201d}
.live-card .live-art .art-backdrop{position:absolute;inset:-14%;background-size:cover;background-position:center;filter:blur(18px) brightness(.7) saturate(1.25);transform:scale(1.06);opacity:0;transition:opacity .25s}
.live-card .live-art.contain-fit .art-backdrop{opacity:1}
.live-card .live-art img{position:relative;width:100%;height:100%;object-fit:cover;display:block}
.live-card .live-art.contain-fit img{object-fit:contain}
.live-card .live-art .fallback-cover{width:100%;height:100%}
.live-badge-chip{position:absolute;top:.55rem;left:.55rem;background:#c22a2ae0;color:#fff;font-size:.62rem;font-weight:900;letter-spacing:.06em;padding:.2rem .5rem;border-radius:999px;text-transform:uppercase;z-index:1;backdrop-filter:blur(6px)}
.live-card .live-copy{min-width:0;padding:.8rem .9rem .9rem}
.live-card .live-copy strong{display:block;font-size:1.02rem;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.live-card .live-programme{display:block;font-size:.84rem;color:#c7d1ce;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:.25rem}
.live-card .live-programme.muted{color:var(--muted)}
.live-card .live-time{display:block;font-size:.74rem;color:var(--muted);margin-top:.2rem}
.live-card .live-progress{position:absolute;left:0;right:0;bottom:0;height:4px;background:#ffffff2b}
.live-card .live-progress i{display:block;height:100%;background:var(--aqua)}
/* Live Now stays the same horizontal-rail mechanics as every other Home shelf; sized so all 3 real
   cards fit within the home-band's narrower right-hand column without clipping down to 1440px
   wide (the shared prev/next controls harmlessly disable themselves via updateRailButtons once
   everything already fits). */
.live-row{grid-auto-columns:clamp(148px,11vw,250px)}

/* Home North Star, composition pass -- paired two-column bands (Recently Added/Live Now,
   Listening/From Your Library), matching the reference's roughly 58/42 split. */
.home-band{display:grid;grid-template-columns:1.4fr 1fr;gap:2rem;align-items:start;margin:0 0 1.6rem}
.home-band>*{min-width:0}
.home-band>.row-section{margin-bottom:0}

/* Home North Star, first corrections -- header: brand left / destinations centred / account+search
   right. Search stays a real .nav link (so the mobile bottom tab bar is untouched) but is visually
   pulled out to its own right-hand cluster on desktop; no icon asset exists for it yet, so it stays
   readable text rather than an invented glyph. */
.topbar{display:grid;grid-template-columns:auto 1fr auto;column-gap:2rem}
.brand{grid-column:1}
.nav{grid-column:2;justify-self:center;margin-left:0}
.topbar-actions{grid-column:3;justify-self:end;display:flex;align-items:center;gap:1.1rem}
.topbar-actions .account-button{margin-left:0}
.search-link{color:#d7dfdc;text-decoration:none;font-size:.85rem;font-weight:700;letter-spacing:.03em}
.search-link:hover,.search-link.active{color:var(--aqua)}
.nav-search-mobile{display:none}
@media(max-width:760px){
  .topbar-actions .search-link{display:none}
  .nav-search-mobile{display:block}
}
/* Hero artwork: bias the focal area right and keep the left field solidly dark for the text
   column, rather than centring the backdrop -- protects readability regardless of what any given
   real backdrop actually contains. */
.hero{background-position:right 20%}
.hero::before{background:linear-gradient(90deg,#030807f7 0,#030807d4 40%,transparent 72%),linear-gradient(0deg,var(--night) 0,transparent 45%),linear-gradient(180deg,#02080866,transparent 30%)}
@media(max-width:760px){
  .home-band{grid-template-columns:1fr;gap:0}
  .home-band>.row-section:not(:last-child){margin-bottom:1.6rem}
}

/* Home North Star, structure completion — From Your Library */
.library-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:.8rem}
.library-tile{display:flex;flex-direction:column;align-items:flex-start;gap:.4rem;padding:.9rem 1rem;border:1px solid var(--line);border-radius:10px;background:#ffffff08;color:var(--ink);cursor:pointer;transition:background .2s,border-color .2s,transform .22s;text-align:left;max-width:220px;width:100%}
.library-tile:hover,.library-tile:focus-visible{background:#ffffff12;border-color:#ffffff2a;transform:translateY(-3px)}
.library-tile .library-icon{font-size:2rem;line-height:1}
.library-tile strong{font-size:.85rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.library-tile span:last-child{font-size:1.6rem;font-weight:800}

@media(max-width:760px){
  .live-row{grid-template-columns:1fr}
  .library-row{grid-template-columns:repeat(2,minmax(0,1fr))}
  .continue-rail-card .rail-copy strong{font-size:.86rem}
}

/* ===========================================================================
   Admin rebuild -- reuses the existing NitrOS token system (--ink/--muted/
   --aqua/--night/--panel/--line/--shadow, existing .button/.avatar-preview/
   .account-form treatments) end to end. No second colour system. Typography:
   Barlow Condensed for headings/nav/buttons, Barlow for body/metadata/forms.
   =========================================================================== */
.admin-view{min-height:100%;background:radial-gradient(circle at 80% 0,#12453d,transparent 40rem),#050b0b;padding-top:72px}
.admin-inner{width:100%;max-width:1800px;margin:0 auto;padding:0 40px 6rem}
@media(min-width:1600px){.admin-inner{padding-left:48px;padding-right:48px}}
@media(max-width:1024px){.admin-inner{padding-left:24px;padding-right:24px}}
@media(max-width:760px){.admin-inner{padding-left:16px;padding-right:16px}}
.admin-topnav{display:flex;gap:32px;align-items:center;padding:1.4rem 0 1.1rem;border-bottom:1px solid var(--line);margin-bottom:28px;flex-wrap:wrap}
.admin-topnav a{font-family:"Barlow Condensed",Inter,sans-serif;font-size:18px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);text-decoration:none;padding-bottom:.6rem;position:relative}
.admin-topnav a::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--aqua);transform:scaleX(0);transition:transform .18s}
.admin-topnav a:hover{color:var(--ink)}
.admin-topnav a.active{color:var(--ink)}
.admin-topnav a.active::after{transform:scaleX(1)}
.admin-page-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.admin-h1{font-family:"Barlow Condensed",Inter,sans-serif;font-weight:700;font-size:42px;letter-spacing:-.01em;margin:0;line-height:1.05}
.admin-sub{font-family:Barlow,Inter,sans-serif;color:var(--muted);font-size:16px;margin:.5rem 0 0}
.admin-page{font-family:Barlow,Inter,sans-serif}
.admin-page>.admin-page-head+.admin-sub{margin-bottom:0}
.admin-page>*{margin-top:0}
.admin-page>.admin-page-head{margin-bottom:28px}
.admin-page>.admin-sub{margin-bottom:28px}
/* min-height + padding give a ~44px comfortable click/touch target; negative margin offsets the added
   padding so the visible text still sits at roughly its original position -- same colour/weight/size,
   just a larger hit area around it. */
.admin-crumb{display:inline-flex;align-items:center;min-height:44px;padding:0 .3rem;margin:-10px -.3rem 1.2rem;color:var(--muted);text-decoration:none;font-weight:600}
.admin-crumb:hover{color:var(--ink)}
.admin-section-heading{font-family:"Barlow Condensed",Inter,sans-serif;font-weight:600;font-size:24px;margin:0 0 1rem;letter-spacing:0;display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}
.admin-section-actions{display:flex;gap:.5rem;font-family:Inter,sans-serif;font-size:14px;font-weight:500}

/* Attention strip -- warning language, never destructive red unless there is actual danger. */
.admin-attention-strip{display:flex;align-items:center;gap:1rem;min-height:76px;padding:0 1.3rem;margin-bottom:32px;border-radius:14px;background:linear-gradient(145deg,#3a2f10,#241d0a);border:1px solid #ffbd4d3d;text-decoration:none;color:var(--ink)}
.admin-attention-icon{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;background:#ffbd4d22;color:#ffbd69;font-weight:800;font-size:1.54rem;flex:0 0 auto}
.admin-attention-copy{display:flex;flex-direction:column;gap:.15rem;flex:1;min-width:0}
.admin-attention-copy strong{font-family:"Barlow Condensed",Inter,sans-serif;font-size:16px;letter-spacing:.03em;color:#ffd98a}
.admin-attention-copy span{font-size:14px;color:var(--muted)}
.admin-attention-cta{font-weight:700;color:#ffd98a;white-space:nowrap}

/* Primary action row -- 65/35 on desktop, stacked below. */
.admin-actions-row{display:grid;grid-template-columns:40fr 30fr 30fr;gap:20px;margin-bottom:32px;align-items:stretch}
@media(max-width:1100px){.admin-actions-row{grid-template-columns:1fr}}
.admin-panel{padding:1.6rem;border-radius:18px;background:#ffffff08;border:1px solid var(--line);display:flex;flex-direction:column;gap:.9rem}
.admin-panel-head{display:flex;align-items:center;gap:.7rem}
/* Build 218: +40% (28px) would overflow this 26px circular container -- capped at the largest size that
   fits without clipping, per the approved exception policy. */
.admin-panel-icon{display:grid;place-items:center;width:26px;height:26px;font-size:23px;color:var(--aqua);flex:0 0 auto}
.admin-panel-head h2{font-family:"Barlow Condensed",Inter,sans-serif;font-weight:600;font-size:26px;margin:0;letter-spacing:.01em}
.admin-panel-desc{color:var(--muted);font-size:15px;margin:0}
.admin-field-row{display:flex;gap:.7rem}
.admin-field-row input{flex:1;min-width:0;height:48px;border:1px solid #ffffff25;border-radius:10px;background:#07100f;color:var(--ink);padding:0 1rem;font-size:15px;outline:none}
.admin-field-row input:focus{border-color:var(--aqua)}
.admin-field-row .button{height:48px;min-width:120px;padding:0 1.2rem}
.admin-panel .button{align-self:flex-start;min-height:48px}
.admin-inline-feedback{color:var(--aqua);font-size:14px;margin:0}
.admin-inline-feedback.bad{color:#ff9d9d}
.admin-panel-status{display:flex;align-items:center;gap:.7rem;color:var(--muted)}
.admin-panel-status p{margin:0}
.admin-spinner{width:18px;height:18px;border:2px solid #ffffff22;border-top-color:var(--aqua);border-radius:50%;animation:spin .8s linear infinite;flex:0 0 auto}
.admin-panel-new.expanded{grid-row:span 1}

/* Clean rows -- activity/status/people/attention. Never cards. */
.admin-row-list{display:flex;flex-direction:column}
.admin-filename-list{list-style:none;margin:0 0 1rem;padding:0;display:flex;flex-direction:column;gap:.3rem;font-size:14px;color:var(--ink)}
.admin-filename-list li{padding:.3rem 0;border-bottom:1px solid var(--line)}
.admin-filename-list li:last-child{border-bottom:0}
.admin-row{display:flex;align-items:center;gap:1rem;min-height:68px;padding:.7rem 0;border-bottom:1px solid var(--line);text-decoration:none;color:var(--ink)}
.admin-row-list>.admin-row:last-child{border-bottom:0}
.admin-row-main{display:flex;flex-direction:column;gap:.2rem;flex:1;min-width:0}
.admin-row-main strong{font-family:Barlow,Inter,sans-serif;font-weight:600;font-size:16px;overflow-wrap:anywhere}
.admin-row-sub{font-size:14px;color:var(--muted)}
.admin-row-state{font-size:14px;color:var(--muted);white-space:nowrap;text-align:right}
.admin-row-chevron{color:var(--muted);font-size:1.2rem}
.admin-row-actions{display:flex;gap:.5rem;flex-wrap:wrap}
.admin-quiet-line{color:var(--muted);font-size:15px;padding:.6rem 0}
.admin-progress{display:flex;align-items:center;gap:.6rem;min-width:140px;justify-content:flex-end}
.admin-progress-track{width:100px;height:6px;border-radius:999px;background:#ffffff18;overflow:hidden}
.admin-progress-fill{height:100%;background:var(--aqua)}
.admin-progress span{font-size:13px;color:var(--muted);white-space:nowrap}
.admin-activity{margin-top:32px}
.admin-health-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-height:60px;margin-top:1.2rem;padding:0 1.2rem;border-radius:12px;background:#ffffff06;border:1px solid var(--line);text-decoration:none;color:var(--ink)}
.admin-health-row strong{font-family:"Barlow Condensed",Inter,sans-serif;font-size:14px;letter-spacing:.06em}
.admin-health-row span{color:var(--muted);font-size:14px}
.admin-section{margin-bottom:2rem}

/* Attention list + episode picker */
.admin-attention-item{align-items:flex-start;padding:1rem 0}
.admin-attention-item .admin-row-main strong{font-family:"Barlow Condensed",Inter,sans-serif;font-size:16px;letter-spacing:.02em}
/* An obsolete/unrecognised backend outcome -- never a real Gareth decision -- reads as quieter/muted
   rather than a normal actionable attention card, without a second visual language. */
.admin-attention-unsupported{opacity:.6}
.admin-episode-row{cursor:pointer}
.admin-episode-row:has(input:checked){background:#43dfc00f;border-radius:10px;padding-left:.6rem;padding-right:.6rem}
.admin-episode-row input{margin-top:.3rem;flex:0 0 auto}

/* Duplicate/associated-file conflict comparison */
.admin-compare{margin:1.2rem 0}
.admin-compare-heads{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-bottom:.6rem}
.admin-compare-col h3{font-family:"Barlow Condensed",Inter,sans-serif;font-size:16px;letter-spacing:.04em;margin:0 0 .2rem;text-transform:uppercase;color:var(--muted)}
.admin-compare-col .admin-row-sub{overflow-wrap:anywhere}
.admin-compare-missing .admin-inline-feedback{margin:0}
.admin-compare-table-wrap{overflow-x:auto}
.admin-compare-table{width:100%;border-collapse:collapse;font-size:14px}
.admin-compare-table th,.admin-compare-table td{text-align:left;padding:.5rem .8rem;border-bottom:1px solid var(--line)}
.admin-compare-table thead th{color:var(--muted);font-family:"Barlow Condensed",Inter,sans-serif;letter-spacing:.04em;text-transform:uppercase;font-size:12px}
.admin-compare-table tbody th{color:var(--muted);font-weight:500;white-space:nowrap}
@media (max-width:900px){
  .admin-compare-heads{grid-template-columns:1fr}
  .admin-compare-table thead{display:none}
  .admin-compare-table,.admin-compare-table tbody,.admin-compare-table tr,.admin-compare-table th,.admin-compare-table td{display:block;width:100%}
  .admin-compare-table tr{padding:.4rem 0;border-bottom:1px solid var(--line)}
  .admin-compare-table tbody th{padding-bottom:.1rem}
  .admin-compare-table td{padding:.1rem 0 .1rem .8rem}
  .admin-compare-table td:before{content:attr(data-col) ": ";color:var(--muted)}
}

/* Health detail */
.admin-health-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1rem}
.admin-health-card{padding:1.2rem;border-radius:14px;background:#ffffff08;border:1px solid var(--line)}
.admin-health-card h3{font-family:"Barlow Condensed",Inter,sans-serif;font-size:20px;margin:0 0 .8rem}
.admin-health-card dl{display:grid;grid-template-columns:auto 1fr;gap:.3rem .8rem;margin:0}
.admin-health-card dt{color:var(--muted);font-size:14px}
.admin-health-card dd{margin:0;font-size:14px;font-weight:600}

/* People */
.admin-people-row .avatar-preview{width:40px;height:40px;font-size:.85rem}
.admin-person-head{display:flex;align-items:center;gap:1.1rem;margin-bottom:1.6rem}
.admin-person-avatar{width:64px;height:64px;font-size:1.3rem}
.admin-danger-zone{margin-top:2rem;padding-top:1.5rem;border-top:1px solid var(--line)}
.admin-toggle-row{display:flex;align-items:center;gap:.6rem;font-weight:600;color:var(--ink)}
.button.danger{background:transparent;color:#ff9d9d;border:1px solid #ff8d8d55}
.button.danger:hover{background:#ff8d8d18}

/* Modal -- Process Now / destructive confirmations */
.admin-modal-root{position:fixed;inset:0;z-index:200;display:grid;place-items:center;padding:1rem}
.admin-modal-backdrop{position:absolute;inset:0;background:#020504cc;backdrop-filter:blur(6px)}
.admin-modal{position:relative;width:min(520px,100%);padding:1.8rem;border-radius:18px;background:#0c1918f7;border:1px solid var(--line);box-shadow:var(--shadow)}
.admin-modal h2{font-family:"Barlow Condensed",Inter,sans-serif;font-size:26px;margin:0 0 .8rem}
.admin-modal p{color:var(--muted);font-size:15px;line-height:1.5;margin:0 0 .8rem}
.admin-modal input{width:100%;height:44px;border:1px solid #ffffff25;border-radius:10px;background:#07100f;color:var(--ink);padding:0 .9rem;font-size:15px;outline:none;margin-bottom:.6rem}
.admin-modal-actions{display:flex;justify-content:flex-end;gap:.7rem;margin-top:1rem}

@media(max-width:760px){
  .admin-h1{font-size:32px}
  .admin-topnav{gap:20px}
  .admin-row{min-height:auto;padding:.8rem 0}
  .admin-page-head{align-items:flex-start;flex-direction:column;gap:.8rem}
}

/* ===========================================================================
   Media hubs -- Video and Audio (v1.30).
   Every rule here is scoped to .video-hub / .audio-hub / .audio-hero, or is a
   brand-new class (.row-action / .hub-group-heading) that nothing existing
   renders. Home's rails, hero and card density, and every Live surface, are
   therefore byte-for-byte unaffected.
   =========================================================================== */
.row-action{display:inline-flex;align-items:center;min-height:32px;padding:.35rem .1rem;color:var(--aqua);font-size:.72rem;font-weight:800;letter-spacing:.09em;text-transform:uppercase;text-decoration:none;white-space:nowrap}
.row-action:hover,.row-action:focus-visible{color:var(--aqua2);text-decoration:underline}
.hub-group-heading{margin:2.2rem 0 1rem;padding-top:1.3rem;border-top:1px solid var(--line);font-size:.76rem;letter-spacing:.14em;text-transform:uppercase;font-weight:800;color:var(--aqua)}

.audio-hub .author-grid{padding:0;margin:0 0 1.6rem}
.audio-hero .audio-now{display:flex;align-items:center;flex-wrap:wrap;gap:clamp(1rem,2.5vw,1.8rem);margin:1.1rem 0 .3rem}
.audio-hero .audio-now-art{flex:0 0 auto;width:clamp(104px,11vw,148px);aspect-ratio:2/3;border-radius:10px;overflow:hidden;background:#10201d;box-shadow:0 12px 34px #000a}
.audio-hero .audio-now-art.square{aspect-ratio:1/1}
.audio-hero .audio-now-art img{width:100%;height:100%;object-fit:cover;display:block}
.audio-hero .audio-now-art .fallback-cover{width:100%;height:100%;padding:.6rem}
.audio-hero .audio-now-art .fallback-cover strong{font-size:.78rem}
.audio-hero .audio-now-copy{flex:1 1 300px;min-width:min(100%,260px)}
.audio-hero .audio-now-copy strong{display:block;margin:.25rem 0 .15rem;font-size:clamp(1.15rem,2.2vw,1.6rem);font-weight:800;letter-spacing:-.01em}
.audio-hero .audio-now-copy span{display:block;color:#c7d1ce;font-size:.92rem}
.audio-hero .audio-now-copy .audio-now-tertiary{margin-top:.15rem;color:var(--muted);font-size:.8rem}
.audio-hero .audio-now-copy .audio-now-tertiary:empty{display:none}
.audio-hero .audio-now-track{max-width:420px;margin:.85rem 0 0;height:4px;border-radius:9px;background:#ffffff2b;overflow:hidden}
.audio-hero .audio-now-track i{display:block;height:100%;background:var(--aqua);border-radius:inherit}
.audio-hero .audio-now .actions{margin-top:.95rem}
@media(max-width:760px){
  .audio-hero{min-height:auto;padding-bottom:2.2rem}
  .audio-hero .audio-now{gap:.9rem}
  .audio-hero .audio-now-art{width:88px}
  .audio-hero .audio-now .actions{display:grid;grid-template-columns:1fr;width:100%}
  .hub-group-heading{margin-top:1.7rem}
}
/* .hub-head is a flex container and .hub-head>div a flex item whose default min-width:auto refuses
   to shrink below its content's min-content width. With a longer tab strip (Audio now has five
   sections) that pushed the whole layout viewport wider than the device on narrow screens, which
   Chrome resolves by zooming the page out. Allowing the column to shrink lets the existing
   ≤760px .hub-tabs overflow-x:auto rule do its job instead. Only hubHero()/the Audio hero render
   .hub-head -- the Live pages (Channels, Guide) render their tabs inside .browse-page and are not
   affected -- and this rule can only ever prevent overflow, never change a layout that already fits. */
.hub-head{min-width:0}
.hub-head>div{min-width:0;max-width:min(760px,100%)}
.hub-head .hub-tabs{min-width:0;max-width:100%}

/* ---------------------------------------------------------------------------
   1.5 Persistent media hubs -- Video and Audio are each ONE page whose content
   pool is narrowed by a filter. Every rule here is scoped to .media-hero /
   .hub-filters / .hub-grid-section (all new classes, or .hero scoped by
   .media-hero), so Home's hero and the Live pages are untouched. The hero keeps
   the same position, size and structure in every filter state -- only its
   content changes.
   --------------------------------------------------------------------------- */
/* padding-bottom clears the .content band's -2.5rem pull-up, so the first rail heading never
   collides with the hero's own actions in any filter state. */
.media-hero{min-height:min(52vh,540px);padding-top:7rem;padding-bottom:3.25rem}
/* The hub content band sits below the hero rather than pulling up into it -- the hero is a real
   featured-media block with its own actions, not a backdrop for the first rail to overlap. */
.content.video-hub,.content.audio-hub{margin-top:0}
.media-hero .hero-copy{width:min(680px,92vw)}
.media-hero .title-logo{margin:.35rem 0 .7rem}
.media-hero .title-logo img{max-width:min(360px,80%);max-height:104px}
.media-hero h1{margin-top:.35rem}
.hero-overview{max-width:58ch;color:#c7d1ce;font-size:.95rem;line-height:1.6;margin:.8rem 0 0;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
/* The filter strip sits at the top of the hero in every state (margin-bottom:auto inside the
   hero's bottom-aligned flex column), so it never moves as the hero content changes. */
.hub-filters{display:flex;gap:.4rem;flex-wrap:wrap;margin:0 0 auto;padding-bottom:1.7rem;max-width:100%}
.hub-filters a{color:#b8c5c1;text-decoration:none;font-weight:700;font-size:.85rem;letter-spacing:.02em;padding:.55rem 1.05rem;border-radius:999px;border:1px solid #ffffff20;background:#081210b5;backdrop-filter:blur(12px)}
.hub-filters a:hover{color:white;background:#ffffff1c;border-color:#63e7c65c}
.hub-filters a.active{background:var(--aqua);color:#03100e;border-color:transparent}
.media-hero.audio-hero .audio-now{margin:1rem 0 0}
.hub-grid-section{margin-top:.6rem}

/* ---------------------------------------------------------------------------
   2.0 Rotating Video showcase. Everything here is scoped to .video-showcase --
   Home's hero, the Audio hero and every Live surface are untouched. Padding and
   the filter strip position are inherited unchanged from .media-hero above, but
   the height itself is NOT -- .media-hero's min-height is only a floor, so a
   featured item carrying more optional copy (episode line, metadata, a resume
   progress bar) than another would otherwise grow the whole hero and shift
   Continue Watching/the rails beneath it. .video-showcase instead gets a real,
   fixed height (desktop below; its own @media(max-width:760px) override lives
   at the end of this file so it wins the cascade over .media-hero's own mobile
   rule), sized generously for the richest realistic combination (title-logo +
   episode line + metadata + progress + a full 3-line overview + the actions/nav/
   indicators row) with overflow:hidden as a safety clip for anything beyond
   that. Shorter content just settles at the same fixed height, bottom-anchored
   exactly as before -- the hub-filters strip's own margin:0 0 auto keeps it
   pinned to the top regardless. */
.video-showcase{overflow:hidden;height:min(64vh,660px)}
/* The backdrop and the trailer preview are layers BEHIND .hero::before (z-index:-1), inside the
   hero's own isolation:isolate stacking context -- so the scrim keeps the copy readable whether the
   hero is showing artwork or a playing trailer, and the copy block never has to move. */
.video-showcase .showcase-bg{position:absolute;inset:0;z-index:-3;background-size:cover;background-position:center 20%}
/* Mounted in the layout (so it can genuinely start) but fully transparent until playback is
   confirmed -- a blocked or broken trailer can never put a black rectangle over the artwork. */
.video-showcase .showcase-trailer{position:absolute;inset:0;z-index:-2;overflow:hidden;background:#000;opacity:0;transition:opacity .35s ease}
.video-showcase .showcase-trailer.ready{opacity:1}
.video-showcase .showcase-trailer[hidden]{display:none}
/* While a preview is playing the scrim eases off just enough to let the motion read, exactly as the
   detail hero already does -- never enough to stop the copy being legible over it. */
.video-showcase.showcase-trailer-on::before{opacity:.78;transition:opacity .3s}
.video-showcase .showcase-trailer .continuity-trailer-video,.video-showcase .showcase-trailer .continuity-trailer-frame{position:absolute;top:50%;left:50%;width:100%;height:100%;min-width:190%;min-height:190%;transform:translate(-50%,-50%);border:0;object-fit:cover}
/* Restrained crossfade: only the artwork layer and the copy fade, never the filter strip or the
   showcase controls, so nothing the user can aim at ever flickers. The global
   prefers-reduced-motion rule already neutralises this transition, and the script skips the
   fade delay entirely in that case. */
.video-showcase .showcase-bg,.video-showcase [data-showcase-copy],.north-hero .north-hero-bg{transition:opacity .28s ease}
.video-showcase.is-swapping .showcase-bg,.video-showcase.is-swapping [data-showcase-copy]{opacity:0}
/* The title is a real focusable control that opens the same Details destination, with no button
   chrome of its own -- it stays typographically identical to the static hero's heading. Bounded to
   a fixed maximum area (big enough for the title-logo's own 104px cap, or two wrapped lines of
   text) so switching between a logo title and a plain text title -- or a short title and a long
   one -- can never itself change the hero's height; see .video-showcase below for the hero's own
   fixed height, which this exists to make safe. */
.showcase-title{display:block;max-width:100%;max-height:124px;overflow:hidden;margin:0;padding:0;border:0;background:none;color:inherit;font:inherit;text-align:left}
.showcase-title .title-logo{display:block;margin:.35rem 0 .7rem}
.showcase-title .showcase-heading,.north-hero .hero-copy>h1,.structured-hero.audio-hero [data-audio-title]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:clamp(1.8rem,3vw,2.9rem);line-height:1.02;margin:.45rem 0 .6rem;letter-spacing:-.02em;font-weight:800;color:var(--ink);overflow:hidden;overflow-wrap:break-word}
/* Understated, same control language as the player's .ctrl-btn -- never carousel arrows. Grouped
   inside the hero's own .actions row (matching the Author Library feature hero's convention of
   keeping its position indicators inside .actions) rather than positioned as a separate overlay --
   so there is no absolute placement here to misbehave at any width, mirroring .author-feature-
   indicators living inside .author-feature-book .actions. */
.showcase-nav{display:flex;align-items:center;gap:.45rem}
.showcase-nav button{width:40px;height:40px;display:grid;place-items:center;border:1px solid #ffffff24;border-radius:50%;background:#07100dad;color:#dfe9e6;cursor:pointer;backdrop-filter:blur(10px)}
.showcase-nav button:hover{background:#0f1a17e6;color:#fff;border-color:#63e7c65c}
.showcase-nav button:focus-visible{outline:2px solid var(--aqua);outline-offset:3px}
.showcase-nav button[hidden]{display:none}
.showcase-nav .icon{width:22px;height:22px}
/* Same visual language as .author-feature-indicators (counter + dots), grouped in the actions row
   alongside Play/Details and the prev/next controls -- a distinct class because Video, unlike
   Author Library, also carries manual prev/next buttons in the same row. */
.showcase-indicators{display:flex;align-items:center;gap:.65rem;color:#d7e1de;font-size:.75rem;white-space:nowrap}
.showcase-indicators i{display:flex;gap:.28rem;font-style:normal}
.showcase-indicators b{width:.35rem;height:.35rem;border-radius:50%;background:#ffffff66;transition:background .18s,transform .18s}
.showcase-indicators b.active{background:var(--aqua);transform:scale(1.25)}
@media(max-width:760px){
  .showcase-nav button{width:44px;height:44px}
  .showcase-title .showcase-heading{font-size:2.1rem;max-width:90%}
}
/* ---------------------------------------------------------------------------
   2.1 SHARED NITROS HERO BACKDROP GRAMMAR -- one composition, many surfaces.

   `.nitros-art-hero` is worn by the Video hub showcase shell, Movie/TV detail heroes,
   Audio Home and the Author Library. `.nitros-art-media` is the corresponding artwork
   layer. The primitive owns backdrop geometry and integration; each surface retains its
   own height, content and controls.

   The composition is: a dark information column on the LEFT -> a soft blend ->
   a media region that begins around that blend and runs to the RIGHT EDGE of the
   viewport. The artwork is deliberately NOT one image stretched full-width under
   the text: the media layers start at --nitros-art-media-start and their own left
   edge is masked away over --nitros-art-blend, so the artwork emerges out of the dark
   field instead of butting against it in a hard vertical seam.
   --------------------------------------------------------------------------- */
.nitros-art-hero{position:relative;isolation:isolate;overflow:hidden;--nitros-art-media-start:44%;--nitros-art-blend:15%}
/* Both media layers occupy exactly the same region, so the static state and the trailer state are
   the same composition -- switching between them cannot move the copy or change the hero height. */
.nitros-art-hero .nitros-art-media{position:absolute;top:0;right:0;bottom:0;left:var(--nitros-art-media-start);width:auto;background:transparent;overflow:hidden;container-type:size;-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 var(--nitros-art-blend));mask-image:linear-gradient(90deg,transparent 0,#000 var(--nitros-art-blend))}.nitros-art-hero::before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none}.nitros-art-hero>:not(.nitros-art-media){position:relative;z-index:2}
/* cover + a right/upper bias keeps the useful focal region of a 16:9 backdrop inside a region that
   is now narrower than the viewport, rather than cropping into the middle of it. */
.nitros-art-hero .nitros-art-backdrop{background-size:cover;background-position:70% 22%}
/* The scrim is now a text protector, not a full-width wash: solid under the information column,
   gone by the time the media region is fully opaque. */
.nitros-art-hero::before{background:linear-gradient(90deg,#030807fa 0,#030807f2 24%,#030807c4 var(--nitros-art-media-start),#0308074a calc(var(--nitros-art-media-start) + var(--nitros-art-blend)),transparent calc(var(--nitros-art-media-start) + 26%)),linear-gradient(0deg,var(--night) 0,transparent 46%),linear-gradient(180deg,#02080866,transparent 26%)}
/* Because the scrim no longer covers the media region, motion never has to be revealed by weakening
   the text protection -- so it stays at full strength while a trailer plays, in both surfaces. */
.nitros-art-hero.trailer-playing::before,.nitros-art-hero.showcase-trailer-on::before{opacity:1}
/* THE TRAILER IS SIZED BY HEIGHT. The media region is a size container, so the player takes the
   region's full usable HEIGHT and derives its width from its own 16:9 ratio -- never the region's
   width. The min() is the one exception and it is a clamp, not a second sizing rule: where the
   region is proportionally narrower than 16:9 (a tall hero, a narrow window, a phone) a
   height-derived width would spill past the region and the trailer's own sides would be cropped
   off, so it fits by width there instead and stays fully visible. Either way it is centred WITHIN
   THE MEDIA REGION (its own container), never on the viewport. The mount itself stays transparent,
   so the item's artwork remains the media foundation around whatever the player does not cover;
   only the player element itself is black.
   A trailer sized to exactly fit its region (the calculation above) reads as small/adrift with
   visible artwork gutters on every side -- the ~10% scale() below fills more of the available media
   space so it feels integrated with the hero rather than squeezed into a corner. It is applied on
   top of the same fit, still centred on the region's own centre (scale() around an element's default
   transform-origin never moves that centre), and .nitros-art-media's existing overflow:hidden safely
   crops the small excess at the region's own edges -- it can never bleed past the hero/viewport. */
.nitros-art-hero .nitros-art-media .continuity-trailer-frame,.nitros-art-hero .nitros-art-media .continuity-trailer-video{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(1.1);height:min(100cqh,calc(100cqw * 9 / 16));width:auto;min-width:0;min-height:0;max-width:100cqw;aspect-ratio:16/9;border:0;object-fit:contain;background:#000}
/* The information column stays inside the dark field at every width. */
.nitros-art-hero .hero-copy,.nitros-art-hero .detail-hero-content{max-width:min(720px,calc(var(--nitros-art-media-start) + 4%))}
/* Between desktop and phone the text needs proportionally more room, so the media region starts
   later and blends over a wider band rather than the columns fighting each other. */
@media(max-width:1000px){.nitros-art-hero{--nitros-art-media-start:40%;--nitros-art-blend:22%}}
/* Narrow: the desktop left/right proportion is abandoned rather than compressed -- the media region
   becomes the full hero again (the original composition), the scrim returns to a full-width wash,
   and the trailer fits by WIDTH so it can never become a tall black canvas. */
@media(max-width:760px){
  .nitros-art-hero .nitros-art-media{left:0;-webkit-mask-image:none;mask-image:none}
  .nitros-art-hero .nitros-art-backdrop{background-position:62% 20%}
  .nitros-art-hero::before{background:linear-gradient(0deg,var(--night) 0,transparent 62%),linear-gradient(90deg,#030807ee 0,#030807b0 46%,transparent 88%)}
  /* the shared min() fit above already resolves to a width fit at this shape -- no second rule */
  .nitros-art-hero .hero-copy,.nitros-art-hero .detail-hero-content{max-width:100%}
  /* At this width the hero's own copy and actions reach full width, so the whole trailer-controls
     group (mute, volume, Close Trailer -- now always one unit) moves up to the top-right corner
     instead of sitting over Play/Trailer. Scoped to .nitros-art-hero, so it keeps its default
     bottom-right position everywhere else. */
  .nitros-art-hero .trailer-controls{top:4.1rem;bottom:auto}
}
@media(max-width:760px){
  .media-hero{min-height:52vh;padding-top:5.4rem;padding-bottom:2.9rem}
  .media-hero .hero-copy{width:calc(100vw - 2rem);max-width:calc(100vw - 2rem)}
  .hub-filters{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;padding-bottom:1.15rem}
  .hub-filters a{flex:0 0 auto;padding:.5rem .9rem;font-size:.8rem}
  .hero-overview{-webkit-line-clamp:2;font-size:.88rem}
  .media-hero .title-logo img{max-width:70vw;max-height:80px}
}
.book-secondary-seek{display:flex;justify-content:center;gap:.45rem;margin:1rem 0}.book-secondary-seek button{border:1px solid var(--line);border-radius:999px;background:#ffffff0c;color:var(--muted);padding:.42rem .65rem;font:inherit;font-size:.75rem;cursor:pointer}.book-tool{position:fixed;inset:0;z-index:130;display:grid;place-items:center;padding:1rem}.book-tool-backdrop{position:absolute;inset:0;background:#020504cc;backdrop-filter:blur(6px)}.book-tool-card{position:relative;width:min(680px,100%);max-height:min(76vh,700px);display:flex;flex-direction:column;padding:1.2rem;border:1px solid var(--line);border-radius:18px;background:#0c1918f7;box-shadow:var(--shadow)}.book-tool-card header,.book-tool-card footer{display:flex;align-items:center;justify-content:space-between;gap:.8rem}.book-tool-card h2{margin:0;font-family:"Barlow Condensed",sans-serif}.book-tool-card footer{margin-top:1rem;justify-content:flex-end}.book-tool-card input{padding:.75rem;border-radius:10px;border:1px solid var(--line);background:#07100f;color:var(--ink)}.book-tool-body{overflow:auto;display:grid;gap:.65rem;margin-top:1rem}.book-tool-row{display:flex;justify-content:space-between;gap:1rem;padding:.8rem;border:1px solid #ffffff12;border-radius:12px}.book-tool-row div:first-child{display:grid;gap:.25rem}.book-tool-row span,.book-tool-empty,.book-tool-error{color:var(--muted);font-size:.85rem}.book-tool-row div:last-child{display:flex;gap:.5rem;align-items:center}.book-tool-error{color:#ff9d9d}@media(max-width:760px){.book-tool{align-items:end;padding:.5rem}.book-tool-card{max-height:82vh;border-radius:18px 18px 10px 10px}.book-tool-row{align-items:start;flex-direction:column}.book-secondary-seek{flex-wrap:wrap}}

.af-toast button{margin-left:.6rem;border:0;background:none;color:var(--aqua);font:inherit;font-weight:800;cursor:pointer;text-decoration:underline}.dock-menu .dock-menu-action{border:0;background:transparent;color:#dce7e3;text-align:left;padding:.6rem .7rem;border-radius:8px;font:inherit;font-size:.85rem;cursor:pointer}.dock-menu .dock-menu-action:hover{background:#ffffff14}

.audiobook-player .book-player-main{grid-template-columns:minmax(260px,380px) minmax(440px,680px);gap:clamp(3rem,8vw,9rem);padding:2rem clamp(2rem,6vw,7rem)}.audiobook-player .book-player-copy{width:100%}.audiobook-player .book-controls{justify-content:center;gap:clamp(.7rem,1.8vw,1.4rem)}.audiobook-player .book-secondary-seek{justify-content:center;margin:.5rem 0 1.4rem}.audiobook-player .book-secondary-seek .ctrl-btn{width:42px;height:42px;padding:0}.audiobook-player .book-meta-row{display:grid;grid-template-columns:minmax(180px,1fr) auto auto auto auto auto;align-items:center}.audiobook-player .book-volume{justify-self:end}.audiobook-player .book-chapter{margin-bottom:.7rem}@media(max-width:760px){.audiobook-player .book-player-main{grid-template-columns:1fr;padding:1rem 1.25rem 3rem}.audiobook-player .book-meta-row{display:flex;justify-content:center}.audiobook-player .book-volume{justify-self:auto}.audiobook-player .volume-group{display:flex}.audiobook-player .volume-group .volume-slider{width:68px}}

/* Expanded audiobook player: listening controls are composed as one interface. */
.audiobook-player .book-player-main{grid-template-columns:minmax(280px,34%) minmax(560px,66%);width:min(1480px,100%);gap:clamp(3rem,7vw,8rem);padding:clamp(2rem,4vw,4rem) clamp(2rem,6vw,7rem) 3rem}
.audiobook-player .book-player-copy{min-width:0}
.audiobook-player .book-chapter{font-size:.86rem;letter-spacing:.1em;margin:1.35rem 0 1.15rem}
.audiobook-player .book-controls{justify-content:center;gap:clamp(.65rem,1.7vw,1.35rem);margin-bottom:1.15rem}
.audiobook-player .book-controls .ctrl-btn:not(.large){width:44px;height:44px}
.audiobook-player .book-controls .ctrl-btn.large{width:66px;height:66px}
.audiobook-player .book-secondary-seek{justify-content:center;align-items:center;gap:.42rem;margin:.7rem 0 1.35rem}
.audiobook-player .book-secondary-seek .ctrl-btn{width:36px;height:36px;padding:0;color:var(--ink)}
.audiobook-player .book-secondary-seek .icon{width:30px;height:30px}
.audiobook-player .book-secondary-seek-spacer{width:clamp(.6rem,1.8vw,1.4rem)}
.audiobook-player .book-meta-row{display:grid;grid-template-columns:minmax(220px,1fr) auto auto auto auto auto auto;align-items:center;gap:.55rem;margin-top:0}
.audiobook-player .book-chapter-select{width:100%;min-width:0;padding:.58rem .8rem;border-radius:12px}
.audiobook-player .book-chapter-select select{min-width:0;flex:1;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.audiobook-player .book-speed-select{white-space:nowrap}
.audiobook-player .book-volume{gap:.4rem;min-width:124px}
.audiobook-player .book-volume .ctrl-btn{width:36px;height:36px}
.audiobook-player .book-volume .volume-slider{width:78px}
.audiobook-player .book-meta-row>.ctrl-btn,.audiobook-player .book-meta-row .dock-more>.ctrl-btn{width:38px;height:38px}
.audiobook-player .book-meta-row .dock-more{display:flex}
.book-tool-card{width:min(700px,100%);padding:1.25rem}
.book-tool-card header{padding-bottom:.8rem;border-bottom:1px solid #ffffff14}
.book-tool-body{gap:.55rem}
.book-tool-row{align-items:center;padding:.8rem .9rem;background:#ffffff06}
.book-tool-row strong{font-size:.92rem}
.book-tool-row span{display:block}
.book-tool-actions{display:flex;align-items:center;gap:.45rem;white-space:nowrap}
.book-tool-row .button{padding:.48rem .68rem;font-size:.78rem;white-space:nowrap}
.book-tool-card footer .button{font-size:.82rem}
@media(max-width:1120px){
 .audiobook-player .book-player-main{grid-template-columns:minmax(240px,34%) minmax(420px,66%);gap:clamp(2rem,5vw,4rem)}
 .audiobook-player .book-meta-row{grid-template-columns:minmax(200px,1fr) auto auto auto auto auto;gap:.45rem}
 .audiobook-player .book-volume{grid-column:2 / span 2;grid-row:2;justify-self:end}
 .audiobook-player .book-meta-row .dock-more{grid-column:6;grid-row:1}
}
@media(max-width:820px){
 .audiobook-player .book-player-main{grid-template-columns:1fr;max-width:680px;padding:1rem 1.25rem 3rem;text-align:center}
 .audiobook-player .book-player-cover{width:min(52vw,250px);margin:0 auto .8rem}
 .audiobook-player .book-meta-row{display:flex;justify-content:center;gap:.5rem}
 .audiobook-player .book-chapter-select{flex:1 1 100%;text-align:left}
 .audiobook-player .book-volume{min-width:0}
 .audiobook-player .volume-group{display:flex}
}
@media(max-width:460px){
 .audiobook-player .book-controls{gap:.45rem}
 .audiobook-player .book-controls .ctrl-btn:not(.large){width:39px;height:39px}
 .audiobook-player .book-controls .ctrl-btn.large{width:59px;height:59px}
 .audiobook-player .book-secondary-seek{gap:.25rem}
 .audiobook-player .book-secondary-seek-spacer{width:.2rem}
 .audiobook-player .book-secondary-seek .ctrl-btn{width:34px;height:34px}
 .audiobook-player .book-volume .volume-slider{width:62px}
 .book-tool-row{align-items:stretch}
 .book-tool-actions{width:100%;justify-content:flex-end}
}

/* North Star audiobook console: compact playback block and deliberate utility line. */
.audiobook-player .book-player-main{grid-template-columns:minmax(280px,34fr) minmax(560px,66fr);width:min(1580px,100%);gap:clamp(2.5rem,6vw,6rem);padding:clamp(1.5rem,3vw,3rem) clamp(1.5rem,5vw,5rem) 2.25rem}
.audiobook-player .book-author{margin-bottom:.75rem}
.audiobook-player .book-controls{margin:0 0 .75rem}
.audiobook-player #book-seek{margin:0 0 .2rem}
.audiobook-player .book-time{margin-bottom:.45rem}
.audiobook-player .book-secondary-seek{gap:.45rem;margin:.35rem 0 .85rem}
.audiobook-player .book-secondary-seek .ctrl-btn{width:auto;min-width:68px;height:38px;padding:0 .68rem;gap:.32rem;border-radius:999px;font-size:.78rem;font-weight:700}
.audiobook-player .book-secondary-seek .icon{width:22px;height:22px}
.audiobook-player .book-secondary-seek-spacer{width:clamp(.9rem,2.4vw,1.8rem)}
.audiobook-player .book-meta-row{grid-template-columns:minmax(260px,1fr) auto auto auto auto auto auto;gap:.5rem}
.audiobook-player .book-utility-action{width:auto!important;padding:0 .68rem;gap:.38rem;border-radius:12px;font-size:.78rem;font-weight:700}
.audiobook-player .book-utility-action .icon{width:22px;height:22px}
.audiobook-player .book-chapter-select{min-width:260px}
@media(max-width:1180px){
 .audiobook-player .book-player-main{grid-template-columns:minmax(240px,34fr) minmax(430px,66fr);gap:clamp(2rem,4vw,3rem)}
 .audiobook-player .book-meta-row{grid-template-columns:minmax(220px,1fr) auto auto auto auto auto}
 .audiobook-player .book-volume{grid-column:2 / span 2;grid-row:2}
 .audiobook-player .book-meta-row .dock-more{grid-column:6;grid-row:1}
}
@media(max-width:820px){
 .audiobook-player .book-player-main{grid-template-columns:1fr;max-width:680px;padding:1rem 1.25rem 2.5rem}
 .audiobook-player .book-secondary-seek .ctrl-btn{min-width:62px;padding:0 .5rem}
 .audiobook-player .book-utility-label{display:none}
 .audiobook-player .book-utility-action{width:38px!important;padding:0;border-radius:50%}
}
@media(max-width:460px){
 .audiobook-player .book-secondary-seek{gap:.25rem}
 .audiobook-player .book-secondary-seek .ctrl-btn{min-width:58px;font-size:.72rem;padding:0 .38rem}
 .audiobook-player .book-secondary-seek-spacer{width:.35rem}
}

/* Audiobook chapter context occupies its own selector row above listening utilities. */
.audiobook-player .book-listening-controls{display:grid;gap:.55rem;width:100%}
.audiobook-player .book-listening-controls>.book-chapter-select{width:100%;min-width:0}
.audiobook-player .book-listening-controls>.book-meta-row{display:flex;align-items:center;justify-content:flex-start;gap:.5rem;margin:0;min-width:0}
.audiobook-player .book-listening-controls>.book-meta-row .book-volume{order:0;justify-self:auto}
.audiobook-player .book-listening-controls>.book-meta-row .book-speed-select{order:1}
.audiobook-player .book-listening-controls>.book-meta-row .book-utility-action,.audiobook-player .book-listening-controls>.book-meta-row>[data-book-restart],.audiobook-player .book-listening-controls>.book-meta-row .dock-more{order:2}
@media(max-width:1180px){
 .audiobook-player .book-listening-controls>.book-meta-row{display:flex}
 .audiobook-player .book-listening-controls>.book-meta-row .book-volume,.audiobook-player .book-listening-controls>.book-meta-row .dock-more{grid-column:auto;grid-row:auto}
}
@media(max-width:820px){
 .audiobook-player .book-listening-controls>.book-meta-row{justify-content:center;flex-wrap:wrap}
 .audiobook-player .book-listening-controls>.book-chapter-select{flex:none}
}

/* The expanded-player stack owns one shared content frame beside the cover. */
.audiobook-player .book-player-stack{min-width:0;width:100%}
@media(min-width:821px){
 .audiobook-player .book-player-stack{width:min(100%,720px);justify-self:center;align-self:center}
 .audiobook-player .book-player-stack .book-controls,.audiobook-player .book-player-stack .book-secondary-seek{width:100%;justify-content:center}
 .audiobook-player .book-player-stack #book-seek,.audiobook-player .book-player-stack .book-time,.audiobook-player .book-player-stack .book-listening-controls{width:100%}
 .audiobook-player .book-player-stack .book-listening-controls>.book-meta-row{justify-content:center}
}

/* A range thumb's centre travels inside its bounds; inset the visible rail by its half-width. */
input[type=range].af-seek{--range-thumb-radius:6.5px}
input[type=range].af-seek::-webkit-slider-runnable-track{margin-inline:var(--range-thumb-radius)}
input[type=range].af-seek::-moz-range-track,input[type=range].af-seek::-moz-range-progress{margin-inline:var(--range-thumb-radius)}

@media(max-width:760px){.author-library .detail-hero{--nitros-art-media-start:0%;--nitros-art-blend:0%;min-height:620px}.author-library .detail-back{top:4.75rem}.author-feature-layout{grid-template-columns:1fr;align-content:center;gap:2rem;padding:8.75rem 1rem 2rem}.author-library .author-feature-identity .detail-poster{width:112px}.author-feature-book{justify-self:stretch;width:100%}.author-feature-book h1{font-size:2.2rem}.author-feature-overview{-webkit-line-clamp:4}.author-feature-book .actions{margin-top:1rem}}
/* Music artwork shape tiers (shared across every surface that places album/track/artist artwork --
   card(), releaseCard(), listeningCard(), audioStaticHeroBody(), audioHubHero(): see
   musicShapeClass() in app.js). Every music entity is always 1:1 square; only the corner radius
   differs by type. These compound selectors deliberately match the specificity of the generic
   ".music-grid .poster{border-radius:12px}" and ".listening-art/.audio-now-art.square" rules above
   so a type-specific radius always wins over the flatter shared default, instead of depending on
   source order. Artist stays SQUARE here -- never circular. Movies/TV/audiobooks are untouched. */
.poster.shape-album,.audio-now-art.shape-album,.listening-art.shape-album,.detail-poster.shape-album{border-radius:6px}
.poster.shape-track,.audio-now-art.shape-track,.listening-art.shape-track,.detail-poster.shape-track{border-radius:14px}
.poster.shape-artist,.audio-now-art.shape-artist,.listening-art.shape-artist,.detail-poster.shape-artist{border-radius:24px}
/* Cross-media detail alignment: Artist/Album/Track's identity artwork sits inside the shared
   richHero() content region as a .detail-poster (whose own base rule above is aspect-ratio:2/3,
   correct for Movie/TV/Audiobook) -- these three variants force it back to square, matching the
   same musicShapeClass() shape every other music surface (card(), releaseCard(), audioHubHero())
   already uses. */
.detail-poster.shape-album,.detail-poster.shape-track,.detail-poster.shape-artist{aspect-ratio:1/1}
.rich-detail .detail-hero-content .detail-poster{width:clamp(120px,14vw,180px);margin:0 0 1rem;box-shadow:0 18px 44px #000b}
/* Video showcase: fixed mobile height (see .video-showcase above for the desktop value and the
   reasoning) -- placed last so it wins over .media-hero's own @media(max-width:760px) min-height
   rule earlier in this file regardless of selector order. Sized for the same richest realistic
   content combination at this breakpoint's smaller type sizes (80px title-logo cap, 2-line
   overview, an actions row that may wrap to two lines at narrow widths). */
@media(max-width:760px){.video-showcase{height:min(78vh,620px)}.showcase-title{max-height:104px}}
/* Mobile movie and TV detail hero (phone layout). The hero is a stacked composition, not a full-screen
   artwork backdrop with copy laid on top of it:
   1. Artwork band: the backdrop occupies only the top of the hero, from the top edge down to the
      bottom of a 16:9 media band that sits just below the Back button and safe-area-inset-top (capped
      by viewport height in landscape), plus a short fade zone. The trailer mounts inside that 16:9
      band at its natural fit (the desktop 1.1 scale is removed so no edges crop). Its controls sit in
      the otherwise empty top-right of the chrome row, opposite Back, so nothing overlays the trailer.
   2. Wordmark at the boundary: the copy column starts at the bottom of the trailer band. The
      wordmark/title therefore marks the transition from image to details, overlapping only the
      artwork's faded bottom edge and never the trailer.
   3. Details: metadata, Play/Trailer and synopsis follow beneath the wordmark on the solid page
      colour. Creator, cast, seasons and the collection rail stay in the scrolling sections below
      the hero.
   Scoped to .movie-detail/.show-detail at this breakpoint only: music and book heroes and the
   desktop/TV layout are untouched. */
@media(max-width:760px){
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero{--m-band-top:calc(env(safe-area-inset-top,0px) + 4.5rem);--m-band-h:min(calc(100vw * 9 / 16),56vh);--m-band-end:calc(var(--m-band-top) + var(--m-band-h));--m-art-end:calc(var(--m-band-end) + 2.5rem);min-height:0}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero>.detail-hero-media{bottom:auto;height:var(--m-art-end)}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero-content{padding-top:calc(var(--m-band-end) + .5rem);padding-bottom:1.5rem;pointer-events:none}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero-content>*{pointer-events:auto}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero-content>.title-logo{margin-top:0}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero-trailer{top:var(--m-band-top);bottom:auto;height:var(--m-band-h)}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero-trailer .continuity-trailer-video,.rich-detail:is(.movie-detail,.show-detail) .detail-hero-trailer .continuity-trailer-frame{transform:translate(-50%,-50%)}
  .rich-detail:is(.movie-detail,.show-detail) .trailer-controls{top:calc(env(safe-area-inset-top,0px) + clamp(1rem,3vh,1.5rem));right:clamp(1rem,3vw,2rem);bottom:auto}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero::before{background:linear-gradient(180deg,#02080866 0,transparent 4.5rem,transparent var(--m-band-end),var(--night) var(--m-art-end),var(--night) 100%)}
  .rich-detail:is(.movie-detail,.show-detail) .detail-hero.trailer-playing::before{opacity:1}
}
/* Mobile TV episode list: every row (owned and not owned) is thumbnail | number + runtime | one
   compact icon action. The " · title" span is hidden in the row on phones; owned episodes still show
   the title in full on their detail page. The number sits above the runtime so the text column is
   centred on the thumbnail. The action is a fixed 44px square (Play icon for owned, Download icon for
   missing) in its own grid column at the row's right edge, so it can never overlap the text. Its text
   label is hidden with font-size:0 and the icon is sized in px; the button keeps its existing
   primary/secondary colours and its aria-label. The reserved (still empty) per-episode menu column is
   dropped at this width so the action reaches the edge. The season-level Download button is outside
   .episode-card and keeps its full-width labelled form. The inherit rule keeps the title span in the
   strong's own colour at every width, so desktop rendering is unchanged. */
.episode-card strong>span{color:inherit}
@media(max-width:760px){
  .season-browser .episode-card{grid-template-columns:120px minmax(0,1fr) 44px;gap:.75rem}
  .season-browser .episode-row-menu{display:none}
  .season-browser .episode-title{display:none}
  .season-browser .episode-row-line{flex-direction:column;align-items:flex-start;gap:.15rem}
  .season-browser .episode-row-line strong{font-size:1rem}
  .season-browser .episode-play{width:44px;height:44px;min-width:0;min-height:0;padding:0;gap:0;font-size:0;justify-self:end}
  .season-browser .episode-play .icon{width:22px;height:22px;flex:none}
}
/* Mobile Video / Movies / TV Shows home hero, following the mobile detail-page composition:
   1. Artwork band: the backdrop (and a preview trailer, with its existing cover treatment) covers
      only the top of the hero, from the top edge to the bottom of a 16:9 band that starts just below
      the filter strip, plus a short fade into the page colour. The filter strip is pinned at its
      existing position so the band never moves with it.
   2. Wordmark at the boundary: the copy starts so the eyebrow sits on the artwork's faded lower edge
      and the wordmark/title lands on the artwork/details boundary.
   3. Details and controls: metadata, overview, then Resume/Play and Details side by side. The
      recovered row holds the existing rotation controls (previous/next, and mute while a preview
      plays) on the left and the position indicator on the right.
   The hero keeps a fixed height, as before, so rotating between titles never moves the rails below:
   it is the band plus a reserve sized for the richest rotation content (a resumed episode with a
   wordmark, episode line, progress and a two-line overview). */
@media(max-width:760px){
  .media-hero.video-showcase{--vs-band-top:8rem;--vs-band-end:calc(var(--vs-band-top) + 100vw * 9 / 16);--vs-art-end:calc(var(--vs-band-end) + 2.5rem);height:calc(var(--vs-band-end) + 25rem);min-height:0;justify-content:flex-start;padding-top:calc(var(--vs-band-end) - 1.6rem);padding-bottom:1.25rem}
  .media-hero.video-showcase .hub-filters{position:absolute;top:5.4rem;left:1rem;right:1rem;padding-bottom:0;margin:0}
  .media-hero.video-showcase .showcase-bg,.media-hero.video-showcase .showcase-trailer{bottom:auto;height:var(--vs-art-end)}
  .media-hero.video-showcase::before{background:linear-gradient(180deg,#030807b3 0,transparent var(--vs-band-top),transparent var(--vs-band-end),var(--night) var(--vs-art-end),var(--night) 100%)}
  .media-hero.video-showcase.showcase-trailer-on::before{opacity:1}
  .media-hero.video-showcase .eyebrow{margin-top:0}
  .media-hero:is(.video-showcase,.north-hero) .actions{display:grid;grid-template-columns:1fr 1fr;gap:.6rem;align-items:center;margin-top:1rem}
  .media-hero:is(.video-showcase,.north-hero) .actions>.button{width:100%;min-width:0;margin:0}
  .media-hero:is(.video-showcase,.north-hero) .actions>.button.secondary:first-child{grid-column:1/-1}
  /* Both share row 2: the controls may span it (mute appears beside previous/next while a preview
     plays), the indicator sits at its right end. */
  .media-hero:is(.video-showcase,.north-hero) .showcase-nav{grid-column:1/-1;grid-row:2;justify-self:start}
  .media-hero:is(.video-showcase,.north-hero) .showcase-indicators{grid-column:2;grid-row:2;justify-self:end}
}
/* Mobile bottom navigation: the five existing text labels at a readable size. The five equal grid
   columns, the label text and the destinations are unchanged; side padding is trimmed so the widest
   label ("Search") still fits a 320px phone without clipping. */
@media(max-width:760px){
  .nav{padding-left:.25rem;padding-right:.25rem}
  .nav a{padding-left:.1rem;padding-right:.1rem}
  .nav a::before{font-size:.8rem;letter-spacing:.03em}
}

/* Admin -> Storage (Build 235, simplified in Build 236). One tile per configured media drive, then the
   selected drive's capacity and media folders. Reuses the admin rows, buttons and focus ring. The bar
   shows used against total only; the internal 5% reserve is already taken out of "available". */
.storage-drives{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:1rem;margin-bottom:2rem}
.storage-drive{display:flex;flex-direction:column;align-items:stretch;gap:.55rem;min-width:0;min-height:96px;padding:1rem 1.1rem;border-radius:14px;border:1px solid var(--line);background:#ffffff08;color:var(--ink);text-align:left;font:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background-color .15s,border-color .15s}
.storage-drive strong{font-family:"Barlow Condensed",Inter,sans-serif;font-size:20px;font-weight:700;overflow-wrap:anywhere}
.storage-drive.selected{border-color:var(--nitros-selected);background:#ffffff0f}
.storage-drive:active{background:#ffffff05}
.storage-drive-sub{font-size:14px;color:var(--muted)}
.storage-add{justify-content:center;border-style:dashed;background:transparent}
.storage-bar{display:flex;height:8px;border-radius:4px;overflow:hidden;background:#ffffff14}
.storage-bar-used{background:var(--aqua)}
.storage-bar-unavailable{background:repeating-linear-gradient(135deg,#ffffff14 0 6px,transparent 6px 12px)}
.storage-panel .storage-bar{height:12px;border-radius:6px;margin-bottom:.8rem}
.storage-space{margin:0;color:var(--muted)}
.storage-space b{color:var(--ink);font-weight:600}
.storage-warning{margin:.6rem 0 0;color:#ff9d9d;font-weight:600}
button.admin-row{width:100%;background:none;border:0;border-bottom:1px solid var(--line);color:var(--ink);font:inherit;text-align:left;cursor:pointer;-webkit-tap-highlight-color:transparent}
.storage-controls{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;margin:1.2rem 0 .4rem}
.storage-search{flex:1 1 220px;min-width:0;min-height:44px;padding:0 .9rem;border:1px solid #ffffff25;border-radius:var(--nitros-control-radius);background:#07100f;color:var(--ink);font:inherit}
.storage-sort{min-height:44px;padding:0 .6rem;border:1px solid #ffffff25;border-radius:var(--nitros-control-radius);background:#07100f;color:var(--ink);font:inherit}
.storage-share{margin-top:1.4rem}
.storage-actions{margin-top:1rem}
.storage-more{margin-top:1rem}
#storage-root .admin-row:focus-visible{outline-offset:-3px}
@media (hover:hover){.storage-drive:hover,#storage-root button.admin-row:hover{background:#ffffff0d}}
@media(max-width:760px){.storage-drives{grid-template-columns:1fr 1fr;gap:.75rem}.storage-drive{min-height:84px;padding:.85rem}.storage-drive strong{font-size:17px}}

/* Admin Stage 1 (Build 239): usability and consistency across desktop, tablet, TV and phone. */
/* Panels and grid items may shrink instead of pushing past the screen edge. */
.admin-actions-row{align-items:start}
.admin-actions-row>*,.admin-panel,.admin-row-main{min-width:0}
.admin-filename-list li,.admin-row-main strong,.admin-row-sub{overflow-wrap:anywhere}
.admin-filename-list li .admin-row-sub{display:block;margin-top:.15rem}
/* One feedback/warning colour; failures are drawn as text, never as alerts. */
.admin-row-state.bad,.admin-row-warning{color:#ff9d9d}
.admin-row:has(>.admin-action-feedback){flex-wrap:wrap}
.admin-row>.admin-action-feedback,.admin-attention-item>.admin-action-feedback{flex-basis:100%}
/* Touch and remote targets: every Admin control is at least 44px tall. */
.admin-topnav a{display:inline-flex;align-items:center;min-height:44px}
.admin-page .button,.admin-modal .button,.admin-crumb{min-height:44px}
.admin-page .button.ghost{padding-left:.7rem;padding-right:.7rem}
.admin-row-actions{align-items:center}
.admin-page input[type=checkbox][role=switch],.admin-toggle-row input[type=checkbox]{width:24px;height:24px}
/* Technical details stay available without dominating the page. */
.admin-details{margin:.4rem 0}
.admin-details summary{display:flex;align-items:center;min-height:44px;cursor:pointer;color:var(--muted);font-weight:600}
.admin-details summary:focus-visible{outline-offset:2px}
/* Phones and narrow tablets: an activity row stacks title, status and actions instead of squeezing the
   title to one character per line; while anything is in progress, Current Activity comes first. */
.admin-media-layout{display:flex;flex-direction:column}
@media(max-width:1100px){.admin-media-layout:has(#admin-activity-slot .admin-row-list) .admin-activity{order:-1;margin-bottom:28px}.admin-media-layout:has(#admin-activity-slot .admin-row-list) #admin-attention-slot{order:-2}}
@media(max-width:760px){
 .admin-activity-row{flex-wrap:wrap;align-items:flex-start;gap:.5rem 1rem}
 .admin-activity-row .admin-row-main{flex:1 1 100%}
 .admin-activity-row .admin-row-state{white-space:normal;text-align:left;flex:1 1 auto}
 .admin-activity-row .admin-progress{justify-content:flex-start;min-width:0}
 .admin-activity-row .admin-row-actions{flex:1 1 100%}
 .admin-section-heading{flex-wrap:wrap}
 .admin-field-row{flex-wrap:wrap}
 .admin-field-row input{flex:1 1 100%}
 .admin-field-row .button{flex:1 1 auto}
 .admin-page>.admin-page-head{margin-bottom:16px}
}
/* TV and very wide screens: larger supporting text for reading at a distance. */
@media(min-width:1800px){
 .admin-row-sub,.admin-row-state,.admin-panel-desc,.admin-quiet-line,.admin-inline-feedback,.admin-progress span,.admin-filename-list{font-size:17px}
 .admin-row-main strong{font-size:18px}
 .admin-sub{font-size:18px}
}
.admin-row label[for]{display:flex;align-items:center;min-height:44px;cursor:pointer}
.admin-row-actions .button,.admin-section-actions .button{white-space:nowrap}
.admin-page>.admin-page-head+.admin-sub+*{margin-top:24px}
.admin-details summary::before{content:'\25B8';display:inline-block;margin-right:.5rem;transition:transform .15s}
.admin-details[open] summary::before{transform:rotate(90deg)}
.admin-details summary::-webkit-details-marker{display:none}
/* Admin Stage 2 (Build 241): shared Activity indicator -- top-right, clear of the Back button, the bottom
   navigation and the music/audiobook mini-players; only present while a user-started operation runs. */
.admin-activity-indicator{position:fixed;z-index:6;top:16px;right:clamp(1rem,3vw,2rem);display:flex;flex-direction:column;align-items:flex-end;gap:8px;max-width:calc(100vw - 2rem)}
.admin-activity-indicator[hidden]{display:none}
.admin-activity-pill{display:inline-flex;align-items:center;gap:.6rem;min-height:46px;max-width:min(380px,calc(100vw - 9rem));padding:0 1rem;border:1px solid #ffffff25;border-radius:999px;background:#07100de8;color:var(--ink);font:inherit;font-size:.88rem;font-weight:700;cursor:pointer;backdrop-filter:blur(12px)}
.admin-activity-pill[aria-expanded="true"]{border-color:var(--aqua)}
.admin-activity-pill-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.admin-activity-pill-state{flex:0 0 auto;white-space:nowrap;color:var(--aqua)}
.admin-activity-panel{width:min(400px,calc(100vw - 2rem));max-height:min(65vh,560px);overflow:auto;padding:.5rem;border:1px solid #ffffff25;border-radius:16px;background:#07100df7;box-shadow:var(--shadow);backdrop-filter:blur(16px)}
.admin-activity-panel[hidden]{display:none}
.admin-activity-heading{margin:.4rem .6rem .5rem;font-size:.8rem;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.admin-activity-list{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.admin-activity-item{display:grid;gap:.3rem;width:100%;min-height:44px;padding:.75rem;border:0;border-radius:12px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}
.admin-activity-item:hover,.admin-activity-item:focus-visible{background:#ffffff10}
.admin-activity-kind{font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.admin-activity-item strong{overflow-wrap:anywhere}
.admin-activity-stage{font-size:.88rem;color:var(--muted)}
.admin-activity-detail{font-size:.85rem;color:#ff9d9d}
.admin-activity-bar{display:block;height:4px;border-radius:4px;background:#ffffff1f;overflow:hidden}
.admin-activity-bar i{display:block;height:100%;background:var(--aqua)}
@media(max-width:760px){.admin-activity-indicator{top:.7rem;right:.7rem;max-width:calc(100vw - 1.4rem)}.admin-activity-pill{max-width:calc(100vw - 6.5rem)}.admin-activity-panel{width:calc(100vw - 1.4rem)}}
@media(min-width:1800px){.admin-activity-pill{min-height:56px;font-size:1.1rem;padding:0 1.3rem;max-width:520px}.admin-activity-panel{width:520px}.admin-activity-item{padding:1rem}.admin-activity-item strong{font-size:1.2rem}.admin-activity-stage,.admin-activity-detail{font-size:1.05rem}.admin-activity-kind{font-size:.85rem}}
/* Storage Management Move/Delete (Build 243): folder rows are selectable; actions appear under the chosen
   folder; destination choices and the deletion list live in the shared admin modal. */
.storage-folder{width:100%;border:0;border-bottom:1px solid var(--line);border-radius:0;background:transparent;color:var(--ink);font:inherit;text-align:left;cursor:pointer}
.storage-folder:hover,.storage-folder.selected{background:#ffffff0a}
.storage-folder-actions{justify-content:flex-end;padding:.6rem 0 .9rem;border-bottom:1px solid var(--line)}
.storage-operation{display:flex;align-items:center;gap:.6rem;margin:0 0 1rem;color:var(--muted);overflow-wrap:anywhere}
.storage-destinations{margin:1rem 0}
.storage-destination{width:100%;border:1px solid var(--line);border-radius:12px;margin-bottom:.5rem;padding:.7rem 1rem;background:transparent;color:var(--ink);font:inherit;text-align:left;cursor:pointer}
.storage-destination[aria-checked="true"]{border-color:var(--aqua);background:#ffffff0d}
.storage-destination:disabled{cursor:default;opacity:.55}
.storage-delete-path{overflow-wrap:anywhere}
.storage-delete-files{list-style:none;margin:.5rem 0 1rem;padding:0;max-height:min(40vh,320px);overflow:auto;border:1px solid var(--line);border-radius:12px}
.storage-delete-files li{display:flex;justify-content:space-between;gap:1rem;padding:.45rem .8rem;border-bottom:1px solid var(--line);font-size:.88rem;overflow-wrap:anywhere}
.storage-delete-files li:last-child{border-bottom:0}
.storage-delete-files li span:last-child{flex:0 0 auto;color:var(--muted)}
@media(min-width:1800px){.storage-delete-files li{font-size:1.05rem}}
/* Build 244: a stopped (failed or interrupted) Move stays on the Storage page with Try Again / Cancel Move. */
.storage-operation-stopped{margin:0 0 1rem}
.storage-operation-actions{justify-content:flex-start;margin-top:.5rem}
.admin-activity-stopped{display:inline-grid;place-items:center;width:18px;height:18px;flex:0 0 auto;border-radius:50%;background:#ff9d9d;color:#1a0505;font-size:.75rem;font-weight:900}
/* Build 247: Default Storage Locations -- one drive selector per download category. */
.storage-defaults{margin-top:2rem}
.storage-default{flex-wrap:wrap;gap:.75rem 1rem}
.storage-default label.admin-row-main{flex:1 1 180px;min-width:0;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;text-align:left;cursor:default}
.storage-default-select{flex:0 0 auto;min-height:44px;width:min(260px,100%)}

/* Inactive book flyouts cannot extend the document beyond its viewport. */
.book-shelf-card:not(:hover):not(:focus-within) .book-peek{display:none}

/* A hidden AirPlay action must not inherit the generic button display rule. */
[data-video-airplay][hidden]{display:none}

/* Build 268: one unobtrusive playback status surface (buffering / reconnecting / connection unavailable /
   reconnected). Never focusable or clickable, so TV remote, keyboard and touch navigation are unaffected. */
.playback-status{position:fixed;z-index:400;top:calc(env(safe-area-inset-top,0px) + 14px);left:50%;transform:translateX(-50%);max-width:calc(100vw - 32px);padding:.5rem .95rem;border-radius:999px;background:#05100ee6;border:1px solid #ffffff26;color:var(--ink);font-size:.86rem;font-weight:700;letter-spacing:.01em;line-height:1.3;text-align:center;box-shadow:0 8px 28px #0009;pointer-events:none;display:flex;align-items:center;gap:.55rem}
.playback-status[hidden]{display:none}
.playback-status::before{content:"";flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--aqua);animation:af-pulse 1.4s ease-in-out infinite}
.playback-status[data-state="recovered"]::before{animation:none;background:#5fe0a8}
.playback-status[data-state="unavailable"]::before,.playback-status[data-state="offline"]::before{background:#f0a35a}
@media (prefers-reduced-motion:reduce){.playback-status::before{animation:none}}

/* Build 273: device-specific volume. Desktop keeps the slider and mute. Phones/tablets (no hover) and TV
   browsers (html.nitros-tv, set from the user agent in app.js -- a coarse pointer is not assumed to mean
   TV) keep only mute: the hardware/remote volume is the volume control there. display:none also keeps
   the hidden sliders out of D-pad spatial navigation (spatialNavVisible). */
@media (hover:none){.volume-slider,[data-music-volume],[data-trailer-volume]{display:none!important}}
html.nitros-tv .volume-slider,html.nitros-tv [data-music-volume],html.nitros-tv [data-trailer-volume]{display:none!important}
/* Build 275: Administration dashboard and destinations. Panels reuse the Admin panel surface; the progress
   fill is the Details-page Download button's yellow treatment (see .button.download-status). */
.admin-home-link{display:inline-flex;align-items:center;min-height:44px;margin:.6rem 0 .2rem;font-family:"Barlow Condensed",Inter,sans-serif;font-size:16px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);text-decoration:none}
.admin-home-link::before{content:"‹";margin-right:.45rem;font-size:1.2em}
.admin-home-link:hover{color:var(--nitros-green)}
.admin-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));gap:1rem;margin-top:1.2rem}
.admin-tile{display:flex;flex-direction:column;gap:.55rem;min-height:170px;padding:1.4rem 1.5rem;border-radius:18px;background:#ffffff08;border:1px solid var(--line);color:var(--ink);text-decoration:none;transition:border-color .16s ease,background-color .16s ease,transform .16s ease}
.admin-tile:hover{border-color:#d7c84f66;background:#ffffff0d}
.admin-tile:focus-visible{outline:3px solid var(--aqua);outline-offset:3px}
.admin-tile-title{font-family:"Barlow Condensed",Inter,sans-serif;font-size:20px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.admin-tile-title::after{content:" ›";color:var(--aqua)}
.admin-tile-body{display:flex;flex-direction:column;gap:.35rem}
.admin-tile-value{font-family:"Barlow Condensed",Inter,sans-serif;font-size:clamp(1.6rem,2.4vw,2.2rem);font-weight:700;line-height:1.05}
.admin-tile-sub{color:var(--muted);font-size:.92rem;line-height:1.35}
.admin-tile-warn{color:#ffbd4d}
.admin-meter{display:block;width:100%;height:8px;border-radius:999px;background:linear-gradient(90deg,var(--aqua) var(--fill,0%),#7d7638 var(--fill,0%));margin:.15rem 0}
.admin-progress .admin-meter,.admin-row-state .admin-meter{width:110px;flex:0 0 auto}
.admin-row-state{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;justify-content:flex-end}
.admin-dash-attention:empty{display:none}
.admin-attention-panel .admin-attention-strip{margin-bottom:.8rem;min-height:60px}
.admin-badge{flex:0 0 auto;padding:.2rem .6rem;border-radius:999px;background:#d7c84f22;color:var(--aqua);font-size:.78rem;font-weight:600;white-space:nowrap}
.admin-window-form{display:flex;align-items:flex-end;gap:.8rem;flex-wrap:wrap;margin:.6rem 0}
.admin-window-form label{display:flex;flex-direction:column;gap:.3rem;color:var(--muted);font-size:.85rem}
.admin-window-form input,.admin-window-form select{min-height:44px;padding:.4rem .7rem;border-radius:10px;border:1px solid var(--line);background:#0c1a18;color:var(--ink);font:inherit;color-scheme:dark}
.admin-inline-link{color:var(--aqua)}
.admin-window-line b{color:var(--ink)}
.admin-task-row .admin-row-sub+.admin-row-sub{margin-top:.2rem}
.storage-total{margin:0 0 .8rem}
.storage-folders-details>summary,.storage-locations>summary{min-height:44px;display:flex;align-items:center;cursor:pointer}
@media(max-width:760px){
 .admin-tile{min-height:0;padding:1.1rem 1.2rem}
 .admin-row-state{justify-content:flex-start}
 .admin-row{flex-wrap:wrap}
}
.viewing-status{display:block;font-size:.75rem;color:var(--muted);line-height:1.6;margin-top:.25rem}

/* Build 278: reuse the player dock, range and loading diamond on television. */
html.nitros-tv .video-player [data-video-mute],html.nitros-tv .video-player [data-video-fullscreen]{display:none!important}
html.nitros-tv .video-player .dock-row{order:0}
html.nitros-tv .video-player .seek-row{order:1}
html.nitros-tv .video-player .dock-spacer{flex:0;width:1rem}
html.nitros-tv .video-player :focus-visible,html.nitros-tv .video-player .select-wrap:focus-within{outline:3px solid var(--aqua);outline-offset:4px}
html.nitros-tv #video-seek::-moz-range-track{background:linear-gradient(to right,var(--aqua) 0 var(--fill),#ffffff25 var(--fill) 100%)}
html.nitros-tv #video-seek::-moz-range-progress{background:transparent}
.episode-still{position:relative}
.episode-card .watched{color:var(--aqua)}
.player-startup{position:absolute;inset:0;z-index:2;display:grid;place-items:center;pointer-events:none;background:#030807}

.video-player.controls-hidden .skip-segment,.video-player.controls-hidden .next-episode{opacity:0;pointer-events:none}
