/* =====================================================================
   NAVA · Immersive Player-First — total redesign (staging)
   Framework-free. Responsive: desktop · laptop · tablet · car · mobile.
   ===================================================================== */

:root{
  --bg:#07060f; --bg2:#0c0a18;
  --violet:#8b5cf6; --cyan:#22d3ee; --magenta:#d946ef;
  --grad:linear-gradient(135deg,#8b5cf6 0%,#22d3ee 100%);
  --glass:rgba(255,255,255,.05); --glass2:rgba(255,255,255,.08);
  --line:rgba(255,255,255,.10); --line2:rgba(255,255,255,.16);
  --txt:#f4f2ff; --txt2:#b9b4cf; --muted:#7b7595;
  --glow-v:rgba(139,92,246,.45); --glow-c:rgba(34,211,238,.40);
  --r:18px; --r-sm:12px; --r-lg:26px;
  /* ambient colors (overwritten from artwork) */
  --c1:#6d28d9; --c2:#0e7490;
  --topbar-h:64px; --dock-h:0px;
  font-synthesis:none;
}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
[hidden]{display:none!important}
html,body{height:100%}
/* themed scrollbars — replace the browser default to match the Midnight-Glass look */
*{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) transparent}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:rgba(255,255,255,.16);border:3px solid transparent;border-radius:10px;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:rgba(139,92,246,.6);background-clip:padding-box}
::-webkit-scrollbar-thumb:active{background:rgba(34,211,238,.65);background-clip:padding-box}
::-webkit-scrollbar-corner{background:transparent}
/* image holders get a gradient base so loading/missing art looks intentional */
.rimg,.mini-art,.art,.rail-card img,.detail-head img,.card .thumb{
  background:linear-gradient(135deg,#241f47,#16324a)}
body{
  font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
  color:var(--txt); background:var(--bg); overflow:hidden;
  -webkit-font-smoothing:antialiased; line-height:1.5;
}
button{font-family:inherit;color:inherit;cursor:pointer;border:none;background:none}
img{display:block;max-width:100%}
input{font-family:inherit}
h1,h2,h3,.brand-name,.now-title{font-family:'Sora',sans-serif}

/* ── Ambient backdrop ─────────────────────────────────────────────── */
.ambient{
  position:fixed;inset:-20% ;z-index:0;pointer-events:none;
  background:
    radial-gradient(60% 60% at 18% 12%, var(--c1), transparent 60%),
    radial-gradient(60% 70% at 88% 18%, var(--c2), transparent 60%),
    radial-gradient(80% 80% at 50% 120%, #5b21b6, transparent 60%),
    linear-gradient(180deg,#0b0a16,#060410);
  filter:saturate(135%) blur(20px);
  transition:background 1.2s ease;
  opacity:.85;
}
.grain{position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.035;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");}

/* ── App grid ─────────────────────────────────────────────────────── */
.app{position:relative;z-index:2;height:100%;display:grid;
  grid-template-rows:var(--topbar-h) 1fr;
  /* keep content out of the notch / home-indicator on iOS (env() is 0 on Android/desktop) */
  padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);}

/* ── Top bar ──────────────────────────────────────────────────────── */
.topbar{display:flex;align-items:center;gap:18px;padding:0 22px;
  background:rgba(10,8,20,.5);backdrop-filter:blur(22px) saturate(150%);
  -webkit-backdrop-filter:blur(22px) saturate(150%);
  border-bottom:1px solid var(--line);}
.brand{display:flex;align-items:center;gap:10px}
.brand-mark{width:34px;height:34px;border-radius:11px;overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.4)}
.brand-mark img{width:100%;height:100%;object-fit:cover;display:block}
.brand-name{font-weight:800;letter-spacing:3px;font-size:18px;
  background:var(--grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.top-nav{display:flex;gap:6px;margin-left:8px}
.top-link{display:flex;align-items:center;gap:8px;padding:9px 16px;border-radius:12px;color:var(--txt2);
  font-weight:600;font-size:14px;transition:.2s}
.top-link i{font-size:14px}
.top-link:hover{background:var(--glass2);color:var(--txt)}
.top-link.active{color:#fff;background:linear-gradient(90deg,rgba(139,92,246,.30),rgba(34,211,238,.12));
  box-shadow:inset 0 0 0 1px var(--line2)}
.top-actions{margin-left:auto;display:flex;gap:10px;align-items:center}
.ghost-btn{display:flex;align-items:center;gap:8px;padding:9px 14px;border-radius:12px;
  background:var(--glass);border:1px solid var(--line);color:var(--txt2);font-weight:600;font-size:13px;transition:.2s}
.ghost-btn:hover{background:var(--glass2);color:var(--txt);border-color:var(--line2)}
#sleepBtn.active{background:var(--grad);color:#0a0a14;border-color:transparent;box-shadow:0 0 18px var(--glow-c)}   /* sleep timer running */
.offline-pill{display:none;align-items:center;gap:7px;padding:7px 13px;border-radius:11px;background:rgba(251,113,133,.14);border:1px solid rgba(251,113,133,.4);color:#fb7185;font-size:12px;font-weight:700;white-space:nowrap}
body.offline .offline-pill{display:inline-flex}
/* storage readout on Downloaded page */
.storage-bar{margin:0 0 16px}
.sb-top{display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:12px;color:var(--txt2);margin-bottom:7px;flex-wrap:wrap}
.sb-top b{color:var(--txt)}.sb-top i{margin-right:6px;color:var(--cyan)}.sb-dev{color:var(--muted)}
.sb-track{height:7px;border-radius:5px;background:rgba(255,255,255,.1);overflow:hidden}
.sb-fill{height:100%;border-radius:5px;background:var(--grad);box-shadow:0 0 12px var(--glow-v)}
.sb-fill.warn{background:linear-gradient(90deg,#f59e0b,#ef4444);box-shadow:0 0 12px rgba(239,68,68,.5)}
.sb-warn{display:flex;align-items:center;gap:7px;color:#fbbf24;font-size:11.5px;margin-top:8px}
.gate-list{list-style:none;margin:2px 0 18px;padding:0;display:flex;flex-direction:column;gap:10px}
.gate-list li{display:flex;align-items:center;gap:11px;font-size:14px;color:var(--txt2)}
.gate-list li.ok{color:var(--txt)} .gate-list li.ok i{color:#34d399} .gate-list li.todo i{color:var(--muted)}

/* ── Stage + hero ─────────────────────────────────────────────────── */
.stage{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:stretch;padding:clamp(14px,2.4vw,34px)}
.hero{width:100%;max-width:1180px;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:clamp(14px,2vw,24px);min-height:0}
.hero-empty{margin:auto;display:grid;place-items:center;gap:14px;text-align:center;color:var(--txt2);padding:40px}
.hero-empty-art{width:120px;height:120px;border-radius:50%;display:grid;place-items:center;font-size:46px;
  background:var(--glass);border:1px solid var(--line);color:var(--violet);animation:spin 8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.inline-link,.text-btn{background:var(--grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;font-weight:700}

.hero-now{display:grid;grid-template-columns:auto minmax(0,1fr);gap:clamp(20px,3.5vw,52px);align-items:center;min-width:0;width:100%;flex:0 0 auto}

/* artwork */
.art-wrap{position:relative;aspect-ratio:1;width:min(42vh,40vw,440px);justify-self:center;flex:0 0 auto}
.art{width:100%;height:100%;object-fit:cover;border-radius:var(--r-lg);
  box-shadow:0 30px 80px rgba(0,0,0,.6);position:relative;z-index:2;background:var(--glass)}
.art-glow{position:absolute;inset:-8% ;border-radius:50%;z-index:1;filter:blur(46px);opacity:.85;
  background:radial-gradient(circle,var(--c1),var(--c2) 60%,transparent 72%);animation:pulse 6s ease-in-out infinite}
@keyframes pulse{0%,100%{transform:scale(1);opacity:.7}50%{transform:scale(1.06);opacity:.95}}
/* Now-playing action rail: a vertical bar of like / add-to-playlist / download in the space to the
   RIGHT of the album art (Instagram-style, but beside the art rather than over it). art-stage lays the
   square art and the rail out in one centred row; the rail sits in the empty space next to the art. */
.art-stage{position:relative;display:flex;align-items:center;justify-content:center;gap:14px}
.art-actions{display:flex;flex-direction:column;gap:12px;flex:0 0 auto}
.art-actions .act-btn,.art-actions .dl-btn{width:46px;height:46px;border-radius:50%;display:grid;place-items:center;
  font-size:17px;background:rgba(8,6,16,.55);backdrop-filter:blur(10px);border:1px solid var(--line2);
  color:#fff;transition:transform .15s,color .2s,box-shadow .2s;flex:0 0 auto;cursor:pointer}
.art-actions .act-btn:hover,.art-actions .dl-btn:hover{transform:scale(1.08);box-shadow:0 0 20px var(--glow-v)}
#favBtn.on{background:var(--grad);color:#0a0a14;border-color:transparent}

/* Now-playing art gestures (wired in nava.js):
   • double-tap → like/unlike (heart-pop overlay below)
   • swipe left/right → next/prev (JS drives .art transform; pan-y keeps vertical scroll,
     user-drag off so the image isn't ghost-dragged on desktop). */
.art{touch-action:pan-y;user-select:none;-webkit-user-select:none;-webkit-user-drag:none;will-change:transform,opacity}
.art-heart{position:absolute;inset:0;z-index:4;display:grid;place-items:center;pointer-events:none}
.art-heart i{font-size:clamp(64px,26vmin,120px);color:#ff5d8f;
  filter:drop-shadow(0 8px 26px rgba(255,93,143,.55));animation:heartPop .7s cubic-bezier(.2,.7,.2,1) forwards}
.art-heart.un i{color:var(--txt2);filter:drop-shadow(0 8px 22px rgba(0,0,0,.5))}
@keyframes heartPop{0%{transform:scale(.3);opacity:0}15%{transform:scale(1.15);opacity:1}
  40%{transform:scale(.94)}60%{transform:scale(1.04)}100%{transform:scale(1.35);opacity:0}}

/* now meta */
.now-meta{min-width:0}
.now-kicker{letter-spacing:3px;font-size:12px;font-weight:700;color:var(--cyan);margin-bottom:10px}
.now-title{font-size:clamp(28px,4.4vw,52px);font-weight:800;line-height:1.16;letter-spacing:-.5px;padding-bottom:2px;
  overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.now-artist{font-size:clamp(15px,1.8vw,20px);color:var(--txt2);font-weight:600;margin-top:8px;text-align:left}
.now-artist:hover{color:var(--cyan)}
.now-album{display:block;font-size:clamp(13px,1.5vw,16px);color:var(--muted);font-weight:500;margin-top:4px;text-align:left}
.now-album:hover{color:var(--cyan)}
.now-album i{font-size:.82em;margin-right:6px;opacity:.75}

/* scrubber */
.scrubber{display:flex;align-items:center;gap:12px;margin:clamp(20px,3vw,34px) 0 18px}
.scrubber .t{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums;min-width:38px}
.scrubber .t.dur{text-align:right}
.track{position:relative;flex:1;height:8px;border-radius:6px;background:rgba(255,255,255,.10);cursor:pointer}
.buffered{position:absolute;left:0;top:0;height:100%;border-radius:6px;background:rgba(255,255,255,.26);width:0;transition:width .25s linear}
.fill{position:absolute;left:0;top:0;height:100%;border-radius:6px;background:var(--grad);width:0;box-shadow:0 0 14px var(--glow-v)}
.fill .knob{position:absolute;right:-7px;top:50%;transform:translateY(-50%);width:14px;height:14px;border-radius:50%;
  background:#fff;box-shadow:0 0 12px var(--glow-c);opacity:0;transition:opacity .2s}
.track:hover .knob{opacity:1}

/* transport */
.transport{display:flex;align-items:center;gap:clamp(10px,2vw,22px)}
.t-btn{width:52px;height:52px;border-radius:50%;display:grid;place-items:center;font-size:19px;color:var(--txt2);transition:.18s}
.t-btn:hover{color:#fff;background:var(--glass2);transform:scale(1.06)}
.t-btn.active{color:var(--cyan)}
/* Repeat-one: fa-repeat glyph stays visible; a small "1" badge marks the one-track mode */
#repeatBtn{position:relative}
#repeatBtn.repeat-one::after{content:'1';position:absolute;top:2px;right:6px;min-width:15px;height:15px;padding:0 3px;border-radius:8px;background:var(--cyan);color:#0a0a14;font:800 10px/15px 'Sora',sans-serif;text-align:center;box-shadow:0 0 0 2px var(--bg,#07060f)}
.t-btn.play{width:74px;height:74px;font-size:26px;background:var(--grad);color:#0a0a14;
  box-shadow:0 0 34px var(--glow-v),0 10px 26px rgba(0,0,0,.4)}
.t-btn.play:hover{transform:scale(1.05);box-shadow:0 0 46px var(--glow-c)}
.t-btn.sm{width:42px;height:42px;font-size:15px}

/* sub controls */
.sub-controls{display:flex;align-items:center;gap:18px;margin-top:clamp(18px,3vw,30px);flex-wrap:wrap}
.volume{display:flex;align-items:center;gap:8px;min-width:150px}
.volume input[type=range]{flex:1;accent-color:var(--cyan);height:4px}
.quality{display:flex;gap:6px;background:var(--glass);padding:4px;border-radius:12px;border:1px solid var(--line)}
.chip{padding:7px 12px;border-radius:9px;font-size:12px;font-weight:600;color:var(--txt2);transition:.2s}
.chip:hover{color:var(--txt)}
.chip.active{background:var(--grad);color:#0a0a14}

/* up next rail */
/* Up Next — horizontal "filmstrip": numbered covers, next-track highlighted, faded edges,
   hidden scrollbar, snap-scroll. Fixed (compact) height so the whole player fits one screen. */
.upnext-rail{flex:0 0 auto;min-width:0;margin-top:2px}
.rail-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700;color:var(--txt2);font-size:13px;letter-spacing:.4px}
.rail-head .text-btn{font-size:12px}
.rail-items{display:flex;gap:14px;overflow-x:auto;overflow-y:hidden;padding:6px 2px 8px 8px;scroll-padding-left:8px;scroll-snap-type:x proximity;scrollbar-width:none;
  -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 52px),transparent 100%);
          mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 52px),transparent 100%)}
.rail-items::-webkit-scrollbar{display:none}
.rail-card{flex:0 0 auto;width:clamp(76px,11.5vh,108px);cursor:pointer;scroll-snap-align:start}
.rail-card .rc-img{position:relative;width:100%;aspect-ratio:1;border-radius:14px;overflow:hidden;
  border:1px solid var(--line2);box-shadow:0 8px 20px rgba(0,0,0,.42);transition:transform .25s cubic-bezier(.2,.7,.2,1),box-shadow .25s,border-color .25s}
.rail-card .rc-img img{width:100%;height:100%;object-fit:cover}
.rail-card .rc-num{position:absolute;top:6px;left:6px;min-width:20px;height:20px;padding:0 5px;border-radius:7px;display:grid;place-items:center;
  font-size:11px;font-weight:800;color:#fff;background:rgba(8,6,16,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid var(--line2)}
.rail-card:hover .rc-img{transform:translateY(-5px);box-shadow:0 16px 32px rgba(0,0,0,.5),0 0 26px var(--glow-v);border-color:rgba(167,139,250,.6)}
.rail-card:first-child .rc-img{box-shadow:0 0 0 2px var(--cyan),0 0 22px var(--glow-c),0 8px 20px rgba(0,0,0,.42)}
.rail-card:first-child .rc-num{background:var(--grad);color:#06040d;border-color:transparent}
.rail-card .rt{font-size:12px;font-weight:600;margin-top:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rail-card .ra{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* ── Browse drawer ────────────────────────────────────────────────── */
.scrim{position:fixed;top:calc(var(--topbar-h) + env(safe-area-inset-top));left:0;right:0;bottom:0;z-index:36;display:none;background:rgba(5,4,12,.32);opacity:0;transition:opacity .25s}
.scrim.show{display:block;opacity:1}
.browse{position:fixed;top:0;right:0;height:100%;width:min(520px,92vw);z-index:40;
  padding-top:env(safe-area-inset-top);
  background:linear-gradient(180deg,rgba(16,12,32,.92),rgba(9,7,18,.95));
  backdrop-filter:blur(26px) saturate(150%);-webkit-backdrop-filter:blur(26px) saturate(150%);
  border-left:1px solid var(--line2);box-shadow:-20px 0 60px rgba(0,0,0,.5);
  transform:translateX(100%);transition:transform .38s cubic-bezier(.2,.7,.2,1);display:grid;grid-template-rows:auto 1fr auto}
.browse.open{transform:translateX(0)}
/* Admin panel opens full-width on desktop (a real full page, not a side drawer) */
/* Admin panel: a proper desktop dashboard — full-width drawer, left tab rail, centered
   readable content column (instead of the phone layout stretched across the screen). */
@media(min-width:1024px){
  .browse.admin-full{width:100%;max-width:100%}
  .browse.admin-full .browse-body{padding:30px 36px}
  .browse.admin-full .admin-page{
    display:grid; grid-template-columns:224px minmax(0,1fr); column-gap:34px;
    align-content:start; max-width:1160px; margin-inline:auto;
  }
  .browse.admin-full .admin-page > *{grid-column:1 / -1}          /* headers / scan bar span full width */
  .browse.admin-full .adtabs{
    grid-column:1; grid-row:2; align-self:start; position:sticky; top:6px;
    flex-direction:column; overflow:visible; gap:6px; margin:0; padding:0;
    background:rgba(255,255,255,.03); border:1px solid var(--line2); border-radius:16px; padding:8px;
  }
  .browse.admin-full .adtab{width:100%; justify-content:flex-start; padding:11px 14px}
  .browse.admin-full .adpanel.active{grid-column:2; grid-row:2; min-width:0}
  .browse.admin-full .adpanel .admin-sec:first-child{margin-top:0}
  /* keep form controls a comfortable width; lists/grids still use the whole column */
  .browse.admin-full .adpanel .field input,
  .browse.admin-full .adpanel .field select{max-width:580px}
  .browse.admin-full .adpanel > .btn{max-width:580px}
}
.head-btn{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;color:var(--txt2);background:var(--glass);border:1px solid var(--line);transition:.2s}
.head-btn:hover{background:var(--glass2);color:#fff}
body.select-mode #selBtn{background:var(--grad);color:#08060f;border-color:transparent}
/* selection visuals */
body.select-mode .play-fab,body.select-mode .ractions,body.select-mode .rdur{display:none}
/* card checkbox (uses FA solid \f00c — the regular font isn't bundled). On the CARD (not .thumb) so a
   circular artist thumb's overflow:hidden can't clip it. */
body.select-mode .card{position:relative}
body.select-mode .card:hover .thumb{transform:none}   /* no hover-lift in select mode (keeps the checkbox aligned) */
body.select-mode .card::after{content:"";position:absolute;top:8px;left:8px;width:24px;height:24px;border-radius:50%;border:2px solid rgba(255,255,255,.9);background:rgba(8,6,16,.6);z-index:3;display:grid;place-items:center;font:900 13px/1 'Font Awesome 6 Free';color:transparent;transition:.15s}
body.select-mode .card.artist::after{top:14px;left:14px}   /* nudge onto the round artist art so it reads as fully on the circle */
body.select-mode .card.selected::after{content:"\f00c";background:var(--grad);border-color:transparent;box-shadow:0 0 14px var(--glow-c);color:#08060f}
/* protected card (Liked Songs): show a lock instead of a selectable checkbox */
body.select-mode .card[data-locked]::after{content:"\f023";color:rgba(255,255,255,.92);border-color:transparent;font-size:11px}
body.select-mode .card[data-locked]{opacity:.65}
.card.selected .thumb{box-shadow:0 0 0 3px var(--cyan),0 10px 26px rgba(0,0,0,.5)}
.card.selected .ct{color:var(--cyan)}
/* row checkbox — sits on the right where the more/download buttons are hidden in select mode */
body.select-mode .row{position:relative;padding-right:52px}
body.select-mode .ractions,body.select-mode .qrow-actions,body.select-mode .ra-plays{display:none}
body.select-mode .row::after{content:"";position:absolute;right:16px;top:50%;transform:translateY(-50%);width:24px;height:24px;border-radius:50%;border:2px solid rgba(255,255,255,.9);background:rgba(8,6,16,.6);display:grid;place-items:center;font:900 13px/1 'Font Awesome 6 Free';color:transparent;z-index:2}
body.select-mode .row.selected::after{content:"\f00c";background:var(--grad);border-color:transparent;box-shadow:0 0 14px var(--glow-c);color:#08060f}
.row.selected{background:linear-gradient(90deg,rgba(34,211,238,.28),rgba(139,92,246,.16))!important;box-shadow:inset 3px 0 0 var(--cyan)}
/* bulk action bar */
/* Floating pill (styled like the mini player); sits at the mini's spot, or above it when it's showing */
.sel-bar{position:fixed;left:10px;right:10px;bottom:calc(var(--dock-h) + 10px);z-index:49;
  display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:10px 12px;border-radius:16px;
  background:rgba(14,11,28,.94);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);
  border:1px solid var(--line2);box-shadow:0 12px 30px rgba(0,0,0,.55)}
.sel-bar[hidden]{display:none}
body.mini-on .sel-bar{bottom:calc(var(--dock-h) + 84px)}   /* stack above the mini now-playing bar */
.sel-count{font-weight:700;font-size:14px;white-space:nowrap;padding-left:4px}
.sel-acts{display:flex;gap:7px;flex-wrap:wrap;justify-content:flex-end}
.sel-acts button{padding:8px 11px;border-radius:11px;background:var(--glass);border:1px solid var(--line);color:var(--txt);font-weight:600;font-size:12.5px;transition:.2s}
.sel-acts button:hover{background:var(--glass2)}
.sel-acts button[data-sa=queue]{background:var(--grad);color:#08060f;border-color:transparent}
.sel-acts button.danger{color:#fb7185;border-color:rgba(251,113,133,.4)}
/* keep the last list items above the floating select bar (its height varies with wrapped buttons →
   JS sets --selbar-h). 22px = 10 offset + 12 gap; 96px = 84 offset (above the mini bar) + 12 gap. */
body.select-mode .browse-body{padding-bottom:calc(22px + var(--selbar-h,72px))}
body.select-mode.mini-on .browse-body{padding-bottom:calc(96px + var(--selbar-h,72px))}
.prog-msg{margin-top:14px;font-weight:600;color:var(--txt2)}
.browse-head{display:flex;align-items:center;gap:12px;padding:18px 20px;border-bottom:1px solid var(--line);min-width:0}
.browse-title{font-size:20px;font-weight:700}
.back-btn,.close-btn{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;color:var(--txt2);background:var(--glass);border:1px solid var(--line);transition:.2s}
.back-btn:hover,.close-btn:hover{background:var(--glass2);color:#fff}
.close-btn{margin-left:auto}
.searchbar{flex:1;min-width:0;display:flex;align-items:center;gap:10px;padding:11px 14px;border-radius:14px;
  background:rgba(255,255,255,.06);border:1px solid var(--line)}
.searchbar i{color:var(--muted)}
.searchbar input{flex:1;min-width:0;background:none;border:none;outline:none;color:var(--txt);font-size:15px}
.searchbar input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}  /* hide tiny native ✕; use our own */
.searchbar:focus-within{border-color:rgba(34,211,238,.6);box-shadow:0 0 0 3px rgba(34,211,238,.16)}
.search-clear{flex:0 0 auto;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;font-size:15px;color:var(--txt2);background:rgba(255,255,255,.1);transition:.15s;margin:-4px -6px -4px 0}
.search-clear:hover{color:#fff;background:var(--glass2);transform:scale(1.06)}
.inline-search{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:14px;margin:4px 0 22px;background:rgba(255,255,255,.06);border:1px solid var(--line)}
.inline-search i{color:var(--muted);font-size:13px}
.inline-search input{flex:1;background:none;border:none;outline:none;color:var(--txt);font-size:14px}
.inline-search:focus-within{border-color:rgba(34,211,238,.6);box-shadow:0 0 0 3px rgba(34,211,238,.16)}
.browse-body{overflow-y:auto;padding:20px;scrollbar-width:thin}

/* sections / grids / cards */
.section{margin-bottom:30px}
.section h3,.section-title{font-size:16px;font-weight:700;margin-bottom:14px;display:flex;align-items:center;gap:10px}
.section-title::before{content:"";width:4px;height:18px;border-radius:3px;background:var(--grad);box-shadow:0 0 12px var(--glow-v)}
.grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}
.card{cursor:pointer;transition:.25s}
.card .thumb{position:relative;aspect-ratio:1;border-radius:16px;overflow:hidden;border:1px solid var(--line);
  box-shadow:0 8px 22px rgba(0,0,0,.4);background:var(--glass)}
.card.artist .thumb{border-radius:50%}
.card .thumb img{width:100%;height:100%;object-fit:cover}
/* playlist mosaic cover (up to 4 track covers) */
.pl-cover{position:absolute;inset:0}
.pl-cover.mosaic{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:1px}
.pl-cover .plm-cell{width:100%;height:100%;object-fit:cover;display:block}
.pl-cover .plm-cell.ph{display:grid;place-items:center;font-size:15px;color:rgba(255,255,255,.45);background:linear-gradient(135deg,rgba(139,92,246,.28),rgba(34,211,238,.2))}
.pl-cover.empty{display:grid;place-items:center;font-size:38px;color:rgba(255,255,255,.6);background:linear-gradient(135deg,rgba(139,92,246,.32),rgba(34,211,238,.22))}
.card .thumb .play-fab{position:absolute;right:10px;bottom:10px;width:44px;height:44px;border-radius:50%;display:grid;place-items:center;
  background:var(--grad);color:#0a0a14;font-size:15px;box-shadow:0 6px 18px rgba(0,0,0,.4),0 0 18px var(--glow-v);
  transform:translateY(8px) scale(.8);opacity:0;transition:.25s}
.card:hover .play-fab{transform:none;opacity:1}
.card:hover .thumb{transform:translateY(-5px);box-shadow:0 18px 38px rgba(0,0,0,.5),0 0 28px var(--glow-v)}
.card .ct{font-size:14px;font-weight:600;margin-top:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card.artist .ct{text-align:center}
.card .cs{font-size:12px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card.artist .cs{text-align:center}

/* track rows */
.rows{display:flex;flex-direction:column;gap:4px}
.row{display:flex;align-items:center;gap:14px;padding:10px 12px;border-radius:12px;cursor:pointer;transition:.18s}
.row:hover{background:var(--glass2)}
.row.playing{background:linear-gradient(90deg,rgba(34,211,238,.16),rgba(139,92,246,.10));box-shadow:inset 3px 0 0 var(--cyan)}
.row .rnum{width:24px;text-align:center;color:var(--muted);font-size:13px;font-variant-numeric:tabular-nums}
.row .rimg{width:46px;height:46px;border-radius:10px;object-fit:cover;border:1px solid var(--line);flex:0 0 auto}
.row .rinfo{min-width:0;flex:1}
.row .rtitle{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.row .rartist{font-size:12px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.row .rdur{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}
.ractions{display:flex;align-items:center;gap:2px;flex:0 0 auto}
.row .rbtn{width:32px;height:32px;border-radius:9px;display:grid;place-items:center;color:var(--txt2);opacity:0;transition:.2s}
.row:hover .rbtn{opacity:1}
.row .rbtn:hover{background:var(--glass2);color:#fff}
.row .rbtn[data-qn]:hover,.row .rbtn[data-qq]:hover{color:var(--cyan)}
@media (hover:none){.row .rbtn{opacity:1}}   /* touch devices: quick actions always visible */

/* artist/album header */
.detail-head{display:flex;gap:20px;align-items:flex-end;margin-bottom:24px}
.detail-head img{width:140px;height:140px;border-radius:20px;object-fit:cover;box-shadow:0 18px 44px rgba(0,0,0,.55),0 0 36px var(--glow-v)}
.detail-head.artist img{border-radius:50%}
.detail-head .dh-kicker{font-size:12px;letter-spacing:2px;color:var(--cyan);font-weight:700}
.detail-head h2{font-size:clamp(24px,3vw,38px);font-weight:800;line-height:1.05;margin:6px 0}
.detail-head .dh-sub{color:var(--txt2);font-size:14px}
.play-all{margin-bottom:18px;display:inline-flex;gap:10px;align-items:center;padding:12px 22px;border-radius:14px;
  background:var(--grad);color:#0a0a14;font-weight:700;box-shadow:0 0 26px var(--glow-v);transition:.2s}
.play-all:hover{transform:translateY(-2px);box-shadow:0 0 38px var(--glow-c)}

/* ── Queue panel ──────────────────────────────────────────────────── */
.queue-panel{position:fixed;top:0;right:0;height:100%;width:min(420px,92vw);z-index:45;
  padding-top:env(safe-area-inset-top);
  background:linear-gradient(180deg,rgba(16,12,32,.94),rgba(9,7,18,.96));backdrop-filter:blur(26px);
  border-left:1px solid var(--line2);box-shadow:-20px 0 60px rgba(0,0,0,.5);
  transform:translateX(100%);transition:transform .38s cubic-bezier(.2,.7,.2,1);display:grid;grid-template-rows:auto 1fr}
.queue-panel.open{transform:translateX(0)}
.qp-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:16px 18px;border-bottom:1px solid var(--line)}
.qp-head h3{font-size:18px;display:flex;align-items:baseline;gap:8px}
.qp-count{font-size:12px;color:var(--muted);font-weight:500}
.qp-actions{display:flex;align-items:center;gap:6px}
.qh-btn{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--txt2);background:var(--glass);border:1px solid var(--line);font-size:14px;transition:.2s}
.qh-btn:hover{background:var(--glass2);color:#fff}
#queueClear:hover{color:#fb7185;border-color:rgba(251,113,133,.4)}
.qp-list{overflow-y:auto;padding:12px}
.qrow-actions{display:flex;align-items:center;gap:4px;flex:0 0 auto;opacity:0;transition:opacity .15s}
.row:hover .qrow-actions{opacity:1}
.qbtn{width:36px;height:36px;border-radius:9px;display:grid;place-items:center;color:var(--txt2);font-size:14px;transition:.15s}
.qbtn:hover{background:var(--glass2);color:#fff}
.qbtn[data-qrem]{color:#fb7185}
.qbtn[data-qrem]:hover,.qbtn[data-qrem]:active{background:rgba(251,113,133,.18);color:#fb7185}
@media (hover:none){.qrow-actions{opacity:1}}

/* ── Dock + mini (mobile/car) ─────────────────────────────────────── */
.dock{display:none;position:fixed;bottom:0;left:0;right:0;z-index:50;height:var(--dock-h);
  grid-template-columns:repeat(5,1fr);align-items:center;
  background:rgba(8,6,16,.72);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border-top:1px solid var(--line2);
  padding-bottom:env(safe-area-inset-bottom)}
.dock-btn{display:grid;justify-items:center;gap:4px;color:var(--muted);font-size:10px;font-weight:600}
.dock-btn i{font-size:18px}
.dock-btn.active{color:var(--cyan)}
/* dock "More" overflow sheet (mobile/tablet only) */
.more-backdrop{position:fixed;inset:0;z-index:48;background:rgba(0,0,0,.4)}
.more-sheet{position:fixed;left:0;right:0;bottom:var(--dock-h);z-index:49;
  display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:12px 12px 16px;
  background:rgba(12,9,24,.97);-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);
  border-top:1px solid var(--line2);box-shadow:0 -14px 34px rgba(0,0,0,.5);animation:moreUp .18s cubic-bezier(.2,.7,.2,1)}
@keyframes moreUp{from{transform:translateY(14px);opacity:0}to{transform:translateY(0);opacity:1}}
.more-item{display:grid;justify-items:center;gap:7px;padding:14px 6px;border-radius:14px;
  color:var(--txt2);font-size:12px;font-weight:600;background:var(--glass);border:1px solid var(--line);transition:.18s}
.more-item i{font-size:21px}
.more-item:hover,.more-item:active{color:var(--txt);background:var(--glass2);border-color:var(--line2)}
.mini{display:none;position:fixed;left:10px;width:calc(100% - 20px);bottom:calc(var(--dock-h) + 10px);z-index:48;align-items:center;gap:11px;padding:8px 8px 8px 8px;border-radius:16px;overflow:hidden;cursor:pointer;transition:width .26s cubic-bezier(.4,0,.2,1),transform .2s ease,opacity .2s ease;
  background:rgba(14,11,28,.92);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--line2);box-shadow:0 12px 30px rgba(0,0,0,.5)}
.mini-art{width:46px;height:46px;border-radius:10px;object-fit:cover;flex:none}
.mini-meta{flex:1;min-width:0}
.mini-title{font-size:13.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mini-artist{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}
/* When the mini now-playing bar is showing, pad the scrollable content so the last rows/cards aren't
   hidden under it (the bar is ~64px tall, sitting 10px above the dock). */
body.mini-on .browse-body{padding-bottom:88px}
body.mini-on .qp-list{padding-bottom:88px}
.mini-btn{width:40px;height:40px;flex:none;display:grid;place-items:center;border-radius:50%;color:var(--txt2);font-size:17px;background:transparent;border:none;transition:transform .12s}
.mini-btn:active{transform:scale(.88)}
#miniPlay{color:#0a0a14;background:var(--grad);box-shadow:0 4px 14px var(--glow-v);font-size:15px}
.mini-prog{position:absolute;left:0;right:0;top:0;height:2.5px;background:rgba(255,255,255,.09)}
.mini-prog-fill{height:100%;width:0;background:var(--cyan);transition:width .25s linear}

/* ── Modals + toasts ──────────────────────────────────────────────── */
.modal-root{position:fixed;inset:0;z-index:66;display:none;place-items:center;padding:20px;
  background:rgba(4,3,12,.6);backdrop-filter:blur(8px)}   /* above the OLED overlay (65) so the add-to-playlist modal is usable in lockscreen mode */
.modal-root.open{display:grid}
.modal{position:relative;width:min(420px,100%);max-height:88vh;overflow-y:auto;background:linear-gradient(180deg,rgba(24,19,44,.96),rgba(14,11,28,.96));
  border:1px solid var(--line2);border-radius:22px;box-shadow:0 30px 80px rgba(0,0,0,.6),0 0 50px rgba(139,92,246,.2);padding:26px}
.modal-x{position:absolute;top:14px;right:14px;width:36px;height:36px;border-radius:10px;display:grid;place-items:center;
  color:var(--txt2);background:var(--glass);border:1px solid var(--line);font-size:22px;line-height:1;transition:.2s}
.modal-x:hover{background:var(--glass2);color:#fff}
.modal h3{font-size:22px;margin-bottom:6px}
.modal p.sub{color:var(--txt2);font-size:14px;margin-bottom:18px}
.field{margin-bottom:14px}
.field label{display:block;font-size:13px;color:var(--txt2);margin-bottom:6px}
.field input{width:100%;padding:13px 15px;border-radius:13px;background:rgba(255,255,255,.06);border:1px solid var(--line);color:var(--txt);font-size:15px;outline:none}
.field input:focus{border-color:rgba(34,211,238,.6);box-shadow:0 0 0 3px rgba(34,211,238,.16)}
.btn{width:100%;padding:14px;border-radius:14px;font-weight:700;font-size:15px;transition:.2s}
.btn.primary{background:var(--grad);color:#0a0a14;box-shadow:0 0 24px var(--glow-v)}
.btn.primary:hover{transform:translateY(-2px);box-shadow:0 0 34px var(--glow-c)}
.btn.ghost{background:var(--glass);border:1px solid var(--line);color:var(--txt)}
.btn.danger{background:rgba(251,113,133,.1);border:1px solid rgba(251,113,133,.4);color:#fb7185}
.btn.danger:hover{background:rgba(251,113,133,.18)}
.admin-hint{font-size:11.5px;color:var(--muted);line-height:1.45;margin:7px 4px 2px}
.ad-fb{font-size:12px;color:var(--cyan);line-height:1.4;margin:5px 4px 4px}
.ad-fb:empty{display:none}
.scan-prog{background:var(--glass);border:1px solid var(--line2);border-radius:14px;padding:13px 14px;margin:2px 0 16px}
.scan-prog-top{display:flex;justify-content:space-between;align-items:center;font-size:13px;font-weight:700;color:var(--txt);margin-bottom:9px}
.scan-prog-top span:last-child{color:var(--cyan);font-variant-numeric:tabular-nums;font-size:14px}
.scan-prog-track{height:8px;border-radius:6px;background:rgba(255,255,255,.1);overflow:hidden}
.scan-prog-fill{height:100%;border-radius:6px;background:var(--grad);box-shadow:0 0 12px var(--glow-v);width:0;transition:width .45s ease}
.scan-prog-fill.indet{width:30%!important;transition:none;animation:scanIndet 1.15s ease-in-out infinite}
@keyframes scanIndet{0%{margin-left:-32%}100%{margin-left:100%}}
.scan-prog-sub{font-size:11.5px;color:var(--muted);margin-top:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.modal .switch{text-align:center;margin-top:16px;font-size:14px;color:var(--txt2)}
.modal .switch button{color:var(--cyan);font-weight:700}
.modal .err{color:#fb7185;font-size:13px;margin-bottom:10px;min-height:18px}
.toast-root{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);z-index:70;display:flex;flex-direction:column;gap:10px;align-items:center}
.toast{padding:12px 20px;border-radius:14px;background:rgba(20,16,38,.96);border:1px solid var(--line2);
  box-shadow:0 14px 36px rgba(0,0,0,.5);font-size:14px;font-weight:600;animation:rise .3s ease}
.toast.ok{box-shadow:0 0 26px var(--glow-c),0 14px 36px rgba(0,0,0,.5)}
@keyframes rise{from{opacity:0;transform:translateY(12px)}}

/* ── Browse handle (reopen affordance) ────────────────────────────── */
.browse-handle{position:fixed;right:0;top:50%;transform:translateY(-50%);z-index:38;
  display:flex;flex-direction:column;align-items:center;gap:10px;padding:18px 9px;
  background:var(--grad);color:#08060f;font-weight:800;font-size:11px;letter-spacing:2px;
  border-radius:16px 0 0 16px;box-shadow:-6px 0 26px var(--glow-v);
  transition:transform .35s cubic-bezier(.2,.7,.2,1),opacity .25s}
.browse-handle i{font-size:13px}
.browse-handle span{writing-mode:vertical-rl;text-orientation:mixed}
.browse-handle:hover{padding-right:13px}
body.drawer-open .browse-handle,body.queue-open .browse-handle{transform:translate(120%,-50%);opacity:0;pointer-events:none}

/* ── Popover (quality) ────────────────────────────────────────────── */
.popover{position:fixed;top:calc(var(--topbar-h) + env(safe-area-inset-top) + 8px);right:14px;z-index:56;width:236px;
  background:rgba(18,14,36,.98);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);
  border:1px solid var(--line2);border-radius:16px;box-shadow:0 24px 60px rgba(0,0,0,.6),0 0 40px rgba(139,92,246,.18);
  padding:10px;animation:rise .18s ease}
.pop-title{font-size:11px;color:var(--muted);font-weight:700;letter-spacing:1.5px;padding:6px 10px 8px}
.pop-opt{display:flex;justify-content:space-between;align-items:center;width:100%;padding:11px 12px;border-radius:11px;color:var(--txt);font-size:14px;transition:.15s}
.pop-opt span{display:flex;gap:10px;align-items:center;font-weight:600}
.pop-opt span i{width:18px;text-align:center;color:var(--txt2)}
.pop-opt small{color:var(--muted);font-size:11px}
.pop-opt:hover{background:var(--glass2)}
.pop-opt.active{background:linear-gradient(90deg,rgba(139,92,246,.30),rgba(34,211,238,.12))}
.pop-opt.active small{color:var(--cyan)}
.pop-opt.active span i{color:var(--cyan)}
.pop-note{font-size:11px;color:var(--cyan);padding:8px 10px 4px;line-height:1.4}

/* ── Action sheet / playlist picker rows ──────────────────────────── */
.sheet{display:flex;flex-direction:column;gap:4px;margin-top:6px;max-height:340px;overflow-y:auto}
.sheet-btn{display:flex;justify-content:space-between;align-items:center;width:100%;padding:13px 14px;border-radius:12px;
  color:var(--txt);font-size:15px;font-weight:600;transition:.15s;text-align:left}
.sheet-btn span{display:flex;gap:12px;align-items:center}
.sheet-btn span i{width:18px;text-align:center;color:var(--txt2)}
.sheet-btn small{color:var(--muted);font-size:12px}
.sheet-btn:hover{background:var(--glass2)}
.sheet-btn.danger{color:#fb7185}
.sheet-btn.danger span i{color:#fb7185}
.sheet-btn.liked span i{color:#ff5d8f}
/* Playlist-membership toggle rows (addToPlaylistFlow): check shows when the track is a member */
.sheet-btn.plrow .chk{opacity:0;color:var(--cyan);transition:opacity .15s}
.sheet-btn.plrow.on .chk{opacity:1}
.sheet-btn.plrow.on span i{color:var(--cyan)}
/* Now-playing "add to playlist" button when the track is already saved: cyan (matching the other active
   icons); the distinct fa-list-check glyph — set in JS — is what sets it apart from the download button's
   fa-circle-check "done" state, so they no longer read as the same icon. */
#playerPl.saved{background:var(--grad);color:#0a0a14;border-color:transparent}
#playerPl.saved i{filter:none}

/* Playlist sharing-state panel (private vs unlisted-link) + action chips */
.share-state{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 14px;
  margin:14px 0 4px;padding:11px 14px;border-radius:14px;border:1px solid var(--line2);background:rgba(255,255,255,.03)}
.share-state.on{border-color:rgba(34,211,238,.35);background:rgba(34,211,238,.06)}
.share-state .ss-label{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--txt2)}
.share-state.on .ss-label{color:var(--cyan)}
.share-state .ss-btns{display:flex;flex-wrap:wrap;gap:8px}
.chip{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;border-radius:999px;font-size:12.5px;font-weight:600;
  cursor:pointer;color:var(--txt);border:1px solid var(--line2);background:rgba(255,255,255,.05);
  transition:background .15s,transform .1s,color .15s,border-color .15s}
.chip:hover{background:rgba(255,255,255,.1);transform:translateY(-1px)}
.chip.primary{background:var(--grad);color:#0a0a14;border-color:transparent}
.chip.danger:hover{color:#ff6b8a;border-color:rgba(255,107,138,.4)}
.chip i{font-size:12px}

/* Playlist header share-status badge + the link row inside the share-manager modal */
.sh-badge{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:999px;font-size:11.5px;font-weight:700;
  cursor:pointer;vertical-align:middle;border:1px solid var(--line2);background:rgba(255,255,255,.06);color:var(--txt2);
  transition:background .15s,color .15s,border-color .15s}
.sh-badge:hover{background:rgba(255,255,255,.12)}
.sh-badge.on{color:var(--cyan);border-color:rgba(34,211,238,.4);background:rgba(34,211,238,.1)}
.sh-badge i{font-size:10px}
.share-link{display:flex;gap:8px;align-items:center;margin:12px 0}
.share-link input{flex:1;min-width:0;padding:9px 11px;border-radius:10px;border:1px solid var(--line2);
  background:rgba(0,0,0,.25);color:var(--txt);font-size:12.5px}
.share-link .chip{flex:0 0 auto;padding:9px 12px}

/* Visibility picker inside the playlist share manager */
.vis-list{display:flex;flex-direction:column;gap:8px;margin:4px 0 14px}
.vis-opt{display:flex;align-items:center;gap:12px;width:100%;text-align:left;padding:11px 13px;border-radius:13px;
  border:1px solid var(--line2);background:rgba(255,255,255,.04);color:var(--txt);cursor:pointer;transition:border-color .15s,background .15s}
.vis-opt:hover{background:rgba(255,255,255,.08)}
.vis-opt.on{border-color:rgba(34,211,238,.5);background:rgba(34,211,238,.08)}
.vis-opt .vo-ic{flex:0 0 auto;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;
  background:rgba(255,255,255,.07);font-size:13px;color:var(--txt2)}
.vis-opt.on .vo-ic{background:rgba(34,211,238,.16);color:var(--cyan)}
.vis-opt .vo-tx{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.vis-opt .vo-tx b{font-size:13.5px;font-weight:700}
.vis-opt .vo-tx small{font-size:11.5px;color:var(--txt2)}
.vis-opt .vo-ck{opacity:0;color:var(--cyan);font-size:13px}
.vis-opt.on .vo-ck{opacity:1}

/* Admin → Playlists (official Nava playlist curation) */
.ad-pl-list{display:flex;flex-direction:column;gap:8px}
.ad-pl{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:11px 13px;border-radius:13px;
  border:1px solid var(--line2);background:rgba(255,255,255,.03)}
.ad-pl-tx{flex:1;min-width:140px;display:flex;flex-direction:column;gap:2px}
.ad-pl-tx b{font-size:13.5px}
.ad-pl-tx small{font-size:11.5px;color:var(--txt2)}
.ad-pl-ac{display:flex;align-items:center;gap:8px;flex-wrap:wrap}

/* Music requests — no-results prompt, request list, status badges */
.nr-req{margin-top:18px}
.req-list{display:flex;flex-direction:column;gap:8px;max-height:52vh;overflow:auto}
.req-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 13px;border-radius:12px;
  border:1px solid var(--line2);background:rgba(255,255,255,.03)}
.req-tx{min-width:0;font-size:13.5px;overflow:hidden;text-overflow:ellipsis}
.req-tx b{font-weight:600}
.req-link{color:var(--cyan);margin-left:6px;font-size:12px}
.req-meta{display:flex;align-items:center;gap:8px;flex:0 0 auto}
.req-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;font-size:11.5px;font-weight:700;
  color:var(--txt2);border:1px solid var(--line2);background:rgba(255,255,255,.05)}
.req-badge.ok{color:#39d98a;border-color:rgba(57,217,138,.4);background:rgba(57,217,138,.1)}
.req-badge.no{color:#ff6b8a;border-color:rgba(255,107,138,.4);background:rgba(255,107,138,.1)}
.req-del{background:none;border:0;color:var(--txt2);cursor:pointer;font-size:14px;padding:4px}
.req-del:hover{color:#ff6b8a}
/* admin requests tab */
.ad-req-list{display:flex;flex-direction:column;gap:8px}
.ad-req{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:11px 13px;border-radius:13px;
  border:1px solid var(--line2);background:rgba(255,255,255,.03)}
.ad-req .arq-tx{flex:1;min-width:160px;display:flex;flex-direction:column;gap:2px}
.ad-req .arq-tx b{font-size:13.5px}
.ad-req .arq-tx small{font-size:11.5px;color:var(--txt2)}
.ad-req .arq-ac{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.tab-badge{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;
  background:var(--grad);color:#0a0a14;font-size:10.5px;font-weight:800;margin-left:4px}

/* Admin → Import zip progress */
.zip-prog{margin-top:16px;padding:14px;border-radius:14px;border:1px solid var(--line2);background:rgba(255,255,255,.03)}
.zp-phase{font-size:13px;font-weight:700;color:var(--txt);margin-bottom:8px}
.zp-track{height:8px;border-radius:99px;background:rgba(255,255,255,.08);overflow:hidden}
.zp-fill{height:100%;background:var(--grad);border-radius:99px;width:0;transition:width .4s}
.zp-fill.indet{width:35%!important;animation:zpIndet 1.1s ease-in-out infinite}
@keyframes zpIndet{0%{margin-left:-35%}100%{margin-left:100%}}
.zp-msg{font-size:12px;color:var(--txt2);margin-top:8px}

/* Track-row YouTube play count */
.rplays{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--txt2);flex:0 0 auto;white-space:nowrap;margin-right:2px}
.rplays i{font-size:9px;opacity:.7}
.now-plays{margin-top:8px;display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--txt2)}
.now-plays i{font-size:9px;opacity:.7}
.qplays{flex:0 0 auto;font-size:11.5px;color:var(--txt2);white-space:nowrap;font-variant-numeric:tabular-nums;margin-left:2px}
.rp-ic{font-size:9px;opacity:.7}
.rartist.has-plays{display:flex;align-items:center;min-width:0}
.rartist.has-plays .ra-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rartist.has-plays .ra-plays{flex:0 0 auto;white-space:nowrap;padding-left:8px}
.ra-name-in{display:inline-block;white-space:nowrap}
.ra-name.marquee{text-overflow:clip}
.ra-name.marquee .ra-name-in{animation:raMarq var(--marq-dur,8s) ease-in-out infinite alternate}
@keyframes raMarq{0%,12%{transform:translateX(0)}88%,100%{transform:translateX(var(--marq-shift,0))}}
@media (prefers-reduced-motion:reduce){.ra-name.marquee .ra-name-in{animation:none}}
.rinfo{min-width:0}
.srow .rartist{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Queue rows: tighter gaps + smaller controls so title/artist have room */
#queueList .row{gap:10px}
#queueList .rimg{width:44px;height:44px}
#queueList .qbtn{width:32px;height:32px;font-size:13px}
#queueList .qrow-actions{gap:2px}
.qgrip{touch-action:none;cursor:grab}
.qgrip:active{cursor:grabbing}
.row.qdrag{transition:none;position:relative;z-index:6;opacity:.96;background:var(--glass2);box-shadow:0 10px 26px rgba(0,0,0,.45)}
body.q-dragging{user-select:none;-webkit-user-select:none}
@media(max-width:560px){.rplays{font-size:11px}}
/* Admin YouTube-plays picker */
.yt-scope{display:flex;gap:8px;flex-wrap:wrap}
.yt-refresh{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:13px;color:var(--txt2);cursor:pointer;user-select:none}
.yt-refresh input{width:16px;height:16px;accent-color:var(--cyan)}
.yt-results{margin-top:10px}
.yt-list{display:flex;flex-direction:column;gap:6px;max-height:44vh;overflow:auto}
.yt-item{display:flex;flex-direction:column;gap:2px;align-items:flex-start;text-align:left;width:100%;
  padding:10px 12px;border-radius:11px;border:1px solid var(--line2);background:rgba(255,255,255,.03);cursor:pointer}
.yt-item:hover{background:rgba(34,211,238,.08);border-color:rgba(34,211,238,.35)}
.yti-n{font-size:13.5px;font-weight:600;color:var(--txt)}
.yti-s{font-size:11.5px;color:var(--txt2)}


/* Import-zip history list */
.zip-hist{margin-top:14px}
.zh-head{display:flex;align-items:center;justify-content:space-between;font-size:11px;letter-spacing:1.2px;
  text-transform:uppercase;color:var(--muted);font-weight:700;margin:0 2px 8px}
.zh-head .text-btn{font-size:11px;text-transform:none;letter-spacing:0}
.zh-list{display:flex;flex-direction:column;gap:8px}
.zh-row{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:12px;
  border:1px solid var(--line2);background:rgba(255,255,255,.03)}
.zh-ic{font-size:16px;flex:0 0 auto}
.zh-ic.ok{color:#39d98a}.zh-ic.no{color:#ff6b8a}
.zh-tx{flex:1;min-width:0}
.zh-msg{font-size:13px;color:var(--txt);overflow-wrap:anywhere}
.zh-meta{font-size:11px;color:var(--txt2);margin-top:2px}
.zh-x{flex:0 0 auto;background:none;border:0;color:var(--txt2);cursor:pointer;font-size:15px;padding:4px 6px;border-radius:8px}
.zh-x:hover{color:#ff6b8a;background:rgba(255,107,138,.1)}



/* subscribed state for the playlist Subscribe button */
#plSub.on,#followBtn.on{color:var(--cyan);background:rgba(34,211,238,.12);border-color:rgba(34,211,238,.4)}
.vis-opt.collab{margin-top:2px}
.sub-count{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
  margin:12px 0 4px;padding:10px 13px;border-radius:12px;border:1px solid var(--line2);background:rgba(255,255,255,.04)}
.sub-count span{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--txt2)}
.vis-opt.collab .vo-ck{opacity:0}
.vis-opt.collab.on .vo-ck{opacity:1}





/* ── Detail action row (play / rename / delete) ───────────────────── */
.detail-actions{display:flex;align-items:center;gap:10px;margin-bottom:18px;flex-wrap:wrap}
.detail-actions .play-all{margin-bottom:0}
.icon-action{width:46px;height:46px;border-radius:13px;display:grid;place-items:center;font-size:16px;
  color:var(--txt2);background:var(--glass);border:1px solid var(--line);transition:.2s}
.icon-action:hover{background:var(--glass2);color:#fff;border-color:var(--line2)}
.icon-action.danger:hover{color:#fb7185;border-color:rgba(251,113,133,.5)}
.lib-quick{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px}
.play-all.alt{background:var(--glass);color:var(--txt);border:1px solid var(--line);box-shadow:none}
.play-all.alt:hover{background:var(--glass2);box-shadow:none;transform:translateY(-2px)}
/* per-row download button: idle ↓ · progress ring · done ✓ */
.dl-btn{flex:0 0 auto;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-size:15px;color:var(--muted);background:transparent;transition:color .2s,transform .15s}
.dl-btn:hover{color:var(--txt);transform:scale(1.12)}
/* download control inside the player (id so applyDlBtn's className rewrite keeps the sizing) */
#playerDl{width:42px;height:42px;font-size:18px;background:var(--glass);border:1px solid var(--line);color:var(--txt2)}
#playerDl:hover{transform:none;color:var(--txt);border-color:var(--line2);background:var(--glass2)}
#playerDl.done{background:var(--grad);color:#0a0a14;border-color:transparent}
#playerDl.done i{filter:none}
#playerDl .dl-pct{width:24px;height:24px;font-size:10px}
.dl-btn.done{color:var(--cyan)}
.dl-btn.done i{filter:drop-shadow(0 0 6px var(--glow-c))}
.dl-btn.loading{color:#fff}
.dl-btn .dl-pct{width:22px;height:22px;border-radius:50%;background:var(--bg2);display:grid;place-items:center;font-size:9px;font-weight:800;color:#fff}
.icon-action.busy .dl-badge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--cyan);color:#06040d;font-size:10px;font-weight:800;display:grid;place-items:center}
.icon-action{position:relative}

/* ── Admin stats grid ─────────────────────────────────────────────── */
.admin-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin:6px 0 18px}
.admin-cell{background:var(--glass);border:1px solid var(--line);border-radius:14px;padding:14px;text-align:center}
.admin-cell b{display:block;font-size:22px;font-weight:800;background:var(--grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.admin-cell span{font-size:11px;color:var(--muted);text-transform:capitalize}
/* Storage: media-drive usage bar */
.disk-bar-wrap{margin:4px 0 16px}
.disk-bar{height:12px;border-radius:7px;background:rgba(255,255,255,.1);overflow:hidden}
.disk-bar-fill{height:100%;border-radius:7px;background:var(--grad);box-shadow:0 0 12px var(--glow-v)}
.disk-bar-legend{display:flex;justify-content:space-between;margin-top:8px;font-size:12px;color:var(--txt2)}
.disk-bar-legend b{color:var(--txt);font-weight:700}
.disk-free b{color:var(--cyan)}
.admin-sec{font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted);font-weight:700;margin:18px 0 8px}
.admin-btn-row{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}
.admin-btn-row .btn{margin-top:0;font-size:13px;padding:12px}

/* update-available banner */
.update-banner{position:fixed;top:calc(var(--topbar-h) + env(safe-area-inset-top) + 12px);left:50%;transform:translateX(-50%);z-index:80;display:flex;align-items:center;gap:14px;
  padding:11px 16px;border-radius:14px;background:var(--grad);color:#08060f;font-weight:700;font-size:14px;box-shadow:0 12px 36px rgba(0,0,0,.5),0 0 30px var(--glow-v);animation:rise .3s ease}
.update-banner button{background:rgba(8,6,16,.22);border:1px solid rgba(8,6,16,.3);color:#08060f;padding:6px 14px;border-radius:10px;font-weight:800;cursor:pointer}
.update-banner button:hover{background:rgba(8,6,16,.4)}

/* in-player ±15s seek */
.seek-group{display:flex;gap:4px}

/* ── Dev-mode toggle row ──────────────────────────────────────────── */
.dev-row{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:14px;padding:14px;
  border:1px solid var(--line);border-radius:14px;background:var(--glass)}
.dev-label{display:flex;flex-direction:column;gap:3px;font-size:14px;font-weight:600;color:var(--txt)}
.dev-label i{margin-right:6px;color:var(--cyan)}
.dev-label small{font-weight:400;color:var(--muted);font-size:11px}
.dev-sw{flex:0 0 auto;width:48px;height:28px;border-radius:999px;background:rgba(255,255,255,.12);position:relative;transition:.25s}
.dev-sw::after{content:"";position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:50%;background:#fff;transition:.25s}
.dev-sw.on{background:var(--grad);box-shadow:0 0 18px var(--glow-v)}
.dev-sw.on::after{transform:translateX(20px)}

.spinner{width:34px;height:34px;border-radius:50%;border:3px solid var(--line2);border-top-color:var(--cyan);animation:spin .8s linear infinite;margin:40px auto}
.empty-note{color:var(--muted);text-align:center;padding:40px;font-size:14px}
.offline-note{display:flex;flex-direction:column;align-items:center;gap:6px;padding:54px 22px}
.offline-note i{font-size:30px;color:rgba(255,255,255,.45);margin-bottom:8px}
.offline-note .ttl{font-size:18px;font-weight:800;color:#fff;letter-spacing:.2px}
.offline-note .sub{font-size:13.5px;color:var(--muted);max-width:300px;line-height:1.5}
.offline-note .play-all{margin-top:14px}

/* ════════ RESPONSIVE ════════════════════════════════════════════── */

/* The browse drawer / queue panel OVERLAY the player (they float on top); the
   player keeps its size and position. */

/* tablet & below: stack hero, show dock, browse fuller */
@media (max-width:1023px){
  /* dock height includes the home-indicator inset so its buttons aren't squished on iPhone */
  :root{--dock-h:calc(68px + env(safe-area-inset-bottom))}
  .top-nav{display:none}
  .dock{display:grid}
  .stage{padding:16px 16px calc(var(--dock-h) + 16px);overflow-y:auto;align-items:flex-start}
  /* vertically centre the now-playing content; margin-block:auto centres when it fits and collapses to
     0 (scrolls from the top) when it's taller than the screen — no clipping */
  .hero{justify-content:flex-start;margin-block:auto}
  .hero-now{grid-template-columns:1fr;justify-items:center;text-align:center;gap:18px}
  .now-meta{justify-self:stretch}   /* full-width meta so the scrubber/transport don't resize with the title length */
  .art-wrap{width:min(68vw,40vh,330px)}
  /* Stacked layout: keep the ART itself centred on screen (art-stage shrinks to the art because the
     rail is taken out of flow), and float the action rail in the empty space to the art's RIGHT. */
  .art-stage{display:block}
  .art-actions{position:absolute;top:0;bottom:0;left:100%;margin-left:12px;justify-content:center;gap:12px}
  .now-artist,.now-album{text-align:center}
  /* let long titles wrap to full multi-line (no truncation/clip), without affecting other styles */
  .now-title{display:block;overflow:visible;-webkit-line-clamp:unset;white-space:normal;overflow-wrap:anywhere}
  .scrubber{margin:22px 0 16px}
  .transport{justify-content:center}
  .sub-controls{justify-content:center}
  .browse{width:100vw;border-left:none;padding-bottom:var(--dock-h)}   /* keep sel-bar + list above the dock */
  .queue-panel{padding-bottom:var(--dock-h)}
  .mini.show{display:flex}
  .browse-handle{display:none}   /* dock provides navigation at this size */
}

/* mobile */
@media (max-width:560px){
  .topbar{padding:0 10px;gap:6px}
  .brand-name{display:none}
  /* 5 dock items — comfortable tap targets; label ellipsis as a safety net */
  .dock-btn{font-size:10.5px;gap:4px;padding:0 2px;min-width:0}
  .dock-btn i{font-size:19px}
  .dock-btn span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .auth-label,#qualityLabel,.offline-pill span{display:none}
  #fsBtn{display:none}                 /* fullscreen rarely used on a phone */
  .ghost-btn{padding:9px 11px}
  .browse-handle{padding:14px 7px;font-size:10px}
  .browse-head{padding:14px 12px;gap:8px}
  .browse-head .head-btn,.browse-head .back-btn,.browse-head .close-btn{flex:0 0 auto}
  .qp-head{padding:14px 12px}
  .qp-actions{gap:4px}
  .qh-btn{width:32px;height:32px}
  .qp-head h3{min-width:0;overflow:hidden;white-space:nowrap}
  .t-btn{width:46px;height:46px}
  .t-btn.play{width:64px;height:64px;font-size:22px}
  .volume{display:none}
  .sub-controls{gap:12px;justify-content:center}
  .grid{grid-template-columns:repeat(auto-fill,minmax(110px,1fr))}
  .upnext-rail{display:none}      /* phones use the dock's Queue button instead */
  .art-wrap{max-width:min(300px,64vw)}
  .now-title{font-size:clamp(24px,7vw,34px)}
  /* narrower right gap on phones → smaller rail so it fits beside the centred art */
  .art-actions{margin-left:7px;gap:10px}
  .art-actions .act-btn,.art-actions .dl-btn{width:42px;height:42px;font-size:16px}
}

/* short landscape (phones in car cradle) */
@media (max-height:560px) and (orientation:landscape){
  .hero-now{grid-template-columns:auto minmax(0,1fr);text-align:left;justify-items:start}   /* auto so the art + action rail both fit */
  .now-artist,.now-album,.now-title{text-align:left}
  .art-wrap{max-width:230px}
  .art-stage{display:flex;align-items:center}   /* 2-col car layout: keep the rail in-flow beside the art */
  .art-actions{position:static;margin-left:0;gap:10px}
  .upnext-rail{display:none}
}


/* ░░ Curated home cards ░░ */
.home-cards{display:grid;gap:16px;grid-template-columns:var(--hc-cols-d,repeat(auto-fill,minmax(160px,1fr)));margin-top:6px}
.hcard{position:relative;display:flex;flex-direction:column;text-align:left;border-radius:18px;overflow:hidden;border:1px solid var(--line);background:var(--glass);cursor:pointer;aspect-ratio:1/1;transition:transform .22s cubic-bezier(.2,.7,.2,1),box-shadow .22s,border-color .22s}
.hcard:hover{transform:translateY(-3px);border-color:var(--line2);box-shadow:0 16px 36px rgba(0,0,0,.5),0 0 26px var(--glow-v)}
.hcard .hc-img,.hcard .hc-grad{position:absolute;inset:0}
.hcard .hc-img img{width:100%;height:100%;object-fit:cover;display:block}
.hcard .hc-img .hc-fall{display:none}
.hcard .hc-img.noimg{display:grid;place-items:center;background:linear-gradient(135deg,rgba(139,92,246,.42),rgba(34,211,238,.3))}
.hcard .hc-img.noimg .hc-fall{display:block;font-size:34px;color:rgba(255,255,255,.85)}
.hcard.text .hc-grad{display:grid;place-items:center;background:linear-gradient(135deg,var(--hc-accent,rgba(139,92,246,.52)),rgba(34,211,238,.32))}
.hcard.text .hc-grad i{font-size:38px;color:rgba(255,255,255,.92)}
.hcard .hc-meta{position:relative;margin-top:auto;z-index:2;padding:12px 13px;background:linear-gradient(transparent,rgba(6,5,14,.55) 38%,rgba(6,5,14,.92))}
.hcard .hc-title{font-weight:800;font-size:15px;color:#fff;line-height:1.2;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.hcard .hc-sub{font-size:12px;color:rgba(255,255,255,.72);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hcard .hc-kind{position:absolute;top:9px;right:9px;z-index:3;width:28px;height:28px;border-radius:9px;display:grid;place-items:center;font-size:12px;color:#fff;background:rgba(8,6,16,.5);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid var(--line2)}
.home-shortcuts{margin-top:18px;max-width:280px}
.detail-head.genre{align-items:center}
.detail-head.genre .dh-genreart{width:120px;height:120px;border-radius:20px;display:grid;place-items:center;font-size:48px;color:#fff;background:linear-gradient(135deg,rgba(139,92,246,.5),rgba(34,211,238,.32));box-shadow:0 18px 44px rgba(0,0,0,.55)}

/* ░░ Genres page ░░ */
.genre-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));margin-top:4px}
.gcard{position:relative;display:flex;flex-direction:column;justify-content:flex-end;gap:2px;text-align:left;height:108px;padding:14px;border-radius:16px;border:1px solid rgba(255,255,255,.12);overflow:hidden;cursor:pointer;
  background:linear-gradient(135deg,hsl(var(--gh,260),68%,44%),hsl(calc(var(--gh,260) + 38),72%,28%));
  background-size:cover;background-position:center;
  transition:transform .2s cubic-bezier(.2,.7,.2,1),box-shadow .2s}
.gcard:hover{transform:translateY(-3px);box-shadow:0 16px 32px rgba(0,0,0,.5)}
.gcard.hasbg::before{content:"";position:absolute;inset:0;z-index:1;background:linear-gradient(160deg,hsla(var(--gh,260),65%,52%,.30),rgba(8,6,16,.5) 42%,rgba(6,5,14,.9))}
.gcard.hasbg .gc-name,.gcard.hasbg .gc-count{position:relative;z-index:2}
.gcard.hasbg .gc-ic{z-index:2;opacity:.4}
.gcard .gc-ic{position:absolute;top:11px;right:13px;font-size:30px;color:rgba(255,255,255,.26)}
.gcard .gc-name{font-weight:800;font-size:16px;color:#fff;line-height:1.15;z-index:1;max-width:88%}
.gcard .gc-count{font-size:12px;color:rgba(255,255,255,.82);z-index:1}

/* ░░ Admin: full page, tabs ░░ */
.admin-page{padding-bottom:24px}
.adtabs{display:flex;gap:8px;overflow-x:auto;margin:4px 0 18px;padding-bottom:4px;-webkit-overflow-scrolling:touch}
.adtabs::-webkit-scrollbar{height:0}
.adtab{flex:0 0 auto;padding:9px 14px;border-radius:11px;font-size:13px;font-weight:700;color:var(--txt2);background:var(--glass);border:1px solid var(--line);white-space:nowrap;transition:.2s}
.adtab i{margin-right:6px;font-size:12px;opacity:.85}
.adtab:hover{color:var(--txt);border-color:var(--line2)}
.adtab.active{color:#0a0a14;background:var(--grad);border-color:transparent;box-shadow:0 0 20px var(--glow-v)}
.adtab.active i{opacity:1}
.adpanel{display:none}
.adpanel.active{display:block}
.adpanel .btn{margin-top:10px}
.adpanel .admin-sec:first-child{margin-top:2px}

/* ░░ Admin: home-cards manager ░░ */
.hc-admin-list{margin-top:14px;display:flex;flex-direction:column;gap:8px}
.hc-admin-row{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:13px;background:var(--glass);border:1px solid var(--line)}
.hc-admin-row.off{opacity:.5}
.hcar-ic{flex:0 0 auto;width:38px;height:38px;border-radius:10px;display:grid;place-items:center;color:#fff;background:linear-gradient(135deg,rgba(139,92,246,.45),rgba(34,211,238,.3));font-size:15px}
.hcar-main{flex:1;min-width:0}
.hcar-title{font-weight:700;font-size:14px;color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hcar-sub{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}
.hcar-kind{text-transform:capitalize;color:var(--cyan);font-weight:600}
.hcar-actions{flex:0 0 auto;display:flex;gap:4px}
.iconbtn{width:32px;height:32px;border-radius:9px;display:grid;place-items:center;color:var(--txt2);background:rgba(255,255,255,.05);border:1px solid var(--line);font-size:12px;transition:.18s}
.iconbtn:hover{color:var(--txt);border-color:var(--line2);background:var(--glass2)}
.iconbtn:disabled{opacity:.3;pointer-events:none}
.iconbtn.danger:hover{color:#fb7185;border-color:rgba(251,113,133,.4)}
.hc-editor{margin-top:14px}
.hc-form{background:var(--glass);border:1px solid var(--line2);border-radius:16px;padding:16px}
.hcf-head{font-weight:800;font-size:16px;color:var(--txt);margin-bottom:14px}
.field .opt{color:var(--muted);font-weight:400;font-size:11px}
.field select{width:100%;padding:13px 15px;border-radius:13px;background:rgba(255,255,255,.06);border:1px solid var(--line);color:var(--txt);font-size:15px;outline:none}
.field select:focus{border-color:rgba(34,211,238,.6);box-shadow:0 0 0 3px rgba(34,211,238,.16)}
.field select option{color:#111}
.hc-target{position:relative}
#hcfTarget.hc-has-caret{padding-right:36px;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%237b7595' stroke-width='2'><path d='M4 6l4 4 4-4'/></svg>");background-repeat:no-repeat;background-position:right 13px center;background-size:13px}
.hc-lookup{position:absolute;left:0;right:0;top:100%;margin-top:4px;z-index:20;max-height:240px;overflow-y:auto;background:#100d1f;border:1px solid var(--line2);border-radius:12px;box-shadow:0 18px 40px rgba(0,0,0,.55)}
.hc-lk{display:block;width:100%;text-align:left;padding:11px 14px;font-size:14px;color:var(--txt);border-bottom:1px solid var(--line);transition:.15s}
.hc-lk:last-child{border-bottom:0}
.hc-lk:hover{background:var(--glass2);color:#fff}
.hc-lk small{color:var(--muted);font-size:12px;margin-left:6px}
.hc-lk.none{color:var(--muted);cursor:default}

/* ══════ OLED LOCKSCREEN (pure-black now-playing overlay for AMOLED battery saving) ══════
   Background is true #000 so those pixels switch OFF entirely on OLED panels. Everything is monochrome
   grey — the album art is the only colour — and there are NO glow/pulse animations (they'd keep pixels
   lit). The look still reads premium: art floating on black, a thin lockscreen clock, hairline progress. */
.oled{position:fixed;inset:0;z-index:65;background:#000;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:clamp(16px,3.6vh,34px);padding:calc(env(safe-area-inset-top) + 46px) 24px calc(env(safe-area-inset-bottom) + 28px);
  color:#8a8a8a;-webkit-tap-highlight-color:transparent;user-select:none;-webkit-user-select:none;
  touch-action:none;overscroll-behavior:none;will-change:transform}
.oled,.oled *{touch-action:none}   /* JS owns all overlay gestures (swipe-down dismiss + art swipe) — no native scroll fighting it */
.oled[hidden]{display:none}
.oled-x{position:absolute;top:calc(env(safe-area-inset-top) + 12px);left:50%;transform:translateX(-50%);
  background:none;border:none;color:#4a4a4a;font-size:19px;padding:10px 22px;cursor:pointer}
.oled-x:active{color:#9a9a9a}
.oled-clock{font:300 clamp(38px,11vw,60px)/1 'Sora',sans-serif;color:#d0d0d0;letter-spacing:2px;font-variant-numeric:tabular-nums}
.oled-artwrap{position:relative;width:min(60vw,40vh,320px);aspect-ratio:1;border-radius:20px;overflow:hidden;box-shadow:0 0 0 1px rgba(255,255,255,.05)}
.oled-art{width:100%;height:100%;object-fit:cover;filter:brightness(.9);-webkit-user-drag:none;user-select:none;-webkit-user-select:none}
.oled-meta{text-align:center;max-width:82vw}
.oled-title{font:700 clamp(18px,5vw,25px)/1.25 'Sora',sans-serif;color:#e6e6e6;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.oled-artist{margin-top:6px;font-size:clamp(13px,3.6vw,16px);color:#787878}
.oled-seek{width:min(82vw,360px)}
.oled-bar{height:3px;border-radius:3px;background:#141414;overflow:hidden}
.oled-fill{height:100%;width:0;border-radius:3px;background:rgba(34,211,238,.5)}   /* dim cyan hairline: a hint of brand, few lit pixels */
.oled-times{display:flex;justify-content:space-between;margin-top:9px;font-size:11px;color:#555;font-variant-numeric:tabular-nums}
.oled-ctrls{display:flex;align-items:center;gap:clamp(26px,9vw,46px)}
.oled-ctrls button{background:none;border:none;color:#c8c8c8;font-size:21px;padding:10px;cursor:pointer;transition:transform .12s}
.oled-ctrls button:active{transform:scale(.88)}
.oled-ctrls .oled-play{width:66px;height:66px;border-radius:50%;border:1.5px solid #333;color:#e9e9e9;font-size:23px;display:grid;place-items:center}
/* OLED action rail (like / add-to-playlist / download) — mirrors the main rail's state via JS */
.oled-actions{display:flex;align-items:center;gap:clamp(30px,12vw,54px);margin-top:2px}
.oled-act{background:none;border:none;color:#8a8a8a;font-size:20px;padding:8px;cursor:pointer;transition:transform .12s,color .2s;line-height:1;display:grid;place-items:center}
.oled-act:active{transform:scale(.85)}
.oled-act.on{color:#ff5d8f}          /* liked */
.oled-act.saved{color:var(--cyan)}   /* already in a playlist */
.oled-act.done{color:var(--cyan)}    /* downloaded for offline */
.oled-act .dl-pct{width:20px;height:20px;border-radius:50%;background:#151515;display:grid;place-items:center;font-size:9px;font-weight:800;color:#ddd}
/* under the opaque overlay: stop the ambient wash / grain / art-glow so they don't burn CPU while hidden */
body.oled-on .ambient,body.oled-on .grain{display:none}
body.oled-on .art-glow{animation:none}
/* Nightstand: the black overlay covers everything, so stop ALL animation/blur/GPU work on the app
   underneath — keeps low-end devices smooth. #oled overlay is a sibling of .app, so it's untouched. */
body.oled-on .app,body.oled-on .app *{animation:none!important;transition:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;will-change:auto!important}

/* seek bar: let the browser hand drag gestures to us instead of scrolling */
#seekTrack{touch-action:none}
#seekTrack *{pointer-events:none}

.confirm-btns{display:flex;gap:10px;margin-top:16px}
.confirm-btns .btn{flex:1}

.mini-x{color:var(--muted)}
.mini-x:hover{color:#fb7185}

/* --- swipe-to-dismiss: mini collapses to a resume square --- */
.mini.collapsed{width:62px;padding:8px;gap:0;justify-content:center;cursor:pointer}
.mini.collapsed .mini-prog,.mini.collapsed .mini-meta,.mini.collapsed .mini-btn{display:none}
.mini-resume{position:absolute;left:0;top:0;width:100%;height:100%;display:none;align-items:center;justify-content:center;color:#fff;font-size:18px;background:rgba(0,0,0,.42);border-radius:16px;z-index:3}
.mini.collapsed .mini-resume{display:flex;animation:miniResumePulse 2.2s ease-in-out infinite}
@keyframes miniResumePulse{0%,100%{box-shadow:inset 0 0 0 0 rgba(255,255,255,0)}50%{box-shadow:inset 0 0 0 2px rgba(255,255,255,.28)}}
.mini-title.marquee{text-overflow:clip}
.mini-title.marquee .mini-title-in{display:inline-block;animation:raMarq var(--marq-dur,8s) ease-in-out infinite alternate}
/* --- storage: stacked device bar with downloads highlighted --- */
.sb-track.sb-stack{display:flex}
.sb-seg{height:100%}
.sb-seg.sb-other{background:rgba(255,255,255,.16)}
.sb-seg.sb-dl{background:var(--grad);box-shadow:0 0 10px var(--glow-v)}
.sb-legend{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px;font-size:11px;color:var(--muted)}
.sb-lg{display:inline-flex;align-items:center;gap:5px}
.sb-dot{width:9px;height:9px;border-radius:3px;display:inline-block}
.sb-dot.dot-dl{background:var(--grad)}
.sb-dot.dot-other{background:rgba(255,255,255,.16)}
.sb-dot.dot-free{background:transparent;border:1px solid var(--line2)}

/* --- admin: user management --- */
.ad-user-list{display:flex;flex-direction:column;gap:8px}
.ad-user{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:11px 13px;border:1px solid var(--line2);border-radius:14px;background:rgba(255,255,255,.03)}
.au-main{display:flex;align-items:center;gap:11px;min-width:0;flex:1 1 220px}
.au-avatar{width:38px;height:38px;flex:none;border-radius:50%;display:grid;place-items:center;font-weight:700;color:#fff;background:var(--grad)}
.au-tx{min-width:0}
.au-tx b{font-size:14px}
.au-tx small{display:block;color:var(--muted);font-size:11.5px;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.au-you{font-size:9.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);border:1px solid var(--line2);border-radius:6px;padding:1px 5px;vertical-align:middle}
.au-badge{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:600;padding:2px 7px;border-radius:20px;margin-left:5px;vertical-align:middle}
.au-badge.admin{background:rgba(139,92,246,.18);color:#c4b5fd}
.au-badge.ok{background:rgba(34,197,94,.15);color:#4ade80}
.au-badge.warn{background:rgba(245,158,11,.15);color:#fbbf24}
.au-ac{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}
.au-ac .chip[disabled]{opacity:.4;pointer-events:none}

/* mini swipe: reserve only the vertical axis for the browser so horizontal drags follow the finger */
.mini,.mini *{touch-action:pan-y;-webkit-user-select:none;user-select:none}

/* --- admin users: select + edit --- */
.ad-user.selected{border-color:#8b5cf6;background:rgba(139,92,246,.10)}
.au-check{width:26px;height:26px;flex:none;border-radius:50%;border:2px solid var(--line2);background:transparent;color:transparent;display:grid;place-items:center;font-size:11px;cursor:pointer;transition:.15s}
.ad-user.selected .au-check{background:var(--grad);border-color:transparent;color:#fff}
.au-edit{flex:none}
.au-bulk{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:0 0 12px;padding:10px 12px;border-radius:12px;background:rgba(139,92,246,.12);border:1px solid var(--line2)}
.aub-count{font-weight:700;font-size:13px}
.aub-ac{display:flex;gap:6px;flex-wrap:wrap}

/* native app: drop continuously-recompositing effects to save battery/heat (PWA keeps them) */
body.native .art-glow{animation:none}
body.native .hero-empty-art{animation:none}

/* delete-tab results: artwork beside each match */
.del-item{display:flex;align-items:center;gap:11px;text-align:left}
.yti-art{width:42px;height:42px;border-radius:8px;object-fit:cover;flex:none;background:var(--line2)}
.yti-art.round{border-radius:50%}
.del-item .yti-tx{display:flex;flex-direction:column;min-width:0}
.del-item .yti-n,.del-item .yti-s{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}

/* admin Library tab: group each tool in its own card */
.lib-card{border:1px solid var(--line2);border-radius:16px;padding:14px 16px 16px;margin-bottom:16px;background:rgba(255,255,255,.02)}
.lib-card>.admin-sec:first-child{margin-top:0}
.lib-card.danger-card{border-color:rgba(251,113,133,.35)}
.lib-card.danger-card>.admin-sec{color:#fb7185}

/* collapsed square captures vertical gestures (swipe up = clear); full bar keeps pan-y */
.mini.collapsed,.mini.collapsed *{touch-action:none}
/* gesture hint pill — tells the user exactly what the swipe will do */
.swipe-hint{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(var(--dock-h) + 84px);z-index:60;padding:8px 15px;border-radius:999px;background:rgba(20,16,34,.96);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid var(--line2);color:var(--muted);font-size:12.5px;font-weight:700;opacity:0;pointer-events:none;transition:opacity .15s;white-space:nowrap}
.swipe-hint.show{opacity:1}
.swipe-hint.armed{color:#fff;border-color:#8b5cf6;background:rgba(139,92,246,.35)}
.swipe-hint.danger.armed{border-color:#fb7185;background:rgba(251,113,133,.4)}

/* delete/rename search results — standard list rows (thumb + name/artist) */
.cg-list{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.cg-item{display:flex;flex-direction:row;align-items:center;gap:12px;width:100%;padding:8px 11px;border:1px solid var(--line2);border-radius:12px;background:rgba(255,255,255,.02);cursor:pointer;text-align:left;transition:border-color .15s,background .15s}
.cg-item:hover{border-color:#8b5cf6;background:rgba(139,92,246,.08)}
.cg-thumb{width:46px;height:46px;flex:none;object-fit:cover;border-radius:9px;background:var(--line2)}
.cg-thumb.round{border-radius:50%}
.cg-tx{display:flex;flex-direction:column;min-width:0;flex:1}
.cg-n{font-size:13.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.cg-s{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;margin-top:1px}

/* in-app update prompt */
.upd-prog{margin:12px 0}
.upd-bar{height:7px;border-radius:5px;background:rgba(255,255,255,.12);overflow:hidden}
.upd-fill{height:100%;width:0;border-radius:5px;background:var(--grad);box-shadow:0 0 12px var(--glow-v);transition:width .2s}
.upd-msg{font-size:12px;color:var(--muted);margin-top:7px}

/* Android-app download promo (shown to Android web users) */
.app-promo{display:flex;align-items:center;gap:14px;padding:13px 15px;margin:0 0 16px;border-radius:16px;background:linear-gradient(135deg,rgba(99,102,241,.16),rgba(45,212,191,.10));border:1px solid var(--line2)}
.ap-logo{width:48px;height:48px;flex:none;border-radius:12px;object-fit:cover}
.ap-tx{flex:1;min-width:0}
.ap-ttl{font-weight:700;font-size:14.5px;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ap-sub{font-size:12px;color:var(--muted);margin-top:2px;line-height:1.35}
.ap-btn{flex:none;display:inline-flex;align-items:center;gap:7px;padding:10px 16px;border-radius:11px;background:var(--grad);color:#0a0a14;font-weight:700;font-size:13px;text-decoration:none;white-space:nowrap}
.ap-btn:active{transform:scale(.97)}
@media(max-width:560px){.app-promo{flex-wrap:wrap}.ap-tx{flex:1 1 60%}.ap-btn{width:100%;justify-content:center;margin-top:2px}}
/* phone: force 2-up home/genre cards — placed AFTER the base .home-cards/.genre-grid rules so it actually wins (media queries add no specificity; equal-specificity later rule wins) */
@media(max-width:560px){.home-cards{grid-template-columns:var(--hc-cols-m,repeat(2,1fr))}.genre-grid{grid-template-columns:repeat(2,1fr)}}
.hc-cols-ctrl{border:1px solid var(--line);background:var(--glass);border-radius:14px;padding:12px 14px;margin:0 0 14px}
.hc-cols-ctrl .hcc-title{font-weight:700;font-size:13px;margin-bottom:9px;display:flex;align-items:center;gap:7px;color:#fff}
.hc-cols-ctrl .hcc-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px}
.hc-cols-ctrl label{font-size:12.5px;color:rgba(255,255,255,.72);display:flex;align-items:center;gap:6px}
.hc-cols-ctrl select{background:#1c1830;color:#fff;border:1px solid var(--line2);border-radius:9px;padding:5px 8px;font-size:13px}
.hc-cols-ctrl select option{background:#1c1830;color:#fff}
.hc-cols-ctrl #hccSave{margin-left:auto}

/* trim-artist preview */
.trim-list{max-height:320px;overflow-y:auto;margin:12px 0;display:flex;flex-direction:column;gap:6px;border:1px solid var(--line2);border-radius:12px;padding:10px}
.trim-row{display:flex;align-items:center;gap:9px;font-size:12.5px}
.trim-row i{color:var(--muted);font-size:11px;flex:none}
.trim-old{color:var(--muted);text-decoration:line-through;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.trim-new{color:var(--txt);font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.trim-more{color:var(--muted);font-size:11.5px;padding-top:5px;text-align:center}

/* trim scan — affected-artist list */
.trim-scan-list{display:flex;flex-direction:column;gap:7px;margin-top:10px}
.trim-scan-row{display:flex;align-items:center;gap:11px;width:100%;padding:8px 11px;border:1px solid var(--line2);border-radius:11px;background:rgba(255,255,255,.02);cursor:pointer;text-align:left;transition:border-color .15s,background .15s}
.trim-scan-row:hover{border-color:#8b5cf6;background:rgba(139,92,246,.08)}
.ts-art{width:38px;height:38px;flex:none;border-radius:50%;object-fit:cover;background:var(--line2)}
.ts-name{flex:1;min-width:0;font-weight:600;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ts-count{flex:none;font-size:11.5px;font-weight:700;color:#0a0a14;background:var(--grad);border-radius:20px;padding:3px 10px}
