:root{
  /* dark red theme */
  --bg:#0a0506;
  --bg2:#140a0c;
  --card:#1d1012;
  --card2:#281518;
  --line:#3a1f24;
  --text:#f6eef0;
  --muted:#b08a90;
  --accent:#e11d3c;        /* crimson */
  --accent2:#ff4d63;       /* bright red-pink */
  --accent-deep:#8c0f24;
  --danger:#ff5c6c;
  --radius:16px;
  --glow:0 0 24px rgba(225,29,60,.35);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%}
body{
  background:var(--bg); color:var(--text);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Inter,Helvetica,Arial,sans-serif;
  overflow:hidden;
  -webkit-font-smoothing:antialiased;
}
.hidden{display:none !important}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
input{font-family:inherit}

/* ---------- Login ---------- */
.login{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;
  background:
    radial-gradient(900px 500px at 50% -5%, rgba(225,29,60,.30) 0%, transparent 60%),
    radial-gradient(700px 500px at 90% 110%, rgba(140,15,36,.35) 0%, transparent 55%),
    var(--bg);}
.login-box{display:flex;flex-direction:column;gap:14px;width:min(350px,87vw);
  padding:34px 28px;background:linear-gradient(180deg,rgba(40,21,24,.9),rgba(20,10,12,.92));
  border:1px solid var(--line);border-radius:24px;
  box-shadow:0 30px 80px rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.04);text-align:center;
  backdrop-filter:blur(10px)}
.login-logo{font-size:52px;color:var(--accent2);text-shadow:var(--glow);line-height:1}
.login-box h1{margin:2px 0 8px;font-size:24px;font-weight:800;letter-spacing:-.5px}
.login-box input,.login-box button{padding:15px 16px;border-radius:14px;font-size:16px}
.login-box input{background:rgba(0,0,0,.35);border:1px solid var(--line);color:var(--text);outline:none}
.login-box input:focus{border-color:var(--accent)}
.login-box button{background:linear-gradient(180deg,var(--accent2),var(--accent));color:#fff;font-weight:700;
  box-shadow:0 8px 24px rgba(225,29,60,.4)}
.login-box button:active{transform:scale(.98)}
.login-error{color:var(--danger);font-size:14px;min-height:18px}

/* ---------- App shell ---------- */
.app{display:flex;flex-direction:column;height:100%;
  background:radial-gradient(1000px 420px at 50% -120px, rgba(140,15,36,.28), transparent 70%)}
.topbar{display:flex;align-items:center;justify-content:space-between;
  padding:calc(16px + env(safe-area-inset-top, 0px)) calc(16px + env(safe-area-inset-right, 0px)) 8px calc(16px + env(safe-area-inset-left, 0px));gap:10px}
/* env(safe-area-inset-*) needs viewport-fit=cover in the meta viewport (set in index.html):
   on iPhones with a notch / Dynamic Island it pushes the header below the status bar,
   on Android and desktop it is 0. */
.tabs{display:flex;gap:8px;overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tab{padding:9px 16px;border-radius:999px;background:rgba(255,255,255,.05);color:var(--muted);
  font-size:14px;font-weight:600;white-space:nowrap;border:1px solid transparent;transition:.15s}
.tab.active{background:linear-gradient(180deg,var(--accent2),var(--accent));color:#fff;
  box-shadow:0 6px 18px rgba(225,29,60,.4)}
.icon-btn{display:flex;align-items:center;justify-content:center;width:44px;height:44px;
  border-radius:50%;font-size:18px;color:var(--text);background:rgba(255,255,255,.06);transition:.12s}
.icon-btn.add{font-size:28px;font-weight:300;background:linear-gradient(180deg,var(--accent2),var(--accent));
  color:#fff;box-shadow:0 8px 22px rgba(225,29,60,.45)}
.icon-btn:active{transform:scale(.92)}

.searchbar{padding:8px 16px 12px}
.searchbar input{width:100%;padding:13px 18px;border-radius:14px;background:rgba(0,0,0,.3);
  border:1px solid var(--line);color:var(--text);font-size:15px;outline:none}
.searchbar input:focus{border-color:var(--accent)}
.searchbar input::placeholder{color:#7a5a60}

.sortbar{display:flex;align-items:center;gap:7px;padding:0 16px 10px;overflow-x:auto;scrollbar-width:none}
.sortbar::-webkit-scrollbar{display:none}
.sort-label{font-size:12px;color:var(--muted);white-space:nowrap;margin-right:2px}
.chip{padding:7px 13px;border-radius:999px;background:rgba(255,255,255,.05);color:var(--muted);
  font-size:13px;font-weight:600;white-space:nowrap;border:1px solid var(--line);transition:.15s}
.chip.active{color:#fff;border-color:var(--accent);background:rgba(225,29,60,.18);box-shadow:0 0 14px rgba(225,29,60,.25)}
.chip:active{transform:scale(.97)}

.main{flex:1;overflow-y:auto;padding:4px 12px calc(210px + env(safe-area-inset-bottom, 0px))}

/* ---------- Track list ---------- */
.track{display:flex;align-items:center;gap:13px;padding:9px 10px;border-radius:14px;transition:.12s}
.track:active{background:rgba(255,255,255,.05)}
.track.playing{background:linear-gradient(90deg,rgba(225,29,60,.22),rgba(225,29,60,.02))}
.track-cover{width:54px;height:54px;border-radius:11px;object-fit:cover;flex:none;
  background:linear-gradient(135deg,var(--card2),var(--accent-deep));
  display:flex;align-items:center;justify-content:center;font-size:22px;color:rgba(255,255,255,.5);
  box-shadow:0 4px 12px rgba(0,0,0,.4)}
.track-info{flex:1;min-width:0}
.track-title{font-size:15.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.track.playing .track-title{color:var(--accent2)}
.track-artist{font-size:13px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
.track-dur{font-size:12px;color:var(--muted);flex:none;font-variant-numeric:tabular-nums}
.track-more{flex:none;width:36px;height:36px;border-radius:50%;font-size:18px;color:var(--muted)}
.track-more:active{background:rgba(255,255,255,.08)}

.empty{text-align:center;color:var(--muted);padding:70px 26px;font-size:15px;line-height:1.7}

/* section headers / playlists */
.section-head{display:flex;align-items:center;justify-content:space-between;padding:16px 8px 8px}
.section-head h2{margin:0;font-size:19px;font-weight:800;letter-spacing:-.4px}
.pl-card{display:flex;align-items:center;gap:13px;padding:13px 12px;border-radius:14px;
  background:linear-gradient(180deg,var(--card),var(--bg2));border:1px solid var(--line);margin-bottom:10px}
.pl-card:active{background:var(--card2)}
.pl-ico{width:50px;height:50px;border-radius:12px;
  background:linear-gradient(135deg,var(--accent2),var(--accent-deep));
  display:flex;align-items:center;justify-content:center;font-size:24px;flex:none;
  box-shadow:0 6px 16px rgba(225,29,60,.35)}
.pl-meta{flex:1}.pl-name{font-weight:700;font-size:16px}.pl-count{font-size:13px;color:var(--muted);margin-top:2px}
.back-row{display:flex;align-items:center;gap:10px;padding:12px 6px;font-weight:700;font-size:17px}
.back-row button{font-size:24px;color:var(--accent2);width:34px}
.mini-btn{padding:8px 14px;border-radius:999px;background:rgba(225,29,60,.15);font-size:13px;font-weight:700;
  color:var(--accent2);border:1px solid rgba(225,29,60,.3)}

/* ---------- Player ---------- */
.player{position:fixed;left:0;right:0;bottom:0;
  background:linear-gradient(180deg,rgba(29,16,18,.82),rgba(10,5,6,.97));
  backdrop-filter:blur(22px);border-top:1px solid var(--line);
  padding-bottom:env(safe-area-inset-bottom);
  box-shadow:0 -10px 40px rgba(0,0,0,.5)}
.progress-wrap{padding:0}
.seek{-webkit-appearance:none;appearance:none;width:100%;height:4px;
  background:linear-gradient(90deg,var(--accent) var(--p,0%),#3a1f24 var(--p,0%));border-radius:0;margin:0;display:block}
.seek::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;
  background:var(--accent2);margin-top:0;box-shadow:0 0 10px rgba(255,77,99,.7)}
.seek::-moz-range-thumb{width:14px;height:14px;border:none;border-radius:50%;background:var(--accent2)}
.player-body{display:flex;align-items:center;gap:13px;padding:11px 14px 14px}
.p-cover{width:50px;height:50px;border-radius:11px;object-fit:cover;
  background:linear-gradient(135deg,var(--card2),var(--accent-deep));flex:none;
  box-shadow:0 4px 14px rgba(0,0,0,.5)}
.p-meta{flex:1;min-width:0}
.p-title{font-weight:700;font-size:14.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.p-artist{font-size:12.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}
.p-controls{display:flex;align-items:center;gap:4px}
.p-controls .icon-btn{background:transparent;width:40px;height:40px;font-size:21px}
.p-controls .play{background:linear-gradient(180deg,var(--accent2),var(--accent));color:#fff;
  width:50px;height:50px;font-size:19px;box-shadow:0 6px 18px rgba(225,29,60,.5)}
.icon-btn.small{font-size:17px;width:34px;height:34px;color:var(--muted)}
.icon-btn.small.on{color:var(--accent2)}
.p-time{font-size:11px;color:var(--muted);min-width:78px;text-align:right;font-variant-numeric:tabular-nums}
@media(max-width:560px){
  .p-time{display:none}
  .p-controls .icon-btn.small{display:none}
}

.offline-btn{display:block;width:100%;margin:18px 0 6px;padding:13px;border-radius:14px;font-size:14px;font-weight:600;
  color:var(--muted);background:rgba(255,255,255,.04);border:1px dashed var(--line)}
.offline-btn:active{background:rgba(255,255,255,.08)}

/* ---------- Install as app ---------- */
.topbar-actions{display:flex;gap:8px;align-items:center;flex-shrink:0}
.icon-btn.install{width:42px;height:42px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.06);border:1px solid var(--line);color:var(--accent2);animation:installPulse 2.4s ease-in-out infinite}
@keyframes installPulse{0%,100%{box-shadow:0 0 0 0 rgba(225,29,60,0)}50%{box-shadow:0 0 0 6px rgba(225,29,60,.14)}}
.install-card{padding-bottom:calc(18px + env(safe-area-inset-bottom))}
.install-hero{text-align:center;padding:4px 6px 18px}
.install-icon-wrap{width:92px;height:92px;margin:0 auto 14px;border-radius:24px;padding:3px;
  background:linear-gradient(145deg,var(--accent2),var(--accent-deep));box-shadow:var(--glow),0 18px 40px rgba(0,0,0,.6);
  animation:installFloat 3.2s ease-in-out infinite}
@keyframes installFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
.install-icon{width:100%;height:100%;border-radius:21px;display:block}
.install-hero h2{margin:0 0 8px;font-size:22px;font-weight:800;letter-spacing:-.3px}
.install-sub{margin:0;color:var(--muted);font-size:14px;line-height:1.45}
.install-cta{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;padding:16px;border-radius:16px;
  font-size:17px;font-weight:800;color:#fff;background:linear-gradient(180deg,var(--accent2),var(--accent));
  box-shadow:0 10px 28px rgba(225,29,60,.45)}
.install-cta:active{transform:scale(.98)}
.hint.center{text-align:center;margin-top:10px}
.install-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.install-steps li{display:flex;align-items:center;gap:12px;padding:13px 14px;border-radius:14px;
  background:rgba(255,255,255,.04);border:1px solid var(--line);font-size:15px;line-height:1.35}
.install-steps b{color:#fff}
.step-n{width:26px;height:26px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;
  font-size:13px;font-weight:800;color:#fff;background:linear-gradient(180deg,var(--accent2),var(--accent))}
.step-ico{width:30px;flex-shrink:0;display:flex;align-items:center;justify-content:center;color:var(--accent2);font-weight:800}
.sheet.pop .sheet-card{animation:sheetUp .38s cubic-bezier(.2,.9,.3,1.1)}
@keyframes sheetUp{from{transform:translateY(40px);opacity:0}to{transform:translateY(0);opacity:1}}

/* ---------- Add sheet ---------- */
.sheet{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:flex-end;z-index:40}
.sheet-card{width:100%;background:linear-gradient(180deg,var(--bg2),var(--bg));
  border:1px solid var(--line);border-bottom:none;border-radius:26px 26px 0 0;padding:10px 22px calc(28px + env(safe-area-inset-bottom, 0px));
  max-height:88vh;overflow-y:auto;animation:slideUp .26s cubic-bezier(.2,.8,.2,1)}
@keyframes slideUp{from{transform:translateY(100%)}to{transform:translateY(0)}}
.sheet-handle{width:44px;height:5px;border-radius:3px;background:var(--line);margin:8px auto 16px}
.sheet h2{margin:0 0 18px;font-size:20px;font-weight:800}
.field-label{display:block;font-size:13px;color:var(--muted);margin:12px 0 9px;font-weight:600}
.url-row{display:flex;gap:9px}
.url-row input{flex:1;padding:14px;border-radius:14px;background:rgba(0,0,0,.35);
  border:1px solid var(--line);color:var(--text);font-size:15px;outline:none}
.url-row input:focus{border-color:var(--accent)}
.url-row button,.upload-btn,.dl-btn{padding:14px 20px;border-radius:14px;
  background:linear-gradient(180deg,var(--accent2),var(--accent));color:#fff;font-weight:700;font-size:15px;
  box-shadow:0 6px 18px rgba(225,29,60,.4)}
.upload-btn{width:100%;background:rgba(225,29,60,.08);color:var(--accent2);border:1px dashed rgba(225,29,60,.4);
  box-shadow:none}
.divider{text-align:center;color:var(--muted);font-size:13px;margin:20px 0}
.sheet-close{width:100%;margin-top:22px;padding:15px;border-radius:14px;
  background:rgba(255,255,255,.05);color:var(--text);font-weight:700}

/* add-method tabs */
.add-tabs{display:flex;gap:7px;margin-bottom:16px;overflow-x:auto;scrollbar-width:none}
.add-tabs::-webkit-scrollbar{display:none}
.add-tab{padding:10px 13px;border-radius:12px;background:rgba(255,255,255,.05);color:var(--muted);
  font-size:13.5px;font-weight:700;white-space:nowrap;border:1px solid transparent}
.add-tab.active{background:rgba(225,29,60,.16);color:var(--accent2);border-color:rgba(225,29,60,.35)}
.add-pane{animation:fade .2s ease}
@keyframes fade{from{opacity:0}to{opacity:1}}
.hint{font-size:12.5px;color:var(--muted);margin-top:10px;line-height:1.5}

/* candidate / detected lists */
.cand-list{margin-top:14px;display:flex;flex-direction:column;gap:8px;max-height:46vh;overflow-y:auto}
.cand{display:flex;align-items:center;gap:11px;padding:8px;border-radius:12px;background:var(--card);
  border:1px solid var(--line)}
.cand:active{background:var(--card2)}
.cand img{width:46px;height:46px;border-radius:8px;object-fit:cover;flex:none;background:var(--card2)}
.cand-ico{width:46px;height:46px;border-radius:8px;flex:none;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,var(--card2),var(--accent-deep));font-size:18px;color:rgba(255,255,255,.5)}
.cand-info{flex:1;min-width:0}
.cand-title{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cand-sub{font-size:12px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
.cand-add{flex:none;width:38px;height:38px;border-radius:50%;font-size:22px;font-weight:300;
  background:rgba(225,29,60,.15);color:var(--accent2)}
.cand-add.added{background:rgba(54,211,153,.15);color:#36d399;font-size:18px}
.cand-add:active{transform:scale(.9)}

/* shazam */
.shz-btn{width:100%;margin-top:8px;padding:18px;border-radius:16px;font-size:16px;font-weight:700;
  background:linear-gradient(180deg,var(--accent2),var(--accent));color:#fff;
  box-shadow:0 8px 24px rgba(225,29,60,.4)}
.shz-btn.listening{background:linear-gradient(180deg,#444,#222);animation:pulse 1.2s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(225,29,60,.5)}50%{box-shadow:0 0 0 16px rgba(225,29,60,0)}}
#shz-result{margin-top:16px}
.shz-match{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px;text-align:center}
.shz-match .t{font-size:18px;font-weight:700}
.shz-match .a{font-size:14px;color:var(--muted);margin:4px 0 14px}
.shz-match button{padding:12px 24px;border-radius:12px;background:linear-gradient(180deg,var(--accent2),var(--accent));
  color:#fff;font-weight:700}

.jobs{margin-top:16px;display:flex;flex-direction:column;gap:10px}
.job{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:13px 15px}
.job-title{font-size:14px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.job-status{font-size:12px;color:var(--muted);margin-top:5px}
.job-bar{height:6px;border-radius:3px;background:#3a1f24;margin-top:9px;overflow:hidden}
.job-bar>div{height:100%;background:linear-gradient(90deg,var(--accent),var(--accent2));width:0;transition:width .3s}
.job.done .job-status{color:#36d399}
.job.error .job-status{color:var(--danger)}

/* ---------- Context menu ---------- */
.ctx{position:fixed;inset:0;background:rgba(0,0,0,.55);display:flex;align-items:flex-end;z-index:50}
.ctx-card{width:100%;background:linear-gradient(180deg,var(--bg2),var(--bg));
  border:1px solid var(--line);border-bottom:none;border-radius:26px 26px 0 0;
  padding:8px 0 calc(16px + env(safe-area-inset-bottom));animation:slideUp .22s ease}
.ctx-head{display:flex;gap:13px;align-items:center;padding:16px 22px;border-bottom:1px solid var(--line);margin-bottom:6px}
.ctx-head img{width:50px;height:50px;border-radius:10px;object-fit:cover;background:var(--card2)}
.ctx-item{display:flex;align-items:center;gap:15px;padding:16px 24px;font-size:16px;font-weight:500}
.ctx-item:active{background:rgba(255,255,255,.05)}
.ctx-item.danger{color:var(--danger)}
.ctx-item .i{width:22px;text-align:center;font-size:18px}

/* ---------- Toast ---------- */
.toast{position:fixed;left:50%;bottom:calc(120px + env(safe-area-inset-bottom, 0px));transform:translateX(-50%);
  background:var(--card2);color:var(--text);padding:13px 22px;border-radius:999px;
  font-size:14px;font-weight:600;z-index:60;border:1px solid var(--line);
  box-shadow:0 10px 34px rgba(0,0,0,.5);max-width:90vw;text-align:center}
