/* ═══════════════════════════════════════════════════════════════════════════
   dj.css — стили страницы Online DJ (pages/online-dj.html).
   Загружается ПОСЛЕ styles.css, поэтому переопределения работают.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── LAYOUT ──────────────────────────────────────────────────────────────── */
.dj-layout{
  display:grid;
  grid-template-columns:minmax(560px,1fr) 380px;
  gap:22px;
  padding:24px 4% 40px;
  min-height:calc(100vh - 90px);
  align-items:start;
}
.dj-left{display:flex;flex-direction:column;gap:14px}
.dj-right{
  position:sticky;
  top:100px;
  align-self:start;
  padding:16px 14px 12px;
  border-radius:18px;
  display:flex;flex-direction:column;
  height:calc(100vh - 130px);
  max-height:calc(100vh - 130px);
  overflow:hidden;
}
body.header-collapsed .dj-right{top:20px;height:calc(100vh - 50px);max-height:calc(100vh - 50px)}
body.header-collapsed .dj-layout{padding-top:20px}

/* ── DECK ────────────────────────────────────────────────────────────────── */
.deck{
  padding:12px 16px 14px;
  border-radius:16px;
  display:flex;flex-direction:column;gap:11px;
  position:relative;
  transition:border-color .25s,box-shadow .25s;
}
.deck.master{border-color:#c15dfa66}
.deck.slave{border-color:#5da2ff66}
.deck.master.playing{border-color:#d94eff;box-shadow:0 0 24px #d94eff22}
.deck.slave.playing{border-color:#26cefc;box-shadow:0 0 24px #26cefc22}

.deck-header{
  display:flex;align-items:center;gap:12px;
  font-size:11px;letter-spacing:2px;
  color:var(--muted);
  text-transform:uppercase;
}
.deck-label{font-weight:500;letter-spacing:2.5px}
.deck-label.master{color:#d94eff;text-shadow:0 0 8px #d94eff55}
.deck-label.slave{color:#26cefc;text-shadow:0 0 8px #26cefc55}
.deck-dot{
  width:8px;height:8px;border-radius:50%;
  background:#3a2f5c;
  transition:background .2s,box-shadow .2s;
}
.deck.master .deck-dot.playing{background:#d94eff;box-shadow:0 0 10px #d94eff}
.deck.slave .deck-dot.playing{background:#26cefc;box-shadow:0 0 10px #26cefc}
.deck-time{
  margin-left:auto;
  font-variant-numeric:tabular-nums;
  font-family:'Courier New',monospace;
  font-size:12px;color:#c8c3e0;letter-spacing:0;
}
.deck-playbtn{
  width:32px;height:32px;
  border-radius:50%;
  background:rgba(15,7,40,.7);
  border:1px solid #b393ff;
  color:#fff;font-size:11px;
  display:grid;place-items:center;
  cursor:pointer;
  transition:background .15s,border-color .15s,transform .1s;
}
.deck.slave .deck-playbtn{border-color:#5da2ff}
.deck-playbtn:hover{background:rgba(45,25,90,.9)}
.deck-playbtn:active{transform:scale(.93)}

/* ── Deck body: cover · info · badges (сетка 64 | 1fr | auto) ───────────── */
.deck-body{
  display:grid;
  grid-template-columns:64px 1fr auto;
  gap:14px;
  align-items:center;
  min-height:64px;
}
.deck-empty{
  grid-column:1 / -1;
  padding:14px 8px;
  text-align:center;color:var(--muted);
  font-size:12px;font-style:italic;
}

.deck-cover{
  width:64px;height:64px;
  border-radius:10px;overflow:hidden;
  background:#291064;flex-shrink:0;
  border:1px solid #291a4b;
}
.deck-cover img{width:100%;height:100%;object-fit:cover;display:block}

.deck-info{
  display:flex;flex-direction:column;
  min-width:0;gap:4px;
}
.deck-artist{
  font-size:14px;font-weight:500;color:#f0eaff;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.deck-title{
  font-size:12px;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}

.deck-badges{
  display:grid;
  grid-template-columns:repeat(2,minmax(48px,auto));
  gap:4px;
}
.deck-badges .badge{
  font-size:9px;
  padding:3px 8px;
  border-radius:12px;
  background:#7966c833;color:#d1c9f2;
  letter-spacing:.5px;text-align:center;white-space:nowrap;
}
.deck-badges .b-cam{background:#4b3379;color:#e9d7ff}
.deck-badges .b-bpm{background:#3f2f6a}
.deck-badges .b-key{background:#22436288;color:#a3d1ff}
.deck-badges .b-nrg{background:#5b325288;color:#ffbfd6}

/* ── Waveform ────────────────────────────────────────────────────────────── */
.waveform-wrap{
  position:relative;
  height:60px;
  border-radius:10px;
  background:rgba(10,8,30,.55);
  overflow:hidden;
  border:1px solid #21173e;
}
.waveform-wrap canvas{width:100%;height:100%;display:block}
.wf-ph{
  position:absolute;top:0;bottom:0;
  width:2px;background:#ffe1ff;
  box-shadow:0 0 8px #ffb0f0;
  pointer-events:none;
  transition:left .1s linear;
}

/* ── CONTROLS ────────────────────────────────────────────────────────────── */
.dj-controls{
  padding:14px 16px;
  border-radius:14px;
  display:flex;flex-direction:column;gap:12px;
}
.filter-row{display:flex;gap:8px;align-items:center}
.camelot-btn{
  font-size:10px;
  padding:6px 10px;
  border:1px solid var(--border);
  border-radius:20px;
  background:transparent;color:var(--muted);
  cursor:pointer;letter-spacing:1px;
  transition:all .15s;
}
.camelot-btn.active{
  background:#8d42bb55;border-color:#cf75f3;color:#eabaff;
  box-shadow:0 0 8px #d94eff30;
}
.filter-group{display:flex;gap:5px;flex:1}
.filter-btn{
  padding:6px 10px;
  border:1px solid var(--border);
  border-radius:20px;
  font-size:10px;
  background:transparent;color:var(--muted);
  cursor:pointer;flex:1;
  letter-spacing:.8px;text-transform:uppercase;
  transition:all .15s;
}
.filter-btn:hover{border-color:#7d5eb8;color:#c9bfe8}
.filter-btn.active{background:#8d42bb55;border-color:#cf75f3;color:#eabaff}

.mode-row{display:flex;gap:12px;align-items:center}
.dj-btn{
  padding:10px 20px;
  font-size:11px;letter-spacing:2px;
  border:1px solid #c48bff;
  border-radius:20px;
  background:linear-gradient(110deg,#69289960,#3527bc88);
  color:#fff;cursor:pointer;
  transition:transform .15s,box-shadow .15s;
}
.dj-btn:hover{transform:translateY(-1px);box-shadow:0 0 15px #a044ff77}
.dj-btn.active{
  background:linear-gradient(110deg,#a044ff,#c85fc9);
  box-shadow:0 0 18px #d94effaa;
}

.fade-wrap{flex:1;display:flex;align-items:center;gap:8px}
.fade-lbl{font-size:10px;color:var(--muted);letter-spacing:1.5px}
.fade-sl{flex:1;accent-color:#c859f3;height:4px;margin:0}
.fade-val{
  font-size:11px;color:#eabaff;font-variant-numeric:tabular-nums;
  min-width:26px;text-align:right;
}

.status-bar{
  display:flex;align-items:center;gap:10px;
  font-size:10px;letter-spacing:1px;
  padding-top:10px;
  border-top:1px solid #251b40;
}
.status-item{display:flex;gap:5px;align-items:center}
.s-key{color:var(--muted);text-transform:uppercase}
.s-val{color:#e5d7ff;font-weight:500;font-variant-numeric:tabular-nums}
.status-dot{color:var(--muted)}
.mode-pill{
  margin-left:auto;
  padding:4px 10px;
  border-radius:12px;
  font-size:9px;letter-spacing:1.5px;
  border:1px solid;
}
.mode-pill.manual{border-color:#7c6cbd;background:#1c1638;color:#c9bfe8}
.mode-pill.auto{border-color:#d94eff;background:#5c1e7e;color:#f8dcff;box-shadow:0 0 10px #d94eff44}

/* ── TRACK LIST (RIGHT COLUMN) ───────────────────────────────────────────── */
.dj-tracklist-header{
  display:flex;align-items:center;gap:10px;
  padding:0 4px 12px;
  border-bottom:1px solid #251b40;
}
.dj-tracklist-title{
  font-weight:500;letter-spacing:2px;font-size:11px;text-transform:uppercase;
  color:#e5d7ff;
}
.dj-tracklist-count{
  color:var(--muted);font-size:11px;
  font-variant-numeric:tabular-nums;
}
.dj-list-filter-info{
  color:#a79bd8;font-size:10px;letter-spacing:.5px;
}
.search-icon-btn{
  margin-left:auto;
  font-size:18px;color:var(--muted);
  cursor:pointer;padding:3px 8px;
  background:none;border:0;
}
.search-icon-btn:hover{color:#eabaff}

.dj-tracklist-body{
  flex:1;overflow-y:auto;
  padding:12px 4px;
  scrollbar-width:thin;scrollbar-color:#5a4a8a55 transparent;
}
.dj-tracklist-body::-webkit-scrollbar{width:6px}
.dj-tracklist-body::-webkit-scrollbar-thumb{background:#5a4a8a55;border-radius:3px}
.dj-tracklist-body::-webkit-scrollbar-track{background:transparent}

.dj-empty{
  text-align:center;color:var(--muted);
  font-size:12px;padding:40px 20px;
}
.dj-gate{text-align:center;padding:50px 24px 30px}
.dj-gate-title{font-size:16px;color:#e5d7ff;margin:0 0 8px}
.dj-gate-sub{font-size:12px;color:var(--muted);margin:0 0 20px;line-height:1.5}
.dj-gate .primary{margin:0 auto}

/* ── FAB ─────────────────────────────────────────────────────────────────── */
.dj-fab{
  position:fixed;bottom:24px;right:24px;
  width:54px;height:54px;
  border-radius:50%;
  background:linear-gradient(135deg,#6f2fe4,#3527bc);
  border:1px solid #a080ec;
  color:#fff;font-size:22px;
  display:grid;place-items:center;
  cursor:pointer;z-index:50;
  box-shadow:0 4px 18px rgba(50,30,200,.5);
  transition:transform .15s,box-shadow .15s;
}
.dj-fab:hover{transform:scale(1.05);box-shadow:0 4px 24px rgba(90,60,255,.7)}
.dj-fab.auto{
  background:linear-gradient(135deg,#a044ff,#e0409f);
  box-shadow:0 4px 18px rgba(200,40,180,.5);
}
.dj-fab.auto:hover{box-shadow:0 4px 24px rgba(220,80,220,.75)}

/* ── COLLAPSIBLE HEADER ──────────────────────────────────────────────────── */
body.collapsible-header header{
  transition:transform .22s ease-out,opacity .22s ease-out;
  transform-origin:top center;
}
body.collapsible-header.header-collapsed header{
  transform:translateY(-100%);
  opacity:0;pointer-events:none;
}
.header-collapse-btn{
  background:transparent;
  border:1px solid var(--border);
  border-radius:50%;
  width:28px;height:28px;
  display:grid;place-items:center;
  font-size:10px;color:var(--muted);
  cursor:pointer;margin-left:8px;
  transition:color .15s,border-color .15s;
}
.header-collapse-btn:hover{color:#eabaff;border-color:#b393ff}

.header-floater{
  position:fixed;top:12px;right:12px;
  width:40px;height:40px;
  border-radius:50%;
  background:linear-gradient(135deg,#47317488,#8d42bb55);
  border:1px solid #b393ff;
  display:none;place-items:center;
  cursor:pointer;z-index:100;
  color:#fff;font-size:12px;
  box-shadow:0 4px 20px rgba(0,0,0,.4),inset 0 0 10px rgba(255,255,255,.08);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  transition:transform .15s,box-shadow .15s;
}
.header-floater:hover{transform:scale(1.08);box-shadow:0 4px 26px rgba(0,0,0,.5)}
body.header-collapsed .header-floater{display:grid}

/* ── RESPONSIVE (mobile придёт отдельным пассом) ─────────────────────────── */
@media(max-width:1000px){
  .dj-layout{grid-template-columns:1fr;padding:20px 4%}
  .dj-right{position:static;height:auto;max-height:600px}
}

/* ═══ TRACK CARDS (Stage 2) ═══════════════════════════════════════════════ */
.dj-card{
  padding:10px 12px;
  margin-bottom:8px;
  border:1px solid #2a2148;
  border-radius:10px;
  background:linear-gradient(120deg,#1a1a3e50,#0a0b2160);
  transition:border-color .15s,background .15s;
}
.dj-card:hover{border-color:#7d5eb8;background:linear-gradient(120deg,#26235c60,#0c0e2b70)}
.dj-card.in-master{border-color:#d94eff;background:linear-gradient(120deg,#3a1c5e70,#1a0d3050)}
.dj-card.in-slave{border-color:#26cefc;background:linear-gradient(120deg,#0f2b4a70,#0c1d3050)}

.dj-card-top{
  display:flex;align-items:flex-start;gap:10px;margin-bottom:8px;
}
.dj-card-info{
  flex:1;min-width:0;
  display:flex;flex-direction:column;gap:3px;
}
.dj-card-artist{
  font-size:12px;color:#e5d7ff;font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3;
}
.dj-card-title{
  font-size:11px;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3;
}
.dj-card-btns{
  display:flex;gap:5px;flex-shrink:0;
}
.dj-card-btn{
  padding:4px 8px;
  border:1px solid var(--border);
  border-radius:5px;
  background:transparent;
  color:var(--muted);
  font-size:9px;letter-spacing:1px;
  cursor:pointer;
  transition:all .15s;
}
.dj-card-btn:hover{border-color:#b393ff;color:#eabaff}
.dj-card-btn.load{border-color:#c48bff88;color:#e0b9ff}
.dj-card-btn.load:hover{background:#8d42bb55;color:#fff}

.dj-card-meta{
  display:flex;align-items:center;gap:5px;flex-wrap:wrap;
}
.dj-card-meta .badge{
  font-size:9px;
  padding:2px 7px;
  border-radius:10px;
  background:#7966c833;
  color:#d1c9f2;
  letter-spacing:.4px;
}
.dj-card-meta .b-cam{background:#4b3379;color:#e9d7ff}
.dj-card-meta .b-bpm{background:#3f2f6a;color:#c7bef5}
.dj-card-meta .b-dur{background:#2a2148;color:#a9a1cf}
.dj-card-meta .b-nrg{background:#5b325288;color:#ffbfd6}

.dj-compat{
  width:8px;height:8px;border-radius:50%;flex-shrink:0;
  margin-left:2px;
}
.dj-compat.yes{background:#5cd670;box-shadow:0 0 5px #5cd67088}
.dj-compat.no{background:#ff5a7e;box-shadow:0 0 5px #ff5a7e77}

.dj-sim{
  flex:1;min-width:40px;height:3px;
  background:#22183e;
  border-radius:2px;overflow:hidden;
  margin:0 4px;
}
.dj-sim-fill{
  height:100%;
  background:linear-gradient(90deg,#7f4bb8,#d94eff);
  transition:width .3s;
}
.dj-sim-fill.power{background:linear-gradient(90deg,#e0409f,#ffbf6b)}
.dj-sim-fill.soft{background:linear-gradient(90deg,#5da2ff,#66d0e0)}
.dj-sim-fill.random{background:linear-gradient(90deg,#7d5eb8,#a29bbe)}
.dj-sim-score{
  font-size:9px;color:var(--muted);
  min-width:24px;text-align:right;
  font-variant-numeric:tabular-nums;
}

/* ── Skeleton ────────────────────────────────────────────────────────────── */
.dj-skel{
  padding:10px 12px;
  margin-bottom:8px;
  border:1px solid #221a3a;
  border-radius:10px;
  background:#0f0e2380;
}
.dj-skel-line{
  background:linear-gradient(90deg,#221a3a,#3d2f6a,#221a3a);
  background-size:200% 100%;
  animation:djskel 1.5s linear infinite;
  border-radius:3px;margin-bottom:6px;
}
.dj-skel-row{display:flex;gap:5px;margin-top:8px}
@keyframes djskel{
  0%{background-position:200% 0}
  100%{background-position:-200% 0}
}

/* ── Sentinel (lazy load anchor, invisible) ──────────────────────────────── */
.dj-sentinel{height:1px}

/* ═══ Stage 3: cursor & interaction hints ══════════════════════════════════ */
.waveform-wrap{cursor:pointer}
.waveform-wrap:hover{border-color:#3a2b64}

/* ═══ DJ MODALS (Search + Info, Stage 4) ═════════════════════════════════ */
dialog.dj-modal{
  border:1px solid #3a2b64;
  border-radius:18px;
  background:linear-gradient(140deg,#12112de6,#080820ec);
  color:var(--text);
  padding:28px 26px 22px;
  min-width:520px;
  max-width:640px;
  width:min(640px,92vw);
  box-shadow:0 20px 60px rgba(0,0,0,.6);
  backdrop-filter:blur(10px);
  -webkit-backdrop-filter:blur(10px);
}
dialog.dj-modal::backdrop{
  background:rgba(3,2,15,.72);
  backdrop-filter:blur(3px);
}
dialog.dj-modal .close.icon{
  position:absolute;top:12px;right:12px;
  width:28px;height:28px;
  border-radius:50%;
  background:transparent;border:1px solid var(--border);
  color:var(--muted);font-size:16px;
  display:grid;place-items:center;cursor:pointer;
  transition:color .15s,border-color .15s;
}
dialog.dj-modal .close.icon:hover{color:#eabaff;border-color:#b393ff}
dialog.dj-modal .eyebrow{display:block;margin-bottom:6px}
dialog.dj-modal h2{margin:4px 0 14px;font-size:20px;color:#f0eaff}

/* ── Search modal ────────────────────────────────────────────────────── */
.search-input-wrap{
  display:flex;align-items:center;gap:10px;
  padding:10px 14px;
  border:1px solid #3a2b64;
  border-radius:12px;
  background:rgba(10,8,30,.6);
  transition:border-color .15s;
  margin-bottom:14px;
}
.search-input-wrap:focus-within{border-color:#cf75f3;box-shadow:0 0 0 3px #db40ff22}
.search-input-icon{color:var(--muted);font-size:16px;flex-shrink:0}
#search-input{
  flex:1;
  background:transparent;border:0;outline:none;
  color:var(--text);font-size:15px;font-family:inherit;
  padding:2px 0;
}
#search-input::placeholder{color:#7d6ea8}
.search-status{
  font-size:11px;color:var(--muted);
  font-variant-numeric:tabular-nums;
  min-width:52px;text-align:right;
}
.search-results{
  max-height:min(480px,60vh);
  overflow-y:auto;
  padding-right:4px;
  scrollbar-width:thin;scrollbar-color:#5a4a8a55 transparent;
}
.search-results::-webkit-scrollbar{width:6px}
.search-results::-webkit-scrollbar-thumb{background:#5a4a8a55;border-radius:3px}
.search-row{
  display:flex;align-items:center;gap:10px;
  padding:10px 12px;
  margin-bottom:6px;
  border:1px solid #251b40;
  border-radius:10px;
  background:linear-gradient(120deg,#151330a0,#0a0b2170);
  transition:border-color .15s,background .15s;
}
.search-row:hover{border-color:#7d5eb8;background:linear-gradient(120deg,#25235c70,#0c0e2b80)}
.search-row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.search-row-artist{
  font-size:13px;color:#e5d7ff;font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.search-row-title{
  font-size:11px;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.search-row-meta{
  display:flex;gap:5px;margin-top:4px;flex-wrap:wrap;
}
.search-row-meta .badge{
  font-size:9px;padding:2px 7px;border-radius:10px;
  background:#7966c833;color:#d1c9f2;letter-spacing:.4px;
}
.search-row-meta .b-cam{background:#4b3379;color:#e9d7ff}
.search-row-meta .b-bpm{background:#3f2f6a;color:#c7bef5}
.search-row-meta .b-dur{background:#2a2148;color:#a9a1cf}
.search-row-btns{display:flex;gap:5px;flex-shrink:0}

/* ── Info modal ──────────────────────────────────────────────────────── */
.info-head{
  display:flex;gap:16px;align-items:center;
  margin-bottom:18px;
}
.info-cover{
  width:96px;height:96px;
  border-radius:12px;overflow:hidden;
  background:#291064;flex-shrink:0;
  border:1px solid #291a4b;
  box-shadow:0 4px 18px rgba(0,0,0,.3);
}
.info-cover img{width:100%;height:100%;object-fit:cover;display:block}
.info-titles{flex:1;min-width:0}
.info-titles h2{margin:0 0 4px;font-size:18px;line-height:1.3;color:#f0eaff}
.info-artist{
  font-size:14px;color:#eabaff;font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.info-album{
  font-size:12px;color:var(--muted);margin-top:4px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}

.info-grid{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:8px;
  margin-bottom:16px;
}
.info-cell{
  display:flex;flex-direction:column;gap:3px;
  padding:9px 10px;
  border:1px solid #251b40;
  border-radius:10px;
  background:rgba(10,8,30,.55);
}
.info-cell-label{
  font-size:9px;color:var(--muted);
  letter-spacing:1.2px;text-transform:uppercase;
}
.info-cell-value{
  font-size:14px;color:#e5d7ff;font-weight:500;
  font-variant-numeric:tabular-nums;
}
.info-cell.accent{
  border-color:#5f3f8f;
  background:linear-gradient(135deg,#3a1e5e60,#25153a70);
}
.info-cell.accent .info-cell-value{color:#eabaff}

.info-wf{
  height:60px;
  border-radius:10px;
  background:rgba(10,8,30,.55);
  border:1px solid #21173e;
  overflow:hidden;
  margin-bottom:18px;
}
.info-wf canvas{width:100%;height:100%;display:block}

.info-actions{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
}
.info-actions .info-load{
  min-width:180px;
  justify-content:center;
}

/* Responsive */
@media(max-width:640px){
  dialog.dj-modal{min-width:0;width:96vw;padding:24px 18px}
  .info-grid{grid-template-columns:repeat(2,1fr)}
  .info-cover{width:76px;height:76px}
}

/* ═══ Stage 5: DJ Mode auto — crossfade visual indicator ══════════════════ */
body.crossfading .deck.master,
body.crossfading .deck.slave{
  border-color:#e0409f;
  box-shadow:0 0 28px #e0409f44, inset 0 0 20px #d94eff22;
  animation:djxfade 1.2s ease-in-out infinite alternate;
}
@keyframes djxfade{
  from{box-shadow:0 0 20px #d94eff30, inset 0 0 15px #d94eff15}
  to  {box-shadow:0 0 40px #d94eff60, inset 0 0 25px #d94eff30}
}
body.crossfading .mode-pill.auto{
  animation:djpillpulse .9s ease-in-out infinite alternate;
}
@keyframes djpillpulse{
  from{box-shadow:0 0 10px #d94eff44}
  to  {box-shadow:0 0 20px #e0409faa}
}

/* ═══ Fading NOW button (manual crossfade trigger) ══════════════════════════ */
.dj-btn.fade-now{
  border-color:#26cefc88;
  background:linear-gradient(110deg,#0e3a5c66,#154a7a88);
  color:#c8ecff;
}
.dj-btn.fade-now:not(:disabled):hover{
  border-color:#26cefc;
  box-shadow:0 0 15px #26cefc77;
  transform:translateY(-1px);
}
.dj-btn.fade-now:disabled{
  opacity:.4;cursor:not-allowed;
  border-color:#25355088;
  background:linear-gradient(110deg,#12193066,#161e3080);
  color:#7d8ba8;
  transform:none;box-shadow:none;
}
.dj-btn.fade-now.ready:not(:disabled){
  animation:djfadenowpulse 1.6s ease-in-out infinite;
}
@keyframes djfadenowpulse{
  0%,100%{box-shadow:0 0 8px #26cefc44}
  50%    {box-shadow:0 0 20px #26cefcaa,inset 0 0 8px #26cefc33}
}

/* ═══ Auto Pitch pill button (status bar) ══════════════════════════════════ */
.pill-btn{
  margin-left:auto;                              /* прижимает к mode-pill */
  padding:4px 12px;
  border-radius:12px;
  font-size:9px;letter-spacing:1.5px;
  border:1px solid #4a3b6f;
  background:#1c1638;
  color:#8f83b8;
  cursor:pointer;
  transition:all .15s;
  font-family:inherit;
  text-transform:none;
}
.pill-btn:hover{border-color:#7d5eb8;color:#c9bfe8}
.pill-btn.active{
  border-color:#d94eff;
  background:#5c1e7e;
  color:#f8dcff;
  box-shadow:0 0 10px #d94eff44;
}
.pill-btn + .mode-pill{margin-left:8px}          /* небольшой отступ от mode-pill */

/* Убираем margin-left:auto с mode-pill когда рядом есть pill-btn */
.status-bar .pill-btn ~ .mode-pill{margin-left:8px}
.status-bar .pill-btn{margin-left:auto}

/* ═══ Like button on deck header ═══════════════════════════════════════════ */
.deck-like{
  width:30px;height:30px;
  border-radius:50%;
  background:transparent;
  border:1px solid var(--border);
  color:#8f83b8;
  font-size:15px;
  display:grid;place-items:center;
  cursor:pointer;
  transition:all .15s;
  font-family:inherit;
  line-height:1;
  padding:0;
}
.deck-like:not(:disabled):hover{
  color:#ff8ac2;
  border-color:#ff5a9e88;
  transform:scale(1.08);
}
.deck-like:disabled{opacity:.35;cursor:not-allowed}
.deck-like.active{
  color:#ff5a9e;
  border-color:#ff5a9e;
  background:#40122a;
  box-shadow:0 0 10px #ff5a9e55;
}
.deck-like.active:not(:disabled):hover{
  color:#ffa3c8;
  box-shadow:0 0 14px #ff5a9e99;
}

/* ═══ TABS: All Tracks / My Sets / My Moods (glassmorphism) ═══════════════ */
.dj-tabs{
  display:flex;gap:4px;
  padding:5px;
  border-radius:14px;
  background:linear-gradient(135deg,rgba(30,20,60,.45),rgba(15,10,35,.55));
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border:1px solid #2a2148;
  margin-bottom:12px;
  flex-shrink:0;
  box-shadow:inset 0 0 10px rgba(139,66,187,.06);
}
.dj-tab{
  flex:1;
  padding:9px 10px;
  border-radius:10px;
  border:1px solid transparent;
  background:transparent;
  color:var(--muted);
  font-size:10px;
  letter-spacing:1.5px;
  text-transform:uppercase;
  cursor:pointer;
  transition:all .22s;
  font-family:inherit;
  font-weight:500;
  position:relative;
}
.dj-tab:hover:not(.active){
  color:#c9bfe8;
  background:rgba(139,66,187,.08);
}
.dj-tab.active{
  background:linear-gradient(135deg,rgba(141,66,187,.35),rgba(106,47,153,.4));
  color:#eabaff;
  border-color:#cf75f3;
  box-shadow:0 0 12px rgba(217,78,255,.25),inset 0 0 10px rgba(217,78,255,.15);
  text-shadow:0 0 6px rgba(217,78,255,.4);
}

/* Panel — растягивается на всю высоту, скрывается когда hidden */
.dj-tab-panel{
  flex:1;min-height:0;
  display:flex;flex-direction:column;overflow:hidden;
}
.dj-tab-panel[hidden]{display:none}

/* ═══ CHIPS SCROLLER (для сетов и moods) ═════════════════════════════════ */
.dj-chips-scroller{
  display:flex;gap:6px;
  overflow-x:auto;overflow-y:hidden;
  padding:4px 2px 12px;margin-bottom:8px;
  border-bottom:1px solid #251b40;
  flex-shrink:0;
  scroll-behavior:smooth;
  scrollbar-width:thin;scrollbar-color:#5a4a8a33 transparent;
}
.dj-chips-scroller::-webkit-scrollbar{height:4px}
.dj-chips-scroller::-webkit-scrollbar-thumb{background:#5a4a8a55;border-radius:2px}
.dj-chips-scroller::-webkit-scrollbar-track{background:transparent}

.dj-chip{
  flex-shrink:0;
  padding:7px 14px;
  border-radius:20px;
  border:1px solid var(--border);
  background:linear-gradient(135deg,rgba(20,15,45,.6),rgba(10,8,30,.7));
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  color:var(--muted);
  font-size:11px;
  letter-spacing:.5px;
  cursor:pointer;
  transition:all .18s;
  white-space:nowrap;
  display:inline-flex;gap:7px;align-items:center;
  font-family:inherit;
  font-weight:500;
}
.dj-chip:hover:not(.active){
  border-color:#7d5eb8;
  color:#c9bfe8;
  transform:translateY(-1px);
}
.dj-chip.active{
  background:linear-gradient(135deg,rgba(141,66,187,.55),rgba(106,47,153,.65));
  border-color:#cf75f3;
  color:#f8dcff;
  box-shadow:0 0 14px rgba(217,78,255,.45),inset 0 0 8px rgba(255,255,255,.06);
}
.dj-chip-name{
  max-width:160px;
  overflow:hidden;text-overflow:ellipsis;
}
.dj-chip-meta{
  font-size:9px;
  padding:1px 6px;
  border-radius:8px;
  background:rgba(255,255,255,.08);
  opacity:.7;
  font-variant-numeric:tabular-nums;
}
.dj-chip.active .dj-chip-meta{background:rgba(255,255,255,.14);opacity:1}

/* ═══ MOOD TILES (крупные плашки, горизонтальный скроллер) ═════════════════ */
.mood-tiles-scroller{
  display:flex;gap:10px;
  overflow-x:auto;overflow-y:hidden;
  padding:6px 2px 14px;margin-bottom:8px;
  border-bottom:1px solid #251b40;
  flex-shrink:0;
  scroll-behavior:smooth;
  scrollbar-width:thin;scrollbar-color:#5a4a8a33 transparent;
}
.mood-tiles-scroller::-webkit-scrollbar{height:5px}
.mood-tiles-scroller::-webkit-scrollbar-thumb{background:#5a4a8a55;border-radius:3px}
.mood-tiles-scroller::-webkit-scrollbar-track{background:transparent}

.mood-tile{
  flex-shrink:0;
  min-width:160px;max-width:210px;
  padding:11px 14px 10px;
  border-radius:14px;
  border:1.5px solid #5a4a8a55;
  background:linear-gradient(140deg,rgba(20,15,45,.65),rgba(10,8,30,.75));
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  color:var(--text);
  font-family:inherit;
  cursor:pointer;
  transition:transform .18s,border-color .18s,box-shadow .22s;
  display:flex;flex-direction:column;gap:5px;
  text-align:left;
  position:relative;
  overflow:hidden;
}
.mood-tile::before{
  content:'';
  position:absolute;top:0;right:0;bottom:0;
  width:70%;
  background:radial-gradient(ellipse at top right,var(--tile-glow,rgba(124,92,191,.14)) 0%,transparent 65%);
  pointer-events:none;
  opacity:.85;
}
.mood-tile:hover:not(.active){
  transform:translateY(-1px);
  border-color:var(--tile-border,rgba(160,120,230,.7));
  box-shadow:0 4px 18px var(--tile-glow,rgba(124,92,191,.25));
}
.mood-tile.active{
  border-color:var(--tile-border,#cf75f3);
  box-shadow:0 0 18px var(--tile-glow,rgba(217,78,255,.5)),
             inset 0 0 12px var(--tile-glow-inset,rgba(217,78,255,.15));
  transform:translateY(-1px);
}

.mood-tile-head{
  display:flex;align-items:center;gap:8px;
  position:relative;z-index:1;
}
.mood-tile-dot{
  width:9px;height:9px;border-radius:50%;
  flex-shrink:0;
  box-shadow:0 0 6px currentColor;
}
.mood-tile-name{
  font-size:13px;font-weight:500;
  color:#f0eaff;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  letter-spacing:.2px;
}
.mood-tile-style{
  font-size:9px;
  color:var(--muted);
  letter-spacing:1.4px;
  text-transform:uppercase;
  padding-left:17px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  position:relative;z-index:1;
}
.mood-tile-meta{
  display:flex;gap:10px;
  font-size:10px;
  color:#c9bfe8;
  font-variant-numeric:tabular-nums;
  padding-left:17px;
  padding-top:2px;
  position:relative;z-index:1;
}
.mood-tile-meta span{opacity:.85}

/* ── Цветовые схемы (по color_tag) ─────────────────────────────────────── */
.mood-tile.color-purple{
  --tile-border:rgba(160,120,230,.7);
  --tile-glow:rgba(124,92,191,.35);
  --tile-glow-inset:rgba(160,120,230,.2);
}
.mood-tile.color-purple .mood-tile-dot{color:#a074e6;background:#a074e6}

.mood-tile.color-red{
  --tile-border:rgba(230,90,110,.75);
  --tile-glow:rgba(200,60,80,.4);
  --tile-glow-inset:rgba(230,90,110,.2);
}
.mood-tile.color-red .mood-tile-dot{color:#e65a70;background:#e65a70}

.mood-tile.color-blue{
  --tile-border:rgba(80,140,230,.75);
  --tile-glow:rgba(60,120,220,.4);
  --tile-glow-inset:rgba(90,150,240,.2);
}
.mood-tile.color-blue .mood-tile-dot{color:#5090e8;background:#5090e8}

.mood-tile.color-orange{
  --tile-border:rgba(240,150,60,.75);
  --tile-glow:rgba(220,130,40,.4);
  --tile-glow-inset:rgba(240,160,70,.2);
}
.mood-tile.color-orange .mood-tile-dot{color:#f09640;background:#f09640}

.mood-tile.color-light_blue{
  --tile-border:rgba(80,200,240,.75);
  --tile-glow:rgba(60,180,220,.4);
  --tile-glow-inset:rgba(90,210,255,.2);
}
.mood-tile.color-light_blue .mood-tile-dot{color:#50c8f0;background:#50c8f0}

.mood-tile.color-green{
  --tile-border:rgba(80,200,120,.75);
  --tile-glow:rgba(60,180,100,.4);
  --tile-glow-inset:rgba(90,210,130,.2);
}
.mood-tile.color-green .mood-tile-dot{color:#50c878;background:#50c878}

.mood-tile.color-black{
  --tile-border:rgba(200,200,200,.55);
  --tile-glow:rgba(160,160,180,.25);
  --tile-glow-inset:rgba(200,200,220,.15);
}
.mood-tile.color-black .mood-tile-dot{color:#c0c0c8;background:#c0c0c8}

/* ═══════════════════════════════════════════════════════════════════════════
   MOBILE UI  —  ≤1000px (телефон + планшет).
   Внутри ещё @media (max-width: 720px) для phone-специфичных ужаток.
   Desktop-DOM остаётся, но выключается display:none где не нужен.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ─── Menu button (hamburger) + mobile menu, desktop hide ────────────────── */
.menu-btn{
  display:none;
  background:transparent;border:0;
  width:36px;height:36px;
  padding:8px;cursor:pointer;
  position:relative;
  flex-shrink:0;
}
.menu-btn-line{
  display:block;
  height:1.5px;
  width:100%;
  background:#e5d7ff;
  margin:4px 0;
  border-radius:1px;
  transition:transform .22s,opacity .18s;
}
.menu-btn[aria-expanded="true"] .menu-btn-line:nth-child(1){transform:translateY(6px) rotate(45deg)}
.menu-btn[aria-expanded="true"] .menu-btn-line:nth-child(2){opacity:0}
.menu-btn[aria-expanded="true"] .menu-btn-line:nth-child(3){transform:translateY(-6px) rotate(-45deg)}

.mobile-menu-backdrop{display:none}
.mobile-menu{display:none}

@media (max-width: 1000px){

  /* ─── HEADER: минимализм — только лого + меню ───────────────────────── */
  header{
    padding:8px 14px;
    min-height:52px;
    position:sticky;top:0;z-index:80;
    background:linear-gradient(135deg,rgba(15,10,35,.92),rgba(20,15,45,.88));
    backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
    border-bottom:1px solid #2a2148;
    display:flex;align-items:center;justify-content:space-between;
    gap:12px;
  }
  header .brand small,
  header nav,
  header .account,
  header .header-collapse-btn{display:none !important}
  header .brand{gap:8px;font-size:15px}
  header .brand b{font-size:16px;letter-spacing:1.5px}
  header .brand-mark{width:24px;height:24px}
  .header-floater{display:none !important}

  .menu-btn{display:block}

  /* ─── MOBILE MENU (full-screen overlay, slide-in справа) ────────────── */
  .mobile-menu-backdrop{
    display:block;
    position:fixed;inset:0;
    background:rgba(3,2,15,.55);
    backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);
    opacity:0;
    z-index:200;
    transition:opacity .22s ease-out;
    pointer-events:none;
  }
  .mobile-menu-backdrop.open{opacity:1;pointer-events:auto}

  .mobile-menu{
    display:flex;
    flex-direction:column;
    position:fixed;top:0;right:0;bottom:0;
    width:min(320px,86vw);
    background:linear-gradient(155deg,rgba(20,15,50,.96),rgba(10,8,30,.98));
    backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
    border-left:1px solid #3a2b64;
    box-shadow:-8px 0 40px rgba(0,0,0,.5);
    transform:translateX(100%);
    transition:transform .26s cubic-bezier(.4,0,.2,1);
    z-index:210;
    padding:18px 22px 24px;
  }
  .mobile-menu.open{transform:translateX(0)}

  .mobile-menu-header{
    display:flex;justify-content:space-between;align-items:center;
    margin-bottom:20px;padding-bottom:14px;
    border-bottom:1px solid #251b40;
  }
  .mobile-menu-brand{
    font-size:18px;font-weight:600;letter-spacing:2px;
    color:#eabaff;
    text-shadow:0 0 8px rgba(217,78,255,.35);
  }
  .mobile-menu-close{
    width:32px;height:32px;
    border-radius:50%;
    background:transparent;
    border:1px solid var(--border);
    color:var(--muted);
    font-size:18px;
    display:grid;place-items:center;
    cursor:pointer;
    transition:color .15s,border-color .15s;
  }
  .mobile-menu-close:hover{color:#eabaff;border-color:#b393ff}

  .mobile-menu-list{
    list-style:none;margin:0;padding:0;
    flex:1;
  }
  .mobile-menu-list li{
    opacity:0;
    transform:translateX(20px);
  }
  .mobile-menu.open .mobile-menu-list li{
    animation:menuStagger .3s cubic-bezier(.4,0,.2,1) forwards;
    animation-delay:calc(80ms + var(--i) * 30ms);
  }
  @keyframes menuStagger{
    to{opacity:1;transform:translateX(0)}
  }
  .mobile-menu-list a{
    display:block;
    padding:13px 12px;
    color:#e5d7ff;
    text-decoration:none;
    font-size:15px;
    letter-spacing:.5px;
    border-radius:10px;
    transition:background .15s,color .15s;
  }
  .mobile-menu-list a:active{background:rgba(139,66,187,.15)}
  .mobile-menu-list a[aria-current="page"]{
    background:linear-gradient(135deg,rgba(141,66,187,.35),rgba(106,47,153,.4));
    color:#f8dcff;
  }

  .mobile-menu-footer{
    padding-top:14px;
    border-top:1px solid #251b40;
  }
  .mobile-menu-user{
    font-size:12px;color:var(--muted);
    margin-bottom:10px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .mobile-menu-logout{
    width:100%;
    padding:10px;
    border-radius:10px;
    border:1px solid #5a3f70;
    background:transparent;
    color:#c9bfe8;
    font-size:13px;
    font-family:inherit;
    cursor:pointer;
    transition:all .15s;
  }
  .mobile-menu-logout:hover{border-color:#ff7db1;color:#ff7db1}

  /* ─── LAYOUT: одна колонка ──────────────────────────────────────────── */
  .dj-layout{
    grid-template-columns:1fr;
    gap:12px;
    padding:12px 12px 24px;
    min-height:calc(100vh - 60px);
  }
  .dj-left{gap:10px}
  .dj-right{
    position:static;
    height:auto;max-height:none;
    padding:14px 12px 10px;
  }

  /* ─── FAB: убираем ───────────────────────────────────────────────────── */
  .dj-fab{display:none !important}

  /* ─── DECK: компактная разметка ──────────────────────────────────────── */
  .deck{padding:10px 12px 12px;gap:8px}
  /* Убираем стандартную деку-шапку — MASTER/SLAVE label + dot + time + pbtn */
  .deck .deck-header{display:none}

  .deck-body{
    grid-template-columns:80px 1fr auto;
    gap:12px;
    align-items:center;
    min-height:80px;
  }

  /* Обложка — PLAY overlay поверх, клик по обложке = play/pause */
  .deck-cover{
    width:80px;height:80px;
    border-radius:12px;
    position:relative;
    cursor:pointer;
  }
  .deck-cover::after{
    content:'▶';
    position:absolute;top:50%;left:50%;
    transform:translate(-50%,-50%);
    width:34px;height:34px;
    border-radius:50%;
    background:rgba(15,7,40,.72);
    border:1.5px solid #b393ff;
    color:#fff;font-size:13px;
    display:grid;place-items:center;
    box-shadow:0 3px 12px rgba(0,0,0,.4);
    transition:background .15s,transform .1s;
  }
  .deck.slave .deck-cover::after{border-color:#5da2ff}
  .deck.playing .deck-cover::after{
    content:'❚❚';
    font-size:10px;
    letter-spacing:1px;
  }
  .deck-cover:active::after{transform:translate(-50%,-50%) scale(.92)}

  /* Инфо-блок: артист + название (оставляем), длительность + KEY + BPM */
  .deck-info{gap:2px}
  .deck-artist{font-size:13px}
  .deck-title{font-size:11px}

  /* Бэйджи: убираем Camelot и Energy на mobile, оставляем KEY, BPM,
     длительность (статичную). Раскладка в один столбик, компактно. */
  .deck-badges{
    grid-template-columns:auto;
    gap:3px;
    align-self:center;
    justify-content:end;
  }
  .deck-badges .b-cam,
  .deck-badges .b-nrg{display:none}
  .deck-badges .badge{
    padding:2px 8px;font-size:9px;
    text-align:right;
  }

  /* Waveform чуть тоньше, статичный playhead уже есть */
  .waveform-wrap{height:44px;border-radius:8px}
  .wf-ph{width:1.5px}

  /* Убираем keyframe glow на mobile — статичный акцент вместо анимаций,
     экономит GPU-repaint. Crossfade подсвечивается ровной обводкой. */
  body.crossfading .deck.master,
  body.crossfading .deck.slave{
    animation:none !important;
    box-shadow:0 0 18px rgba(217,78,255,.35);
  }
  body.crossfading .mode-pill.auto{animation:none !important}
  .dj-btn.fade-now.ready:not(:disabled){animation:none !important}

  /* ─── CONTROLS: компактный блок ──────────────────────────────────────── */
  .dj-controls{padding:10px 12px;gap:9px}
  .filter-row{gap:6px;flex-wrap:wrap}
  .camelot-btn{padding:5px 9px;font-size:9px;letter-spacing:.5px}
  .filter-group{gap:4px}
  .filter-btn{padding:5px 6px;font-size:9px;letter-spacing:.4px}

  .mode-row{flex-wrap:wrap;gap:8px}
  .dj-btn{padding:9px 14px;font-size:10px;letter-spacing:1px}
  .fade-wrap{width:100%;order:2}

  .status-bar{gap:8px;padding-top:8px;flex-wrap:wrap}
  .status-item{gap:4px}
  .pill-btn{margin-left:auto;padding:3px 9px;font-size:8px}
  /* mode-pill дублирует состояние Auto Fading — на mobile убираем */
  .mode-pill{display:none}

  /* ─── TABS + LIST ────────────────────────────────────────────────────── */
  .dj-tabs{padding:4px;gap:3px;margin-bottom:10px}
  .dj-tab{padding:8px 6px;font-size:9px;letter-spacing:1px}
  .dj-tracklist-header{gap:8px;padding:0 2px 10px}
  .dj-tracklist-title{font-size:10px}
  .dj-tracklist-count{font-size:10px}
  .dj-list-filter-info{display:none}

  .dj-card{padding:9px 11px;margin-bottom:7px}
  .dj-card-artist{font-size:12px}
  .dj-card-title{font-size:10px}
  .dj-card-btn{padding:3px 7px;font-size:9px}
  .dj-card-meta{gap:4px}
  .dj-card-meta .badge{font-size:8px;padding:2px 6px}
  /* Убираем sim-бар и percent на mobile — визуальный шум на узком экране */
  .dj-card-meta .dj-sim,
  .dj-card-meta .dj-sim-score,
  .dj-card-meta .dj-compat{display:none}

  /* Chips + mood tiles */
  .dj-chip{padding:6px 12px;font-size:10px}
  .mood-tile{min-width:140px;max-width:180px;padding:9px 12px 9px}
  .mood-tile-name{font-size:12px}
  .mood-tile-style{font-size:8px;padding-left:15px}
  .mood-tile-meta{font-size:9px;padding-left:15px}

  /* ─── MODALS: full-screen на mobile ──────────────────────────────────── */
  dialog.dj-modal{
    min-width:0;
    width:100vw;max-width:100vw;
    height:100vh;max-height:100vh;
    border-radius:0;
    padding:20px 16px 24px;
    border-left:0;border-right:0;
    display:flex;flex-direction:column;
  }
  dialog.dj-modal .close.icon{top:14px;right:14px}
  dialog.dj-modal h2{font-size:17px;margin:2px 0 12px}
  .search-results,.info-body{flex:1;max-height:none}

  .info-head{gap:12px;margin-bottom:14px}
  .info-cover{width:80px;height:80px}
  .info-grid{grid-template-columns:repeat(2,1fr);gap:6px;margin-bottom:12px}
  .info-cell{padding:8px 9px}
  .info-cell-value{font-size:13px}
  .info-wf{margin-bottom:14px}
  .info-actions{flex-wrap:wrap;gap:8px}
  .info-actions .info-load{min-width:0;flex:1}

  /* Отключаем hover-состояния на touch — не даёт полезного эффекта,
     тратит CPU на transitions */
  @media (hover: none){
    .dj-card:hover,
    .dj-chip:hover,
    .mood-tile:hover,
    .dj-tab:hover,
    .filter-btn:hover,
    .dj-btn:hover,
    .deck-cover:hover,
    .deck-like:hover,
    .search-row:hover{
      transform:none !important;
      box-shadow:none !important;
      background:inherit;
      border-color:inherit;
      color:inherit;
    }
  }
}

/* ═══ Phone-specific (≤720px) — ещё компактнее ═══════════════════════════ */
@media (max-width: 720px){
  .dj-layout{padding:10px 10px 20px;gap:10px}
  .deck{padding:9px 10px 10px}
  .deck-body{grid-template-columns:72px 1fr auto;gap:10px;min-height:72px}
  .deck-cover{width:72px;height:72px}
  .deck-cover::after{width:30px;height:30px;font-size:12px}

  .dj-controls{padding:9px 10px}
  .filter-btn{font-size:8px;padding:5px 4px}

  .mood-tile{min-width:130px;max-width:160px}
}

/* ═══════════════════════════════════════════════════════════════════════════
   REV 2: bugfixes + static waveform + mobile UI polish
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Waveform: 2 canvas стека (bg=static grey, fg=colored+clip-path) ─────── */
.waveform-wrap .wf-bg,
.waveform-wrap .wf-fg{
  position:absolute;top:0;left:0;
  width:100%;height:100%;
  display:block;
  pointer-events:none;
}
.waveform-wrap .wf-fg{
  clip-path:inset(0 100% 0 0);
  will-change:clip-path;
  transition:clip-path 60ms linear;   /* сглаживание при 60 FPS обновлениях */
}
.waveform-wrap .wf-ph{z-index:2}      /* playhead поверх canvas'ов */

/* ── Универсальный tap-highlight fix для touch устройств ─────────────────── */
button, .dj-card, .dj-chip, .mood-tile, .dj-tab, .filter-btn, .camelot-btn,
.deck-cover, .deck-like, .pill-btn, .dj-btn, .search-row, .dj-card-btn,
.mobile-menu-list a{
  -webkit-tap-highlight-color:transparent;
  -webkit-touch-callout:none;
  user-select:none;
  -webkit-user-select:none;
}

/* ── Suppress hover-states on touch — залипание после tap ────────────────── */
@media (hover: none){
  .dj-card:hover,       .dj-card:hover:not(.in-master):not(.in-slave),
  .dj-chip:not(.active):hover,
  .mood-tile:not(.active):hover,
  .dj-tab:not(.active):hover,
  .filter-btn:not(.active):hover,
  .camelot-btn:not(.active):hover,
  .dj-btn:not(.active):not(:disabled):hover,
  .dj-card-btn:hover,
  .search-row:hover,
  .deck-like:not(:disabled):hover,
  .deck-cover:hover,
  .deck-playbtn:hover,
  .search-icon-btn:hover,
  .header-collapse-btn:hover{
    /* Явно возвращаем всё к неактивному виду */
    transform:none !important;
    box-shadow:none !important;
    background:transparent;
    /* Border/color оставляем базовые — их дефолт применит правило сверху */
  }
  /* Для активных элементов явно сохраняем их подсветку */
  .dj-chip.active:hover{
    background:linear-gradient(135deg,rgba(141,66,187,.55),rgba(106,47,153,.65));
    border-color:#cf75f3;
    color:#f8dcff;
  }
  .filter-btn.active:hover,
  .camelot-btn.active:hover{
    background:#8d42bb55;border-color:#cf75f3;color:#eabaff;
  }
  .mood-tile.active:hover{
    border-color:var(--tile-border);
    box-shadow:0 0 18px var(--tile-glow),inset 0 0 12px var(--tile-glow-inset);
  }
  .dj-tab.active:hover{
    background:linear-gradient(135deg,rgba(141,66,187,.35),rgba(106,47,153,.4));
    color:#eabaff;
  }
}

/* ── Focus-visible: показываем outline только с клавиатуры, не с tap ───── */
button:focus:not(:focus-visible),
.dj-card:focus:not(:focus-visible){outline:none}

/* ═══ MOBILE overrides (≤1000px) — расширения к предыдущему блоку ═══════ */
@media (max-width: 1000px){

  /* Убираем hint из шапки меню (заменяет крестик — визуально нейтрален) */
  .mobile-menu-hint{
    font-size:10px;
    color:var(--muted);
    letter-spacing:1.2px;
    text-transform:uppercase;
    opacity:.7;
  }

  /* Card interactions: тап по всей карточке = LOAD, кнопка LOAD убрана,
     INFO крупнее и заметнее */
  .dj-card{cursor:pointer}
  .dj-card-btn.load{display:none !important}
  .dj-card-btn.info{
    padding:8px 16px;
    font-size:11px;
    letter-spacing:1.2px;
    border-color:#7d5eb8;
    color:#c9bfe8;
    border-radius:8px;
  }
  .dj-card.in-master{border-color:#d94eff}
  .dj-card.in-slave{border-color:#26cefc}
  .dj-card:active{transform:scale(.99);transition:transform .08s}

  /* ── INFO modal: не full-screen, стеклянная плашка по центру ────── */
  dialog#info-modal.dj-modal{
    width:min(94vw,460px);
    max-width:94vw;
    height:auto;
    max-height:88vh;
    border-radius:18px;
    border:1px solid #3a2b64;
    padding:22px 20px 20px;
    overflow-y:auto;
    display:flex;flex-direction:column;
  }
  dialog#info-modal.dj-modal .close.icon{
    position:absolute;
    top:12px;right:12px;
    width:34px;height:34px;
    font-size:20px;
    z-index:5;
    background:rgba(15,7,40,.8);
  }
  /* Search modal остаётся full-screen — оправдано для длинного списка */
  dialog#search-modal.dj-modal{
    height:100vh;max-height:100vh;
    width:100vw;max-width:100vw;
    border-radius:0;
  }

  /* Compact info grid on phones */
  .info-head{gap:12px;margin-bottom:14px}
  .info-cover{width:76px;height:76px}
  .info-grid{grid-template-columns:repeat(2,1fr);gap:7px;margin-bottom:12px}
  .info-cell{padding:8px 9px}
  .info-cell-value{font-size:13px}
  .info-wf{margin-bottom:14px;height:50px}
  .info-actions{flex-wrap:wrap;gap:8px}
  .info-actions .info-load{min-width:0;flex:1;padding:11px 14px}
  .info-actions .info-close{font-size:12px;padding:6px 10px}
}

/* ═══ Reduce motion on mobile for battery ══════════════════════════════ */
@media (max-width: 1000px){
  /* Waveform clip-path transition упрощаем — не тратим GPU */
  .waveform-wrap .wf-fg{transition:none}
  /* Playhead без transition — двигаем прямо в rAF */
  .wf-ph{transition:none !important}
}

/* ═══════════════════════════════════════════════════════════════════════════
   REV 3: brand logo image + dialog display fix + compact search modal
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Brand logo image (заменяет декоративный span.brand-mark) ────────────── */
.brand .brand-logo{
  width:42px;height:42px;
  display:block;
  object-fit:contain;
  border-radius:8px;
  flex-shrink:0;
}
@media(max-width:1000px){
  .brand .brand-logo{width:32px;height:32px}
}
@media(max-width:700px){
  .brand .brand-logo{width:30px;height:30px}
}

/* ── КРИТИЧЕСКИЙ FIX: dialog display только когда [open] ─────────────────── */
/* Раньше mobile-CSS ставил display:flex на dialog безусловно, из-за чего
   dialog не скрывался после .close() — оставался inline-видимым под треками. */
dialog.dj-modal{display:none}
dialog.dj-modal[open]{display:flex;flex-direction:column}

/* ── Mobile modals: SEARCH и INFO — компактные плашки (не full-screen) ──── */
@media (max-width: 1000px){
  /* Оба диалога — одинаковый компактный формат */
  dialog#info-modal.dj-modal,
  dialog#search-modal.dj-modal{
    width:min(94vw,460px);
    max-width:94vw;
    height:auto;
    max-height:88vh;
    border-radius:18px;
    border:1px solid #3a2b64;
    padding:22px 20px 20px;
    overflow-y:auto;
    /* Убираем full-screen отступы, оставляем позиционирование от dialog */
    margin:auto;
  }
  dialog#info-modal.dj-modal .close.icon,
  dialog#search-modal.dj-modal .close.icon{
    position:absolute;
    top:12px;right:12px;
    width:34px;height:34px;
    font-size:20px;
    z-index:5;
    background:rgba(15,7,40,.8);
  }

  /* Search — плашка чуть выше, чтобы поле поиска и результаты помещались */
  dialog#search-modal.dj-modal{max-height:80vh}
  dialog#search-modal .search-results{
    max-height:60vh;
    padding-right:2px;
  }
}

/* ── Backdrop dialog — совсем закрываем, тоже страдал от предыдущего бага ── */
dialog.dj-modal:not([open])::backdrop{display:none}

/* ═══ REV 4: brand logo — гарантированный fit на mobile ══════════════════ */
/* Селекторы усилены + !important чтобы перекрыть intrinsic size PNG'а
   даже когда браузер ещё не применил основной блок правил. */
header .brand img.brand-logo,
.brand img.brand-logo{
  width:42px !important;
  height:42px !important;
  max-width:42px !important;
  max-height:42px !important;
  object-fit:contain;
  border-radius:8px;
  flex-shrink:0;
  display:block;
}
@media (max-width: 1000px){
  header .brand img.brand-logo,
  .brand img.brand-logo{
    width:32px !important;
    height:32px !important;
    max-width:32px !important;
    max-height:32px !important;
  }
}
@media (max-width: 700px){
  header .brand img.brand-logo,
  .brand img.brand-logo{
    width:30px !important;
    height:30px !important;
    max-width:30px !important;
    max-height:30px !important;
  }
}
