:root { --bg:#07070f;--bg2:#0d0d1a;--bg3:#12121f; --surface:#1a1a2e;--surface2:#22223a; --border:rgba(255,255,255,0.07);--border2:rgba(255,255,255,0.12); --accent:#e8a020;--accent2:#f0b840;--accent-dark:#c07010; --accent-dim:rgba(232,160,32,0.15);--accent-glow:rgba(232,160,32,0.3); --blue:#4f8ef7;--blue-dim:rgba(79,142,247,0.15); --green:#4caf7d;--green-dim:rgba(76,175,125,0.15); --text:#f0eefc;--text2:#8888aa;--text3:#555577; --danger:#e05555; --radius:12px;--radius-sm:8px; --player-h:112px;--sidebar-w:240px; --font:'Outfit',sans-serif;--mono:'JetBrains Mono',monospace; } *,*::before,*::after{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent} *:focus{outline:none} /* App-like feel: dragging near controls must not accidentally select UI chrome (page titles, labels, buttons). Real text fields and copyable content opt back in. */ #app{-webkit-user-select:none;user-select:none} #app input,#app textarea,#app [contenteditable=true],#app .selectable, #app #np-lyrics-content,#app .lyrics-line,#app .lyrics-plain{-webkit-user-select:text;user-select:text} html,body{height:100%;font-family:var(--font);background:var(--bg);color:var(--text);overflow:hidden} /* Rollbalken: 4 px waren zwar unauffaellig, aber mit der Maus kaum zu treffen — in einer langen Playlist kam man nicht ans Ende. Jetzt 12 px Greiffläche mit einem schmalen sichtbaren Balken (durchsichtiger Rand + background-clip), wie bei Spotify. min-height haelt ihn bei sehr langen Listen greifbar, sonst schrumpft er bei 1900 Titeln auf wenige Pixel. */ ::-webkit-scrollbar{width:12px;height:12px} ::-webkit-scrollbar-track{background:transparent} ::-webkit-scrollbar-thumb{background:var(--surface2);border-radius:8px;border:3px solid transparent;background-clip:content-box;min-height:44px} ::-webkit-scrollbar-thumb:hover{background:var(--text3);background-clip:content-box} ::-webkit-scrollbar-thumb:active{background:var(--text2);background-clip:content-box} ::-webkit-scrollbar-corner{background:transparent} /* Firefox kennt die ::-webkit-Regeln nicht. Dort NUR die Farbe setzen — der Standardbalken ist ohnehin breit genug zum Greifen, "thin" wuerde ihn wieder verschmaelern. scrollbar-color wird vererbt; die Ausnahmen (.scroll-row, Lyrics, Chips) setzen weiterhin scrollbar-width:none. */ html{scrollbar-color:var(--surface2) transparent} /* ── SETUP ── */ html.ns-authed #setup-screen{display:none} #setup-screen{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:var(--bg);background-image:radial-gradient(ellipse 60% 50% at 30% 50%,rgba(232,160,32,.08) 0%,transparent 70%),radial-gradient(ellipse 40% 60% at 80% 30%,rgba(80,60,160,.1) 0%,transparent 70%)} .setup-card{width:min(420px,calc(100vw - 32px));background:var(--surface);border:1px solid var(--border2);border-radius:20px;padding:40px 36px;box-shadow:0 40px 80px rgba(0,0,0,.6),0 0 0 1px rgba(255,255,255,.04)} .setup-logo{display:flex;align-items:center;gap:12px;margin-bottom:28px} .logo-icon{width:44px;height:44px;border-radius:12px;background:linear-gradient(135deg,var(--accent),var(--accent-dark));display:flex;align-items:center;justify-content:center;font-size:20px;box-shadow:0 8px 24px var(--accent-glow)} .setup-logo h1{font-size:24px;font-weight:700;letter-spacing:-.5px} .setup-logo h1 em{color:var(--accent);font-style:normal} .setup-tabs{display:flex;gap:4px;background:var(--bg2);border-radius:8px;padding:3px;margin-bottom:24px} .setup-tab{flex:1;padding:8px;border:none;background:none;color:var(--text2);font-family:var(--font);font-size:13px;font-weight:500;border-radius:6px;cursor:pointer;transition:background .2s,color .2s} .setup-tab.active{background:var(--surface);color:var(--text)} .field{margin-bottom:14px} .field label{display:block;font-size:11px;font-weight:600;color:var(--text2);margin-bottom:5px;letter-spacing:.5px;text-transform:uppercase} .field input{width:100%;padding:11px 14px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--radius-sm);color:var(--text);font-family:var(--font);font-size:14px;outline:none;transition:border-color .2s,box-shadow .2s} .field input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-dim)} .field input::placeholder{color:var(--text3)} .field .hint{font-size:11px;color:var(--text3);margin-top:4px;line-height:1.4} .btn-primary{width:100%;margin-top:20px;padding:13px;background:linear-gradient(135deg,var(--accent),var(--accent-dark));color:#000;font-family:var(--font);font-size:15px;font-weight:700;border:none;border-radius:var(--radius-sm);cursor:pointer;transition:opacity .2s,transform .15s;letter-spacing:.2px} .btn-primary:hover{opacity:.9;transform:translateY(-1px)} .btn-primary:disabled{opacity:.5;cursor:default;transform:none} .setup-error{margin-top:12px;padding:10px 14px;background:rgba(224,85,85,.12);border:1px solid rgba(224,85,85,.3);border-radius:var(--radius-sm);color:#ff8a8a;font-size:13px;display:none} .setup-pane{display:none}.setup-pane.active{display:block} /* ── APP LAYOUT ── */ #app{display:none;height:100vh;flex-direction:column} .app-body{display:flex;flex:1;overflow:hidden} /* Spalte rechts der Seitenleiste: oben die feste Kopfzeile, darunter der Rollbereich. Frueher lag die Kopfzeile IM Rollbereich (sticky) — der Rollbalken lief dadurch bis ganz nach oben neben die Suchleiste, obwohl dort nichts rollt. */ .main-wrap{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden} /* ── SIDEBAR ── */ .sidebar{width:var(--sidebar-w);flex-shrink:0;background:var(--bg2);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden;padding-bottom:var(--player-h)} .sidebar-header{padding:18px 18px 10px;display:flex;align-items:center;justify-content:space-between} .sidebar-logo{display:flex;align-items:center;gap:9px} .sidebar-logo .icon{width:30px;height:30px;border-radius:8px;background:linear-gradient(135deg,var(--accent),var(--accent-dark));display:flex;align-items:center;justify-content:center;font-size:14px;box-shadow:0 4px 12px var(--accent-glow)} .sidebar-logo span{font-size:16px;font-weight:700} .sidebar-logo em{color:var(--accent);font-style:normal} .header-btns{display:flex;gap:4px} .hbtn{background:none;border:none;color:var(--text3);cursor:pointer;font-size:14px;padding:5px;border-radius:6px;transition:color .2s;display:flex;align-items:center} .hbtn:hover{color:var(--text)} .hbtn.danger:hover{color:var(--danger)} .search-wrap{padding:0 12px 10px} .search-box{display:flex;align-items:center;gap:8px;background:var(--bg3);border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 12px;cursor:text;transition:border-color .2s} .search-box:focus-within{border-color:var(--border2)} .search-box input{flex:1;background:none;border:none;outline:none;color:var(--text);font-family:var(--font);font-size:13px} .search-box input::placeholder{color:var(--text3)} .search-box svg{flex-shrink:0;color:var(--text3)} .header-search-wrap{flex:1;min-width:0;display:flex;align-items:center;gap:7px;background:var(--surface);border:1px solid var(--border);border-radius:20px;padding:7px 12px;cursor:text;transition:border-color .2s} .header-search-wrap:focus-within{border-color:var(--border2)} .header-search-wrap svg{flex-shrink:0;color:var(--text3)} .header-search-wrap input{flex:1;min-width:0;background:none;border:none;outline:none;color:var(--text);font-family:var(--font);font-size:14px} .header-search-wrap input::placeholder{color:var(--text3)} #header-search-overlay{position:absolute;top:100%;left:12px;right:12px;background:var(--bg);border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 32px rgba(0,0,0,.5);padding:6px 12px 16px;z-index:11;overflow-y:auto;max-height:calc(100vh - 140px)} @media(max-width:768px){#header-search-overlay{max-height:calc(100vh - var(--player-h) - 160px)}} @media(max-width:359px){#mobile-header .sidebar-logo span{display:none}} nav{flex:1;overflow-y:auto;padding:4px 10px} .nav-section{margin-bottom:18px} .nav-section-title{font-size:10px;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:var(--text3);padding:0 8px;margin-bottom:3px} .nav-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;cursor:pointer;font-size:13px;font-weight:500;color:var(--text2);transition:background .15s,color .15s;user-select:none} .nav-item:hover{background:var(--surface);color:var(--text)} .nav-item.active{background:var(--accent-dim);color:var(--accent)} .nav-item.active-blue{background:var(--blue-dim);color:var(--blue)} .nav-item svg{flex-shrink:0;width:15px;height:15px} /* ── MAIN ── */ /* Der Rollbalken gehoert zum Scrollbereich und laeuft ueber dessen ganze Hoehe. Mit padding-bottom reichte .main bis an den Fensterboden, also bis UNTER die Player-Leiste — bei 4 px fiel das nicht auf, bei 12 px schon. Deshalb endet der Scrollbereich jetzt per margin-bottom ueber der Leiste; die Platzreserve fuer den Inhalt ist damit ohnehin ueberfluessig. */ .main{flex:1;overflow-y:auto;overflow-x:hidden;margin-bottom:var(--player-h);padding-bottom:16px;background:var(--bg);background-image:radial-gradient(ellipse 80% 40% at 50% 0%,rgba(232,160,32,.04) 0%,transparent 60%)} .page{display:none;padding:24px 28px} .page.active{display:block} .page-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;flex-wrap:wrap;gap:10px} .page-title{font-size:24px;font-weight:800;letter-spacing:-.5px} .page-title em{color:var(--accent);font-style:normal} .page-title .blue{color:var(--blue)} /* ── NOTIFICATION BELL ── */ .notif-bell-btn{position:relative} .notif-badge{position:absolute;top:1px;right:1px;min-width:15px;height:15px;background:var(--accent);color:#000;border-radius:8px;font-size:9px;font-weight:700;display:flex;align-items:center;justify-content:center;padding:0 3px;pointer-events:none;line-height:1} /* ── NOTIFICATION PANEL ── */ .notif-overlay{display:none;position:fixed;inset:0;z-index:599} .notif-overlay.active{display:block} .notif-panel{position:fixed;top:12px;right:12px;width:320px;max-height:72vh;background:var(--surface);border:1px solid var(--border2);border-radius:14px;z-index:600;display:flex;flex-direction:column;box-shadow:0 8px 32px rgba(0,0,0,.5);transform:translateY(-8px) scale(.97);opacity:0;pointer-events:none;transition:opacity .18s,transform .18s} .notif-panel.open{transform:translateY(0) scale(1);opacity:1;pointer-events:all} .notif-panel-hdr{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 10px;border-bottom:1px solid var(--border);flex-shrink:0} .notif-panel-title{font-size:14px;font-weight:700} .notif-clear-btn{font-size:11px;color:var(--text3);background:none;border:none;cursor:pointer;padding:2px 6px;border-radius:4px;transition:color .15s} .notif-clear-btn:hover{color:var(--text)} .notif-list{overflow-y:auto;flex:1;padding:8px;display:flex;flex-direction:column;gap:6px} .notif-empty{font-size:13px;color:var(--text3);text-align:center;padding:28px 0} .notif-card{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:10px 12px;font-size:13px} .notif-card.unread{border-color:var(--accent-dim)} .notif-card-top{display:flex;align-items:flex-start;gap:8px} .notif-icon{font-size:15px;flex-shrink:0;margin-top:1px} .notif-info{flex:1;min-width:0} .notif-title{font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .notif-sub{font-size:11px;color:var(--text3);margin-top:1px} .notif-x{background:none;border:none;cursor:pointer;color:var(--text3);font-size:13px;padding:0;line-height:1;flex-shrink:0;transition:color .15s} .notif-x:hover{color:var(--text)} .notif-msg{font-size:12px;color:var(--text2);margin-top:6px} .notif-nav-btn{margin-top:8px;background:none;border:1px solid var(--accent-dim);border-radius:6px;color:var(--accent);font-size:12px;padding:4px 10px;cursor:pointer;transition:background .15s,color .15s} .notif-nav-btn:hover{background:var(--accent);color:#fff} .notif-failed{margin-top:6px} .notif-failed summary{font-size:11px;color:var(--accent);cursor:pointer;user-select:none} .notif-failed ul{margin:4px 0 0 14px;padding:0;font-size:11px;color:var(--text3)} .notif-failed li{margin-bottom:2px} @media(max-width:600px){.notif-panel{right:8px;left:8px;width:auto;top:60px}} /* ── HOME GREETING ── */ .home-greeting{font-size:22px;font-weight:700;color:var(--text);padding:18px 0 6px;letter-spacing:-.3px} /* ── HOME HERO ── */ .home-hero{position:relative;height:170px;border-radius:14px;overflow:hidden;margin-top:8px;background:var(--surface2);display:none} .home-hero.loaded{display:block} .home-hero-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:brightness(.45) blur(8px);transform:scale(1.08)} .home-hero-overlay{position:absolute;inset:0;background:linear-gradient(to right,rgba(7,7,15,.88) 0%,rgba(7,7,15,.3) 100%);display:flex;align-items:center;padding:16px 20px;gap:16px} .home-hero-cover{width:100px;height:100px;border-radius:9px;object-fit:cover;flex-shrink:0;box-shadow:0 6px 20px rgba(0,0,0,.55);cursor:pointer;transition:transform .2s} .home-hero-cover:hover{transform:scale(1.04)} .home-hero-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px} .home-hero-label{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--accent)} .home-hero-title{font-size:18px;font-weight:800;letter-spacing:-.4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .home-hero-artist{font-size:13px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer} .home-hero-artist:hover{color:var(--text)} .home-hero-play{width:42px;height:42px;border-radius:50%;background:var(--accent);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .15s,opacity .15s;margin-left:auto} .home-hero-play:hover{transform:scale(1.1)} @media(min-width:700px){.home-hero{height:200px}.home-hero-cover{width:130px;height:130px}.home-hero-title{font-size:22px}.home-hero-info{gap:6px}} /* ── GENRE GRID ── */ .genre-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;padding:2px 0 4px} .genre-card{display:flex;align-items:center;gap:10px;background:var(--surface2);border:1px solid var(--border);border-radius:10px;padding:10px 12px;cursor:pointer;transition:background .15s,border-color .15s;overflow:hidden} .genre-card:hover{background:var(--surface3,var(--surface));border-color:var(--accent)} .genre-card-bar{width:4px;height:32px;border-radius:3px;flex-shrink:0} .genre-card-name{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0} .genre-card-play{width:28px;height:28px;border-radius:50%;background:var(--accent);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;opacity:0;transition:opacity .15s,transform .15s} .genre-card:hover .genre-card-play{opacity:1} .genre-card-play:hover{transform:scale(1.1)} @media(max-width:600px){.genre-card-play{opacity:1}} @media(min-width:700px){.genre-grid{grid-template-columns:repeat(auto-fill,minmax(170px,1fr))}} /* ── SECTION ── */ .section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;margin-top:24px} .section-title{font-size:16px;font-weight:700} .section-more{font-size:12px;color:var(--text2);cursor:pointer;transition:color .15s} .section-more:hover{color:var(--accent)} /* ── GRID ── */ .grid{display:grid;gap:14px} .grid-4{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))} .scroll-row{display:flex;gap:12px;overflow-x:auto;padding-bottom:8px;scrollbar-width:none} .scroll-row::-webkit-scrollbar{display:none} .scroll-row .card{flex-shrink:0;width:145px} /* Hover arrows for horizontal rows (desktop) — only the scrollable direction shows */ .scroll-row-wrap{position:relative} .scroll-arrow{ position:absolute;top:72px;transform:translateY(-50%); width:38px;height:38px;border-radius:50%; display:flex;align-items:center;justify-content:center; background:rgba(15,15,24,.82);color:#fff;border:1px solid rgba(255,255,255,.14); cursor:pointer;z-index:6;opacity:0;pointer-events:none; transition:opacity .16s ease,background .16s ease; -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px); box-shadow:0 4px 14px rgba(0,0,0,.35); } .scroll-arrow svg{width:18px;height:18px} .scroll-arrow.sa-left{left:-6px} .scroll-arrow.sa-right{right:-6px} .scroll-arrow:hover{background:rgba(30,30,46,.95)} .scroll-row-wrap:hover .scroll-arrow.can-scroll{opacity:1;pointer-events:auto} /* ── CARDS ── */ .card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;cursor:pointer;transition:transform .2s,box-shadow .2s,border-color .2s} .card:hover{transform:translateY(-3px);box-shadow:0 12px 32px rgba(0,0,0,.4);border-color:var(--border2)} .card-art{aspect-ratio:1;background:var(--surface2);position:relative;overflow:hidden} .card-art img{width:100%;height:100%;object-fit:cover;transition:transform .4s} .card:hover .card-art img{transform:scale(1.05)} .card-art .no-art{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:34px;color:var(--text3);background:linear-gradient(135deg,var(--surface2),var(--bg3))} .card-art .play-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45);opacity:0;transition:opacity .2s;gap:8px} .card:hover .play-overlay{opacity:1} .play-btn{width:40px;height:40px;border-radius:50%;background:var(--accent);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transform:scale(.8);transition:transform .2s;box-shadow:0 4px 16px rgba(0,0,0,.5)} .card:hover .play-btn{transform:scale(1)} .play-btn svg{color:#000} .dl-btn-overlay{width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.15);border:1px solid rgba(255,255,255,.3);cursor:pointer;display:flex;align-items:center;justify-content:center;transform:scale(.8);transition:transform .2s,background .2s;backdrop-filter:blur(4px)} .card:hover .dl-btn-overlay{transform:scale(1)} .dl-btn-overlay:hover{background:rgba(255,255,255,.3)} .dl-btn-overlay svg{color:#fff} .card-info{padding:10px} .card-title{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .card-sub{font-size:11px;color:var(--text2);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} /* ── BADGES ── */ .badge{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:600;padding:3px 8px;border-radius:20px;letter-spacing:.3px} .badge-new{background:var(--blue-dim);color:var(--blue)} .badge-deezer{background:rgba(252,100,100,.12);color:#fc6464} .badge-local{background:var(--green-dim);color:var(--green)} /* ── GLOBAL SEARCH RESULTS ── */ .gtrack-item{display:grid;grid-template-columns:28px 52px 1fr auto;gap:12px;align-items:center;padding:8px 12px;border-radius:9px;cursor:pointer;transition:background .15s} .gtrack-num{font-size:12px;color:var(--text3);text-align:right;font-variant-numeric:tabular-nums} .gtrack-item:hover{background:var(--surface)} .gtrack-art{width:52px;height:52px;border-radius:6px;overflow:hidden;background:var(--surface2);flex-shrink:0} .gtrack-art img{width:100%;height:100%;object-fit:cover} .gtrack-info .gtrack-title{font-size:14px;font-weight:600;display:flex;align-items:center;gap:5px} .explicit-badge{display:inline-flex;align-items:center;justify-content:center;font-size:8px;font-weight:800;width:13px;height:13px;border-radius:2px;background:var(--text3);color:var(--bg);flex-shrink:0;letter-spacing:0} .gtrack-info .gtrack-sub{font-size:12px;color:var(--text2);margin-top:2px} .gtrack-actions{display:flex;align-items:center;gap:6px;opacity:0;transition:opacity .15s} .gtrack-item:hover .gtrack-actions{opacity:1} button:focus{outline:none} /* ── ICON BTN ── */ .icon-btn{background:none;border:none;color:var(--text2);cursor:pointer;padding:6px;border-radius:6px;display:flex;align-items:center;transition:color .15s,background .15s} .icon-btn:hover{color:var(--accent);background:var(--accent-dim)} .icon-btn.starred{color:var(--accent)} .icon-btn.blue:hover{color:var(--blue);background:var(--blue-dim)} .icon-btn.green:hover{color:var(--green);background:var(--green-dim)} /* ── SONG LIST ── */ .song-list{display:flex;flex-direction:column;gap:2px} .song-item{display:grid;grid-template-columns:32px 44px 1fr auto;align-items:center;gap:10px;padding:6px 10px;border-radius:8px;cursor:pointer;transition:background .15s} .song-thumb{width:44px;height:44px;border-radius:6px;overflow:hidden;background:var(--surface2);flex-shrink:0} .song-thumb img{width:100%;height:100%;object-fit:cover} .song-thumb .no-art{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--text3)} .song-item:hover{background:var(--surface)} .song-item.playing{background:var(--accent-dim)} .song-item.playing .song-title{color:var(--accent)} .song-num{font-size:12px;color:var(--text3);text-align:center;font-family:var(--mono)} .song-item.playing .song-num{color:var(--accent)} .song-info .song-title{font-size:13px;font-weight:500}.song-link{cursor:pointer;transition:color .15s}.song-link:hover{color:var(--accent);text-decoration:underline} .song-info .song-artist{font-size:11px;color:var(--text2);margin-top:1px} .song-meta{display:flex;align-items:center;gap:6px} .song-dur{font-size:11px;color:var(--text3);font-family:var(--mono)} .song-plays{font-size:11px;color:var(--text3);font-family:var(--mono);min-width:28px;text-align:right} .song-plays-x{font-size:9px;opacity:.6;margin-left:1px} .song-actions{display:flex;gap:2px} /* ── PLAYLIST DRAG & DROP ── */ .song-list.pl-draggable .song-item{grid-template-columns:18px 32px 44px 1fr auto} .pl-drag-handle{display:flex;align-items:center;justify-content:center;color:var(--text3);opacity:0;cursor:grab;transition:opacity .15s;touch-action:none} .song-list.pl-draggable .pl-drag-handle{opacity:1} .pl-drag-handle:active{cursor:grabbing} .pl-reorder-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--surface);border-radius:10px;margin-bottom:8px;font-size:13px;color:var(--text2);gap:10px} .song-item.dragging{opacity:0.35} .song-item.drag-over{box-shadow:0 -2px 0 var(--accent)} /* ── ALBUM DETAIL ── */ .back-btn{background:none;border:none;color:var(--text2);cursor:pointer;display:flex;align-items:center;gap:6px;font-family:var(--font);font-size:12px;padding:6px 0;margin-bottom:16px;transition:color .15s} .back-btn:hover{color:var(--text)} .album-header{display:flex;gap:24px;align-items:flex-end;margin-bottom:28px} .album-cover{width:170px;height:170px;border-radius:12px;background:var(--surface2);flex-shrink:0;overflow:hidden;box-shadow:0 16px 48px rgba(0,0,0,.5)} .album-cover img{width:100%;height:100%;object-fit:cover} .album-cover .no-art{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:50px} .album-type{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--text2);margin-bottom:5px} .album-name{font-size:28px;font-weight:800;letter-spacing:-1px;margin-bottom:5px;line-height:1.1} .album-artist-name{font-size:15px;font-weight:600;color:var(--text);margin-bottom:10px} /* Der Künstler ging unter dem 28px-Albumtitel in --text2 (#8888aa) unter und sah nach nichts Anklickbarem aus. Jetzt hell und halbfett; wo wirklich ein Ziel dahintersteht, zusätzlich unterstrichen (lokal: .song-link-Spans, Deezer: .is-link). */ .album-artist-name .song-link,.album-artist-name.is-link{ cursor:pointer;text-decoration:underline;text-decoration-color:var(--text3); text-underline-offset:3px;transition:color .15s,text-decoration-color .15s} .album-artist-name .song-link:hover,.album-artist-name.is-link:hover{ color:var(--accent);text-decoration-color:var(--accent)} .album-stats{font-size:12px;color:var(--text3)} /* Inline-Albumkopf in der globalen Suche — gleiche Lesbarkeit auf kleinerem Raum. */ .dz-inline-artist{font-size:13px;font-weight:600;color:var(--text)} .dz-inline-artist.song-link{text-decoration:underline;text-decoration-color:var(--text3); text-underline-offset:3px} .dz-inline-artist.song-link:hover{color:var(--accent);text-decoration-color:var(--accent)} .playlist-detail-desc{font-size:13px;color:var(--text2);line-height:1.5;margin-top:6px;max-width:480px} .album-actions{display:flex;gap:8px;margin-top:16px;flex-wrap:wrap} /* Markiert: gefuelltes Herz in Akzentfarbe — gilt fuer den Album-Knopf und den Folgen-Knopf auf der Kuenstlerseite. */ .btn-outline.is-starred,.artist-action-btn.is-starred{color:var(--accent);border-color:var(--accent)} .artist-follow-btn.is-starred{color:var(--accent);border-color:var(--accent)} .btn-play-all{display:flex;align-items:center;gap:7px;padding:10px 20px;border-radius:25px;background:var(--accent);color:#000;border:none;font-family:var(--font);font-size:13px;font-weight:700;cursor:pointer;transition:opacity .15s,transform .15s} .btn-play-all:hover{opacity:.9;transform:scale(1.02)} .btn-outline{display:flex;align-items:center;gap:7px;padding:10px 18px;border-radius:25px;background:var(--surface);border:1px solid var(--border2);color:var(--text);font-family:var(--font);font-size:13px;font-weight:600;cursor:pointer;transition:background .15s} .btn-outline:hover{background:var(--surface2)} .btn-outline.blue{border-color:rgba(79,142,247,.4);color:var(--blue)} .btn-outline.blue:hover{background:var(--blue-dim)} /* ── PLAYER ── */ .player{position:fixed;bottom:0;left:0;right:0;height:var(--player-h);background:rgba(8,8,20,.93);backdrop-filter:blur(28px);border-top:1px solid var(--border2);display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:0;padding:0 20px;z-index:100;will-change:transform} .player-drag-handle{position:absolute;top:5px;left:50%;transform:translateX(-50%);width:32px;height:3px;border-radius:2px;background:rgba(255,255,255,.18);transition:background .2s,width .2s;pointer-events:none} .player.dragging .player-drag-handle{background:rgba(255,255,255,.45);width:44px} .player-track{min-width:0;display:flex;align-items:center;gap:10px;overflow:visible;align-self:stretch} .player-art{width:52px;height:52px;border-radius:50%;background:var(--surface2);flex-shrink:0;overflow:hidden;position:relative;box-shadow:0 0 0 2px var(--surface2),0 0 0 4px rgba(255,255,255,.08)} .player-art img{width:100%;height:100%;object-fit:cover;border-radius:50%} .player-art .no-art{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:20px;color:var(--text3)} .player-art.spinning img{animation:spin 8s linear infinite} /* Vinyl centre dot */ .player-art::after{content:'';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:8px;height:8px;border-radius:50%;background:var(--bg);box-shadow:0 0 0 2px rgba(255,255,255,.15);pointer-events:none;opacity:0;transition:opacity .3s} .player-art.spinning::after{opacity:1} @keyframes spin{to{transform:rotate(360deg)}} .player-info-wrap{display:flex;align-items:center;gap:8px;min-width:0} .player-info{min-width:0;display:flex;flex-direction:column;justify-content:center} .player-title{font-size:13px;font-weight:600;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .15s;margin-bottom:2px} #player-artist-name{color:var(--accent)} #player-artist-name span:hover{color:var(--accent)} #player-album-name{color:var(--text3)} #player-album-name:hover{color:var(--accent)} /* NP action sheet */ .np-sheet-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:400;opacity:0;pointer-events:none;transition:opacity .25s;backdrop-filter:blur(2px)} .np-sheet-overlay.open{opacity:1;pointer-events:all} .np-sheet{position:fixed;bottom:0;left:0;right:0;background:var(--surface);border-radius:20px 20px 0 0;padding:16px 0 max(24px,env(safe-area-inset-bottom));z-index:401;transform:translateY(100%);transition:transform .3s cubic-bezier(.32,.72,0,1)} .np-sheet.open{transform:translateY(0)} .np-sheet-handle{width:36px;height:4px;background:var(--surface2);border-radius:2px;margin:0 auto 16px} .np-sheet-song{display:flex;align-items:center;gap:12px;padding:0 20px 16px;border-bottom:1px solid var(--border)} .np-sheet-song .thumb{width:44px;height:44px;border-radius:8px;overflow:hidden;background:var(--surface2);flex-shrink:0} .np-sheet-song .thumb img{width:100%;height:100%;object-fit:cover} .np-sheet-song .title{font-size:14px;font-weight:600} .np-sheet-song .sub{font-size:12px;color:var(--text2);margin-top:2px} .np-sheet-item{display:flex;align-items:center;gap:14px;padding:13px 20px;cursor:pointer;transition:background .12s;font-size:14px;font-weight:500} .np-sheet-item:hover{background:var(--surface2)} .np-sheet-item svg{color:var(--text2);flex-shrink:0} .np-sheet-item.danger{color:var(--danger)} .np-sheet-item.danger svg{color:var(--danger)} .player-artist{font-size:11px;color:var(--text2);margin-top:0;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .player-artist+.player-artist{margin-top:4px} .player-badge{display:inline-block;font-size:9px;font-weight:700;padding:1px 5px;border-radius:3px;margin-left:5px;vertical-align:middle} .player-controls{display:flex;flex-direction:column;align-items:center;gap:7px;width:520px;padding:0 24px} .ctrl-buttons{display:flex;align-items:center;gap:10px} .ctrl-btn{background:none;border:none;color:var(--text2);cursor:pointer;padding:5px;border-radius:7px;display:flex;align-items:center;transition:color .15s} #btn-repeat{position:relative} #btn-repeat.repeat-one::after,#np-repeat-btn.repeat-one::after{content:'1';position:absolute;top:1px;right:1px;font-size:7px;font-weight:700;line-height:11px;text-align:center;width:11px;height:11px;border-radius:50%;background:var(--accent);color:#000;pointer-events:none}#np-repeat-btn{position:relative} .ctrl-btn:hover{color:var(--text)} .ctrl-btn.active{color:var(--accent)} .play-pause-btn{width:38px;height:38px;border-radius:50%;background:var(--accent);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .15s,background .15s;box-shadow:0 0 18px var(--accent-glow)} .play-pause-btn:hover{transform:scale(1.08);background:var(--accent2)} .play-pause-btn svg{color:#000} .progress-bar-wrap{width:100%;display:flex;align-items:center;gap:7px} .progress-time{font-size:10px;color:var(--text3);font-family:var(--mono);min-width:32px} .progress-time.right{text-align:right} .progress-bar{flex:1;height:6px;background:var(--surface2);border-radius:3px;cursor:pointer;position:relative} .progress-fill{height:100%;background:var(--accent);border-radius:3px;width:0%;transition:width .1s linear;position:relative} .progress-fill::after{content:'';position:absolute;right:-7px;top:50%;transform:translateY(-50%);width:14px;height:14px;border-radius:50%;background:var(--accent2);opacity:0;transition:opacity .15s;box-shadow:0 0 6px var(--accent-glow)} .progress-bar:hover .progress-fill::after{opacity:1} .player-right{display:flex;align-items:center;justify-content:flex-end;gap:6px} .volume-wrap{display:flex;align-items:center;gap:7px} .volume-slider{width:72px;height:3px;background:var(--surface2);border-radius:2px;cursor:pointer;appearance:none;-webkit-appearance:none;outline:none} .volume-slider::-webkit-slider-thumb{-webkit-appearance:none;width:11px;height:11px;border-radius:50%;background:var(--accent);cursor:pointer} /* ── PREVIEW BAR ── */ .preview-bar{position:fixed;bottom:var(--player-h);left:0;right:0;background:rgba(15,15,35,.95);backdrop-filter:blur(16px);border-top:1px solid var(--blue);padding:10px 20px;display:flex;align-items:center;gap:14px;z-index:99;transform:translateY(100%);transition:transform .3s;font-size:13px} .preview-bar.visible{transform:translateY(0)} .preview-info{flex:1;min-width:0} .preview-title{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .preview-sub{font-size:11px;color:var(--text2);margin-top:2px} .preview-badge{font-size:10px;font-weight:700;color:var(--blue);background:var(--blue-dim);padding:2px 6px;border-radius:4px;margin-left:6px} .preview-prog{flex:1;height:2px;background:var(--surface2);border-radius:2px;overflow:hidden;max-width:200px} .preview-fill{height:100%;background:var(--blue);border-radius:2px;width:0%;transition:width .5s linear} .preview-close{background:none;border:none;color:var(--text3);cursor:pointer;font-size:18px;line-height:1;padding:2px 6px;border-radius:4px;transition:color .15s} .preview-close:hover{color:var(--text)} /* ── QUEUE PANEL ── */ .queue-panel{position:fixed;right:0;top:0;bottom:var(--player-h);width:290px;background:var(--bg2);border-left:1px solid var(--border);transform:translateX(100%);transition:transform .3s;z-index:90;display:flex;flex-direction:column;padding:18px 0} .queue-panel.open{transform:translateX(0)} .queue-head{display:flex;align-items:center;gap:8px;padding:0 10px 14px 18px;border-bottom:1px solid var(--border)} .queue-title{font-size:15px;font-weight:700;flex:1;min-width:0} .queue-close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;color:var(--text2);border-radius:8px;cursor:pointer;transition:background .15s,color .15s} .queue-close:hover{background:var(--surface);color:var(--text)} .queue-list{flex:1;overflow-y:auto;padding:6px 10px} .queue-item{display:flex;align-items:center;gap:9px;padding:7px 8px;border-radius:7px;cursor:pointer;transition:background .15s} .queue-item:hover{background:var(--surface)} .queue-item.active{background:var(--accent-dim)} .queue-item.active .qi-title{color:var(--accent)} .qi-idx{font-size:10px;color:var(--text3);width:16px;text-align:center;flex-shrink:0;font-family:var(--mono)} .qi-art{width:34px;height:34px;border-radius:5px;overflow:hidden;background:var(--surface2);flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--text3)} .qi-art img{width:100%;height:100%;object-fit:cover} .qi-info{flex:1;min-width:0} .qi-title{font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .qi-artist{font-size:10px;color:var(--text2)} /* ── DOWNLOAD MODAL ── */ .modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.7);backdrop-filter:blur(4px);z-index:200;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .2s} .modal-overlay.open{opacity:1;pointer-events:all} .modal{width:min(460px,calc(100vw - 32px));background:var(--surface);border:1px solid var(--border2);border-radius:18px;padding:28px;box-shadow:0 40px 80px rgba(0,0,0,.7)} .modal h2{font-size:18px;font-weight:700;margin-bottom:6px} .modal .modal-sub{font-size:13px;color:var(--text2);margin-bottom:20px;line-height:1.5} .modal-art{width:64px;height:64px;border-radius:8px;overflow:hidden;background:var(--surface2);flex-shrink:0} .modal-art img{width:100%;height:100%;object-fit:cover} .modal-track-info{display:flex;gap:14px;align-items:center;padding:14px;background:var(--bg2);border-radius:10px;margin-bottom:18px} .mti-name{font-size:14px;font-weight:600} .mti-sub{font-size:12px;color:var(--text2);margin-top:3px} .modal-opts{display:flex;flex-direction:column;gap:8px;margin-bottom:20px} .modal-opt{display:flex;align-items:center;gap:10px;padding:12px 14px;background:var(--bg2);border:1px solid var(--border);border-radius:9px;cursor:pointer;transition:border-color .2s,background .2s} .modal-opt:hover{border-color:var(--border2);background:var(--bg3)} .modal-opt.selected{border-color:var(--blue);background:var(--blue-dim)} .modal-opt svg{color:var(--text2)} .modal-opt.selected svg{color:var(--blue)} .opt-label{font-size:13px;font-weight:600} .opt-sub{font-size:11px;color:var(--text2);margin-top:2px} .modal-disclaimer{font-size:11px;color:var(--text3);line-height:1.5;padding:10px 12px;background:var(--bg3);border-radius:7px;margin-bottom:16px} .modal-btns{display:flex;gap:8px} .modal-btns button{flex:1;padding:12px;border-radius:9px;font-family:var(--font);font-size:14px;font-weight:600;cursor:pointer;border:none;transition:opacity .15s} .btn-cancel{background:var(--surface2);color:var(--text2)} .btn-cancel:hover{opacity:.8} .btn-download{background:linear-gradient(135deg,var(--blue),#2d6ad4);color:#fff} .btn-download:hover{opacity:.9} .btn-download:disabled{opacity:.5;cursor:default} /* ── DOWNLOAD JOBS ── */ .jobs-panel{position:fixed;bottom:calc(var(--player-h) + 16px);right:20px;width:310px;display:flex;flex-direction:column;gap:8px;z-index:150} .job-card{background:var(--surface);border:1px solid var(--border2);border-radius:10px;padding:12px 14px;box-shadow:0 8px 24px rgba(0,0,0,.4);animation:slideUp .25s ease} @keyframes slideUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}} .job-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px} .job-title{font-size:12px;font-weight:600;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .job-status{font-size:10px;color:var(--text2)} .job-bar{height:3px;background:var(--surface2);border-radius:2px;overflow:hidden} .job-fill{height:100%;background:linear-gradient(90deg,var(--blue),var(--accent));border-radius:2px;width:0%;transition:width .4s ease} .job-fill.done{background:var(--green);width:100%!important} .job-fill.error{background:var(--danger);width:100%!important} .job-sub{font-size:10px;color:var(--text3);margin-top:5px} /* ── RECOMMENDATIONS ── */ .reco-grid{display:flex;flex-direction:column;gap:3px;margin-bottom:24px} .reco-artist-chip{display:inline-flex;align-items:center;gap:7px;padding:7px 12px;background:var(--surface);border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:13px;font-weight:500;transition:border-color .2s,background .2s;margin:3px} .reco-artist-chip:hover{border-color:var(--blue);background:var(--blue-dim);color:var(--blue)} /* ── CONTEXT MENU ── */ .ctx-menu{position:fixed;background:var(--surface);border:1px solid var(--border2);border-radius:10px;padding:5px;z-index:500;min-width:200px;box-shadow:0 16px 40px rgba(0,0,0,.6);animation:ctxIn .12s ease} @keyframes ctxIn{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}} .ctx-item{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:7px;cursor:pointer;font-size:13px;font-weight:500;color:var(--text);transition:background .12s} .ctx-item:hover{background:var(--surface2)} .ctx-item.danger{color:var(--danger)} .ctx-item.danger:hover{background:rgba(224,85,85,.12)} .ctx-item svg{flex-shrink:0;color:var(--text2)} .ctx-item:hover svg{color:inherit} .ctx-separator{height:1px;background:var(--border);margin:4px 0} .ctx-submenu-wrap{position:relative} .ctx-submenu{position:absolute;left:100%;top:0;background:var(--surface);border:1px solid var(--border2);border-radius:10px;padding:5px;min-width:180px;max-height:260px;overflow-y:auto;box-shadow:0 16px 40px rgba(0,0,0,.6);display:none;z-index:501} .ctx-submenu-wrap:hover .ctx-submenu{display:block} .ctx-submenu .ctx-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis} /* ── PLAYLIST CREATE / ADD MODAL ── */ .pl-modal{position:fixed;inset:0;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);z-index:400;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .2s} .pl-modal.open{opacity:1;pointer-events:all} .pl-modal .inner{width:min(380px,calc(100vw - 32px));background:var(--surface);border:1px solid var(--border2);border-radius:16px;padding:24px;box-shadow:0 32px 64px rgba(0,0,0,.7)} .pl-modal h3{font-size:17px;font-weight:700;margin-bottom:16px} .pl-list{display:flex;flex-direction:column;gap:4px;max-height:240px;overflow-y:auto;margin-bottom:14px} .pl-row{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:8px;cursor:pointer;transition:background .12s;font-size:13px;font-weight:500} .pl-row:hover{background:var(--surface2)} .pl-row svg{color:var(--text2);flex-shrink:0} .pl-new-row{border-top:1px solid var(--border);margin-top:6px;padding-top:10px} .pl-input{width:100%;padding:9px 12px;background:var(--bg2);border:1px solid var(--border2);border-radius:8px;color:var(--text);font-family:var(--font);font-size:13px;outline:none;margin-bottom:10px;transition:border-color .2s} .pl-input:focus{border-color:var(--accent)} .pl-btns{display:flex;gap:8px} .pl-btns button{flex:1;padding:10px;border-radius:8px;font-family:var(--font);font-size:13px;font-weight:600;cursor:pointer;border:none} /* ── EDIT PLAYLIST MODAL ── */ .edit-pl-overlay{position:fixed;inset:0;background:rgba(0,0,0,.8);z-index:500;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .2s} .edit-pl-overlay.open{opacity:1;pointer-events:all} .edit-pl-box{width:min(580px,calc(100vw - 24px));background:var(--surface);border:1px solid var(--border2);border-radius:18px;box-shadow:0 40px 80px rgba(0,0,0,.8);overflow:hidden} .edit-pl-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 16px;font-size:18px;font-weight:700;border-bottom:1px solid var(--border)} .edit-pl-close{background:none;border:none;color:var(--text2);cursor:pointer;padding:4px;display:flex;border-radius:6px;transition:color .15s} .edit-pl-close:hover{color:var(--text)} .edit-pl-body{display:flex;gap:24px;padding:24px;align-items:flex-start} .edit-pl-cover-wrap{position:relative;flex-shrink:0;width:180px;height:180px;border-radius:12px;overflow:hidden;background:var(--surface2)} .edit-pl-cover{width:100%;height:100%} .edit-pl-cover img{width:100%;height:100%;object-fit:cover;display:block} .edit-pl-cover-actions{position:absolute;bottom:8px;right:8px;display:flex;gap:6px;opacity:0;transition:opacity .2s} .edit-pl-cover-wrap:hover .edit-pl-cover-actions{opacity:1} .edit-pl-cover-actions{opacity:1} .edit-pl-cover-btn{width:34px;height:34px;background:rgba(0,0,0,.65);border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;backdrop-filter:blur(4px);transition:background .15s} .edit-pl-cover-btn:hover{background:rgba(0,0,0,.85)} .edit-pl-fields{flex:1;min-width:0;display:flex;flex-direction:column;gap:14px} .edit-pl-label{font-size:12px;font-weight:600;color:var(--text2);text-transform:uppercase;letter-spacing:.05em;margin-bottom:-8px} .edit-pl-input{width:100%;padding:10px 13px;background:var(--bg2);border:1px solid var(--border2);border-radius:9px;color:var(--text);font-family:var(--font);font-size:14px;outline:none;transition:border-color .2s;box-sizing:border-box} .edit-pl-input:focus{border-color:var(--accent)} .edit-pl-textarea{resize:vertical;min-height:72px;line-height:1.5} .edit-pl-toggle-row{display:flex;align-items:center;justify-content:space-between;padding:4px 0} .edit-pl-toggle-row span{font-size:14px;font-weight:500} .edit-pl-footer{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:16px 24px;border-top:1px solid var(--border)} .edit-pl-btn-delete{padding:10px 18px;border-radius:9px;border:1px solid var(--danger);background:none;color:var(--danger);font-family:var(--font);font-size:14px;font-weight:600;cursor:pointer;transition:background .15s,color .15s} .edit-pl-btn-delete:hover{background:rgba(224,85,85,.12)} .edit-pl-btn-cancel{padding:10px 20px;border-radius:9px;border:none;background:none;color:var(--text2);font-family:var(--font);font-size:14px;font-weight:600;cursor:pointer;transition:color .15s} .edit-pl-btn-cancel:hover{color:var(--text)} .edit-pl-btn-save{padding:10px 22px;border-radius:9px;border:none;background:var(--accent);color:#000;font-family:var(--font);font-size:14px;font-weight:700;cursor:pointer;transition:opacity .15s} .edit-pl-btn-save:hover{opacity:.85} .confirm-box{width:min(380px,calc(100vw - 24px));background:var(--surface);border:1px solid var(--border2);border-radius:18px;box-shadow:0 40px 80px rgba(0,0,0,.8);padding:28px 28px 20px} .confirm-title{font-size:17px;font-weight:700;margin-bottom:10px} .confirm-msg{font-size:14px;color:var(--text2);line-height:1.5;margin-bottom:24px} .confirm-footer{display:flex;justify-content:flex-end;gap:10px} @media(max-width:480px){ .edit-pl-body{flex-direction:column;align-items:center} .edit-pl-cover-wrap{width:140px;height:140px} .edit-pl-footer{flex-wrap:wrap;padding:12px 16px;gap:8px} .edit-pl-footer>div{margin-left:auto} } /* ── SONG INFO MODAL ── */ .info-modal{position:fixed;inset:0;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);z-index:400;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .2s} .info-modal.open{opacity:1;pointer-events:all} .info-modal .inner{width:min(420px,calc(100vw - 32px));max-height:calc(100vh - 48px);background:var(--surface);border:1px solid var(--border2);border-radius:16px;padding:0;overflow-y:auto;box-shadow:0 32px 64px rgba(0,0,0,.7)} .info-header{display:flex;gap:16px;padding:20px;background:var(--bg2)} .info-cover{width:80px;height:80px;border-radius:8px;overflow:hidden;background:var(--surface2);flex-shrink:0} .info-cover img{width:100%;height:100%;object-fit:cover} .info-top-title{font-size:18px;font-weight:800;margin-bottom:4px} .info-top-sub{font-size:13px;color:var(--text2)} .info-rows{padding:16px 20px;display:flex;flex-direction:column;gap:10px} .info-row{display:flex;justify-content:space-between;align-items:baseline;font-size:13px;border-bottom:1px solid var(--border);padding-bottom:8px} .info-row:last-child{border:none;padding:0} .info-label{color:var(--text2);font-weight:500;min-width:90px} .info-val{color:var(--text);text-align:right;word-break:break-all} .info-close{display:block;width:calc(100% - 40px);margin:0 20px 20px;padding:11px;border-radius:9px;background:var(--surface2);border:none;font-family:var(--font);font-size:14px;font-weight:600;color:var(--text);cursor:pointer} .info-close:hover{background:var(--surface)} .info-edit-toggle{background:none;border:none;color:var(--text2);cursor:pointer;padding:4px;border-radius:6px;display:flex;align-items:center;flex-shrink:0;align-self:flex-start;margin-top:2px} .info-edit-toggle:hover,.info-edit-toggle.active{color:var(--accent)} .info-edit-art-row{display:flex;align-items:center;gap:12px;padding:0 20px 12px} .info-edit-art-wrap{display:flex;flex-direction:column;align-items:center;gap:6px} .info-edit-art-preview{width:72px;height:72px;border-radius:8px;overflow:hidden;background:var(--surface2);flex-shrink:0} .info-edit-art-btn{font-size:11px;color:var(--text2);background:var(--surface2);border:none;border-radius:6px;padding:4px 8px;cursor:pointer;display:flex;align-items:center;gap:4px;font-family:var(--font)} .info-edit-art-btn:hover{color:var(--text)} .info-edit-fields{display:flex;flex-direction:column;gap:8px;padding:0 20px 4px} .ie-sort-details{padding:0 20px 4px;font-size:11px;color:var(--text3)}.ie-sort-details summary{cursor:pointer;font-weight:500;color:var(--text2);padding:4px 0;list-style:none;display:flex;align-items:center;gap:6px;user-select:none}.ie-sort-details summary::before{content:'▶';font-size:9px;transition:transform .15s}.ie-sort-details[open] summary::before{transform:rotate(90deg)}.ie-sort-details .info-edit-fields{padding:0} .info-edit-label{display:flex;flex-direction:column;font-size:11px;color:var(--text3);gap:3px;font-weight:500} .info-edit-hint{font-size:10px;color:var(--text3);font-weight:400;opacity:.7;margin-top:-1px} .info-edit-hint code{background:var(--surface3,var(--surface2));border-radius:3px;padding:0 3px;font-size:10px;font-family:monospace;opacity:.9} .info-edit-input{background:var(--surface2);border:1px solid var(--border2);border-radius:7px;color:var(--text);font-family:var(--font);font-size:13px;padding:7px 10px;outline:none;width:100%;box-sizing:border-box} .info-edit-input:focus{border-color:var(--accent)} /* ── BOTTOM NAV (PWA Mobile) ── */ .bottom-nav{ display:none; position:fixed;bottom:0;left:0;right:0; height:80px; background:rgba(8,8,20,.97); backdrop-filter:blur(28px); border-top:1px solid var(--border2); z-index:200; padding-bottom:env(safe-area-inset-bottom); } .bottom-nav-inner{ display:flex;flex-direction:column;align-items:stretch; height:100%;width:100%; } .bnav-item{ flex:1 1 0; /* ← sorgt für gleich breite Buttons */ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px; padding:6px 4px; border-radius:10px; cursor:pointer; font-size:10px; font-weight:600; color:var(--text3); letter-spacing:.3px; text-align:center; min-width:0; transition:color .15s,background .15s; border:none; background:none; font-family:var(--font); -webkit-tap-highlight-color:transparent; } .bnav-item.active{color:var(--accent)} .bnav-item.active svg{filter:drop-shadow(0 0 6px var(--accent-glow))} .bnav-item.active-blue{color:var(--blue)} .bnav-item svg{flex-shrink:0;transition:transform .15s} .bnav-item:active svg{transform:scale(.88)} /* Tab strip */ .bnav-tabs{display:flex;width:100%;padding:4px 8px 2px;flex-shrink:0;gap:4px} .bnav-tab{flex:1;padding:3px 0;border-radius:7px;border:none;font-family:var(--font);font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--text3);cursor:pointer;background:none;transition:color .15s,background .15s;-webkit-tap-highlight-color:transparent} .bnav-tab.active{background:var(--surface2);color:var(--text)} .bnav-pages{display:flex;align-items:center;width:100%;flex:1} @media(max-width:768px){ .bottom-nav{display:flex;flex-direction:column;justify-content:flex-start} /* player sits above bottom nav */ .player{bottom:80px} /* Scrollbereich endet ueber Player UND unterer Leiste — siehe Kommentar bei .main */ .main{margin-bottom:calc(var(--player-h) + 80px + env(safe-area-inset-bottom));padding-bottom:16px} .page{padding-bottom:24px} .queue-panel{bottom:calc(var(--player-h) + 80px)} .preview-bar{bottom:calc(var(--player-h) + 80px)} .toast-container{bottom:calc(var(--player-h) + 80px + 16px)} .jobs-panel{bottom:calc(var(--player-h) + 80px + 16px)} .bnav-item{padding:6px 2px;box-sizing:border-box} #settings-modal{align-items:flex-start;padding-top:max(env(safe-area-inset-top),16px);padding-bottom:calc(80px + env(safe-area-inset-bottom))} #settings-modal .modal{max-height:100%!important;overflow:hidden} } /* ── NOW PLAYING FULL SCREEN ── */ .np-overlay{ position:fixed;inset:0;z-index:300; display:flex;flex-direction:column; background:var(--bg); transform:translate3d(0,100%,0); -webkit-transform:translate3d(0,100%,0); transition:transform .35s cubic-bezier(.4,0,.2,1); overflow:hidden; backface-visibility:hidden;-webkit-backface-visibility:hidden; isolation:isolate; } /* Solid opaque floor so no frame can ever be transparent to content below */ .np-overlay::before{ content:'';position:absolute;inset:0; background:inherit;z-index:-1; transform:translateZ(0); pointer-events:none; } .np-overlay.open{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)} /* Blurred album art as background — two layers for crossfade */ .np-bg{ position:absolute;inset:-40px; background-size:cover;background-position:center; filter:blur(60px) brightness(.35) saturate(1.4); transform:scale(1.1); transition:opacity .55s ease; will-change:opacity; z-index:0; } /* Solid cover-color mode: hide blurred layers, use extracted color as background */ .np-overlay.dynamic-color{background:rgb(var(--np-solid,20,20,40));transition:background .5s ease,transform .35s cubic-bezier(.4,0,.2,1)} .np-overlay.dynamic-color .np-bg{display:none} .np-overlay.dynamic-color .np-cover{box-shadow:0 20px 50px rgba(0,0,0,.35)} .np-inner{ position:relative;z-index:1; display:flex;flex-direction:column; align-items:center; height:100%; padding:0 28px 28px; padding-top:max(env(safe-area-inset-top),36px); gap:0; max-width:480px; margin:0 auto; width:100%; } /* Top bar */ .np-topbar{ display:flex;align-items:center;justify-content:space-between; width:100%;margin-bottom:32px; gap:12px; } .np-close{ background:rgba(255,255,255,.1);border:none; width:36px;height:36px;border-radius:50%; display:flex;align-items:center;justify-content:center; cursor:pointer;color:var(--text); backdrop-filter:blur(8px); transition:background .2s; } .np-close:hover{background:rgba(255,255,255,.18)} .np-close svg{pointer-events:none} .np-label{font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:rgba(255,255,255,.5)} .np-menu-btn{ background:rgba(255,255,255,.1);border:none; width:36px;height:36px;border-radius:50%; display:flex;align-items:center;justify-content:center; cursor:pointer;color:var(--text);backdrop-filter:blur(8px); transition:background .2s; } .np-menu-btn:hover{background:rgba(255,255,255,.18)} /* Big cover art */ .np-cover{ width:min(300px, calc(100vw - 80px)); height:min(300px, calc(100vw - 80px)); border-radius:16px; overflow:hidden; background:var(--surface2); box-shadow:0 32px 80px rgba(0,0,0,.7); margin-bottom:36px; flex-shrink:0; transition:transform .3s; } .np-cover img{width:100%;height:100%;object-fit:cover} .np-cover.playing{animation:npPulse 4s ease-in-out infinite} @keyframes npPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.025)}} .np-cover .no-art{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:80px} /* Song info */ .np-info{width:100%;margin-bottom:24px;display:flex;align-items:center;gap:10px} .np-text{min-width:0;flex:1} .np-title-row{display:flex;align-items:center;gap:6px;margin-bottom:5px} .np-title{font-size:22px;font-weight:800;letter-spacing:-.4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0} .np-artist{font-size:14px;color:rgba(255,255,255,.5);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .15s} .np-artist+.np-artist{font-size:15px;font-weight:600;margin-top:3px;color:var(--accent)} #np-artist-name span:hover,#np-album-name:hover{color:var(--accent);cursor:pointer} .np-star{ background:none;border:none;cursor:pointer; padding:4px;flex-shrink:0; display:flex;align-items:center; transition:transform .15s; } .np-star:hover{transform:scale(1.15)} /* Progress */ .np-progress{width:100%;margin-bottom:10px} .np-bar{ width:100%;height:4px;background:rgba(255,255,255,.2); border-radius:2px;cursor:pointer;position:relative;margin-bottom:10px; } .np-bar-fill{ height:100%;background:#fff;border-radius:2px; width:0%;transition:width .1s linear;position:relative; } .np-bar-fill::after{ content:'';position:absolute;right:-7px;top:50%; transform:translateY(-50%); width:14px;height:14px;border-radius:50%;background:#fff; opacity:0;transition:opacity .15s; box-shadow:0 0 8px rgba(255,255,255,.6); } .np-bar:hover .np-bar-fill::after{opacity:1} .np-times{display:flex;justify-content:space-between;font-size:11px;color:rgba(255,255,255,.45);font-family:var(--mono)} /* Controls */ .np-controls{display:flex;align-items:center;justify-content:space-between;width:100%;margin-bottom:28px} .np-ctrl{ background:none;border:none;color:rgba(255,255,255,.7); cursor:pointer;padding:10px;border-radius:50%; display:flex;align-items:center;justify-content:center; transition:color .15s,transform .15s,background .15s; } .np-ctrl:hover{color:#fff;background:rgba(255,255,255,.08)} .np-ctrl.active{color:var(--accent)} .np-play{ width:64px;height:64px;border-radius:50%; background:#fff;border:none;cursor:pointer; display:flex;align-items:center;justify-content:center; box-shadow:0 8px 32px rgba(0,0,0,.4); transition:transform .15s; } .np-play:hover{transform:scale(1.06)} .np-play:active{transform:scale(.95)} .np-play svg{color:#000} /* Volume + extras */ .np-extras{display:flex;align-items:center;justify-content:space-between;width:100%;gap:12px} .np-vol{display:flex;align-items:center;gap:10px;flex:1} .np-vol-slider{ flex:1;height:3px;background:rgba(255,255,255,.2); border-radius:2px;cursor:pointer; appearance:none;-webkit-appearance:none;outline:none; } .np-vol-slider::-webkit-slider-thumb{ -webkit-appearance:none;width:13px;height:13px; border-radius:50%;background:#fff;cursor:pointer; } .np-icon-btn{ background:none;border:none;color:rgba(255,255,255,.6); cursor:pointer;padding:8px;border-radius:50%; display:flex;align-items:center; transition:color .15s,background .15s; } .np-icon-btn:hover{color:#fff;background:rgba(255,255,255,.08)} /* NP tabs */ .np-tabs{display:flex;gap:2px;background:rgba(255,255,255,.08);border-radius:20px;padding:3px;flex:1;min-width:0} .np-tab{background:none;border:none;color:rgba(255,255,255,.45);font-size:10px;font-weight:700;letter-spacing:0;text-transform:uppercase;padding:5px 7px;border-radius:16px;cursor:pointer;transition:all .2s;font-family:var(--font);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .np-tab.active{background:rgba(255,255,255,.15);color:#fff} /* NP queue view */ #np-player-view{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;flex:1;min-height:0} #np-queue-view{display:none;flex-direction:column;width:100%;flex:1;overflow-y:auto;padding-top:8px} .np-overlay.queue-mode #np-player-view{display:none} .np-overlay.queue-mode #np-queue-view{display:flex} #np-lyrics-view{display:none;flex-direction:column;width:100%;flex:1;overflow-y:auto;overflow-x:hidden;padding:0 28px 48px;scroll-behavior:smooth;scrollbar-width:none;-webkit-mask-image:linear-gradient(transparent,black 12%,black 88%,transparent);mask-image:linear-gradient(transparent,black 12%,black 88%,transparent)} #np-lyrics-view::-webkit-scrollbar{display:none} .np-overlay.lyrics-mode #np-player-view{display:none} .np-overlay.lyrics-mode #np-lyrics-view{display:flex} .lyrics-line{font-size:18px;font-weight:600;line-height:1.85;color:rgba(255,255,255,.22);transition:color .3s,transform .3s,opacity .3s;padding:5px 0;cursor:pointer;text-align:center;transform:scale(1);transform-origin:center center;will-change:transform} .lyrics-line.past{color:rgba(255,255,255,.45)} .lyrics-line.active{color:#fff;transform:scale(1.04)} /* Mitlaufen-Schalter: schwebt unten rechts ueber dem Text, nur im Lyrics-Tab und nur bei synchronen Zeilen (Klasse .hat-sync setzt das Skript). Aus = gedaempft, an = Akzentfarbe. */ .np-follow{display:none;position:absolute;right:22px;bottom:22px;z-index:3;align-items:center;gap:6px; background:rgba(0,0,0,.42);border:1px solid rgba(255,255,255,.14);color:rgba(255,255,255,.6); font-family:var(--font);font-size:11px;font-weight:700;letter-spacing:.3px;text-transform:uppercase; padding:7px 12px;border-radius:18px;cursor:pointer;backdrop-filter:blur(10px); transition:color .2s,border-color .2s,background .2s} .np-overlay.lyrics-mode .np-follow.hat-sync{display:flex} .np-follow:hover{background:rgba(0,0,0,.6);color:rgba(255,255,255,.85)} .np-follow.active{color:var(--blue);border-color:color-mix(in srgb,var(--blue) 55%,transparent)} .np-follow svg{pointer-events:none;flex-shrink:0} .lyrics-plain{font-size:15px;line-height:1.9;color:rgba(255,255,255,.65);white-space:pre-wrap;text-align:center;padding-top:24px} .section-count{font-size:11px;font-weight:500;color:var(--text3);background:var(--surface2);padding:2px 8px;border-radius:10px;flex-shrink:0} .album-partial-badge{position:absolute;bottom:5px;left:5px;background:rgba(0,0,0,.72);color:#fff;font-size:9px;font-weight:700;padding:2px 6px;border-radius:4px;pointer-events:none;z-index:2} .card-dl-btn{position:absolute;top:5px;right:5px;z-index:3;width:26px;height:26px;border-radius:50%;background:rgba(0,0,0,.65);border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .2s;backdrop-filter:blur(6px)} .card:hover .card-dl-btn,.card-dl-btn:focus{opacity:1} .np-queue-item{display:flex;align-items:center;gap:10px;padding:9px 6px;border-radius:10px;cursor:pointer;transition:background .15s} .np-queue-item:hover{background:rgba(255,255,255,.06)} .np-queue-item.nq-active .nqi-title{color:var(--accent)} .nqi-num{font-size:11px;color:rgba(255,255,255,.28);width:20px;text-align:center;flex-shrink:0;font-family:var(--mono)} .nqi-art{width:38px;height:38px;border-radius:7px;overflow:hidden;background:rgba(255,255,255,.08);flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:16px} .nqi-art img{width:100%;height:100%;object-fit:cover} .nqi-info{flex:1;min-width:0} .nqi-title{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:rgba(255,255,255,.9)} .nqi-artist{font-size:11px;color:rgba(255,255,255,.4);margin-top:2px} /* player-art clickable */ #player-art{cursor:pointer} #player-art:hover img{opacity:.85} /* ── RADIO SHUFFLE BUTTON ── */ .btn-radio{display:flex;align-items:center;gap:7px;padding:9px 18px;border-radius:25px;background:linear-gradient(135deg,#4f8ef7,#2d6ad4);color:#fff;border:none;font-family:var(--font);font-size:13px;font-weight:700;cursor:pointer;transition:opacity .15s,transform .15s;box-shadow:0 0 18px rgba(79,142,247,.35)} .btn-radio:hover{opacity:.9;transform:scale(1.02)} .btn-radio.active{background:linear-gradient(135deg,var(--danger),#c03030);box-shadow:0 0 18px rgba(224,85,85,.4)} /* ── ARTIST PAGE ── */ /* ── SHUFFLE/REPEAT STATUS BADGES ── */ .player-status-row{display:flex;align-items:center;gap:6px;margin-top:3px} .status-badge{display:none;font-size:9px;font-weight:700;letter-spacing:.4px;padding:2px 6px;border-radius:10px;text-transform:uppercase} .status-badge.on{display:inline-flex} .badge-shuffle{background:var(--accent-dim);color:var(--accent)} .badge-repeat{background:var(--blue-dim);color:var(--blue)} /* ── LAST.FM ARTIST INFO ── */ .artist-bio{font-size:13px;color:var(--text2);line-height:1.65;margin-bottom:20px;padding:16px;background:var(--surface);border-radius:10px;border:1px solid var(--border)} .artist-bio a{color:var(--accent);text-decoration:none} .similar-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:24px} .similar-chip{padding:6px 12px;background:var(--surface);border:1px solid var(--border2);border-radius:20px;font-size:12px;font-weight:600;cursor:pointer;transition:border-color .15s,color .15s} .similar-chip:hover{border-color:var(--accent);color:var(--accent)} .sort-chips{display:flex;flex-wrap:nowrap;gap:6px;margin-bottom:16px;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch;scrollbar-width:none} .sort-chips::-webkit-scrollbar{display:none} .sort-chip{padding:6px 14px;background:var(--surface);border:1px solid var(--border2);border-radius:20px;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap;color:var(--text2);font-family:var(--font);transition:border-color .15s,color .15s,background .15s} .sort-chip:hover{border-color:var(--accent);color:var(--accent)} .sort-chip.active{background:var(--accent);border-color:var(--accent);color:#000} .list-search-wrap{position:relative;margin-bottom:12px} .list-search-wrap svg{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text3);pointer-events:none} .list-search{width:100%;box-sizing:border-box;padding:8px 12px 8px 32px;background:var(--surface);border:1px solid var(--border2);border-radius:8px;color:var(--text1);font-size:13px;font-family:var(--font);outline:none;transition:border-color .15s} .list-search:focus{border-color:var(--accent)} .list-search::placeholder{color:var(--text3)} .importer-section-label{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:1.2px;margin-bottom:10px} #spotify-enrich-status{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text2);padding:8px 12px;margin-bottom:8px;background:var(--surface);border:1px solid var(--border2);border-radius:8px;transition:opacity .4s} #spotify-enrich-status.done{color:var(--accent)} #spotify-enrich-status .enrich-spinner{width:12px;height:12px;border:2px solid var(--border2);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite;flex-shrink:0} .topsong-item{display:grid;grid-template-columns:28px 44px 1fr auto auto;align-items:center;gap:10px;padding:7px 10px;border-radius:8px;cursor:pointer;transition:background .15s} .topsong-item:hover{background:var(--surface)} .topsong-num{font-size:11px;color:var(--text3);font-family:var(--mono);text-align:center} .topsong-thumb{width:44px;height:44px;border-radius:6px;overflow:hidden;background:var(--surface2)} .topsong-thumb img{width:100%;height:100%;object-fit:cover} .topsong-title{font-size:13px;font-weight:500} .topsong-plays{font-size:11px;color:var(--text3);font-family:var(--mono)} /* ── NP MOBILE SWIPE ── */ .np-drag-handle{width:100%;height:36px;display:flex;align-items:center;justify-content:center;cursor:grab;flex-shrink:0;touch-action:none} .np-drag-handle-bar{width:40px;height:4px;background:rgba(255,255,255,.25);border-radius:2px} .artist-card .play-overlay{display:none!important} .artist-action-bar{display:flex;gap:8px;margin-bottom:20px;flex-wrap:wrap} .artist-action-btn{display:flex;align-items:center;gap:6px;padding:9px 18px;border-radius:20px;border:1px solid var(--border2);background:var(--surface);color:var(--text);font-family:var(--font);font-size:13px;font-weight:600;cursor:pointer;transition:background .15s,border-color .15s} .artist-action-btn:hover{background:var(--surface2);border-color:var(--accent);color:var(--accent)} .artist-hero{height:320px;border-radius:14px;overflow:hidden;position:relative;margin-bottom:24px;background:linear-gradient(135deg,var(--surface2),var(--surface))} .artist-hero-bg{position:absolute;inset:0;background-size:cover;background-position:center;filter:blur(20px) brightness(0.55) saturate(0.7);transform:scale(1.1)} .artist-hero-overlay{position:absolute;inset:0;display:flex;align-items:stretch;gap:0} .artist-hero-pfp-wrap{aspect-ratio:1/1;height:100%;flex-shrink:0;overflow:hidden;position:relative;background:linear-gradient(135deg,var(--surface2),var(--surface3,var(--surface)))} .artist-hero-pfp{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block} .artist-hero-pfp-initial{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:52px;font-weight:700;color:var(--text2);line-height:1} .artist-hero-info{min-width:0;flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-start;padding:20px 24px;background:linear-gradient(to left,rgba(7,7,15,.95) 0%,rgba(7,7,15,.1) 100%)} .artist-hero-name{max-width:100%;font-size:26px;font-weight:800;letter-spacing:-0.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:.12em} .artist-hero-fans{font-size:13px;font-weight:600;color:rgba(255,255,255,.58);margin-top:6px;letter-spacing:.2px;display:none} .artist-hero-fans.show{display:block} @media(max-width:768px){ .artist-hero-bg{filter:brightness(0.75) saturate(0.85);transform:scale(1)} .artist-hero-pfp-wrap{display:none} .artist-hero-overlay{align-items:flex-end;padding:18px 20px;background:linear-gradient(to top,rgba(7,7,15,.82) 0%,transparent 65%)} .artist-hero-info{background:none;padding:0} } @media(min-width:769px){ .artist-hero{height:320px;border-radius:16px} .artist-hero-info{padding:28px 36px} .artist-hero-name{font-size:44px;letter-spacing:-2px} } /* ── EVENTS MODAL ── */ .events-modal{padding:0;overflow:hidden;width:min(520px,calc(100vw - 32px))} .events-modal-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 16px;border-bottom:1px solid var(--border)} .events-modal-title{font-size:16px;font-weight:700} .events-modal-close{background:none;border:none;color:var(--text2);font-size:18px;cursor:pointer;padding:4px 8px;line-height:1} .events-modal-close:hover{color:var(--text)} .events-modal-list{overflow-y:auto;max-height:60vh;padding:8px 0} .event-row{display:flex;align-items:center;gap:12px;padding:12px 24px;border-bottom:1px solid var(--border)} .event-row:last-child{border-bottom:none} .event-date{font-size:13px;font-weight:700;color:var(--text);min-width:110px;flex-shrink:0;line-height:1.4} .event-time{display:block;font-size:11px;font-weight:400;color:var(--text2);margin-top:2px} .event-venue{flex:1;min-width:0} .event-venue-name{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .event-venue-city{font-size:11px;color:var(--text2);margin-top:2px} .event-book-btn{flex-shrink:0;padding:7px 14px;border-radius:20px;background:var(--accent);color:#fff;font-family:var(--font);font-size:12px;font-weight:700;text-decoration:none;transition:opacity .15s;display:flex;flex-direction:column;align-items:center;gap:2px} .event-book-btn:hover{opacity:.85} .event-sold-badge{font-size:9px;font-weight:600;opacity:.8;letter-spacing:.3px} .events-empty{padding:32px 24px;color:var(--text2);font-size:14px;text-align:center} /* ── MISC ── */ .spinner{width:28px;height:28px;border:3px solid var(--surface2);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;margin:50px auto;display:block} .empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:70px 20px;color:var(--text3);text-align:center} .empty-state .icon{font-size:44px;margin-bottom:14px} .empty-state p{font-size:14px} .toast-container{position:fixed;bottom:calc(var(--player-h) + 16px);left:50%;transform:translateX(-50%);z-index:201;display:flex;flex-direction:column;align-items:center;gap:6px} .toast{background:var(--surface);border:1px solid var(--border2);color:var(--text);font-size:12px;padding:9px 14px;border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.4);animation:toastIn .25s ease,toastOut .25s ease 2.75s forwards;white-space:nowrap} @keyframes toastIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}} @keyframes toastOut{to{opacity:0;transform:translateY(8px)}} /* ── THEME PICKER ── */ .theme-picker{display:flex;flex-wrap:wrap;gap:8px} .theme-swatch{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:9px;border:2px solid var(--border2);background:var(--bg2);cursor:pointer;transition:border-color .15s,background .15s;font-size:13px;font-weight:500;color:var(--text2)} .theme-swatch:hover{border-color:var(--border2);background:var(--surface)} .theme-swatch.active{border-color:var(--accent);color:var(--text)} .theme-swatch-dot{width:18px;height:18px;border-radius:50%;background:var(--sw-accent);flex-shrink:0;box-shadow:inset 0 0 0 2px rgba(0,0,0,.2)} /* ── SETTINGS MODAL ── */ .settings-section{margin-bottom:20px} .settings-section h3{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text2);margin-bottom:10px} .settings-row{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--bg2);border-radius:8px;margin-bottom:6px} .settings-row label{font-size:13px;font-weight:500} .settings-row .hint{font-size:11px;color:var(--text3);margin-top:2px} .toggle{width:36px;height:20px;background:var(--surface2);border-radius:10px;cursor:pointer;position:relative;transition:background .2s;flex-shrink:0} .toggle.on{background:var(--accent)} .toggle::after{content:'';position:absolute;width:14px;height:14px;background:#fff;border-radius:50%;top:3px;left:3px;transition:transform .2s} .toggle.on::after{transform:translateX(16px)} .status-dot{width:8px;height:8px;border-radius:50%;background:var(--surface2);flex-shrink:0} .status-dot.ok{background:var(--green)} .status-dot.err{background:var(--danger)} /* ── RESPONSIVE ── */ @media(max-width:768px){ :root{--sidebar-w:0px} .sidebar{position:fixed;left:-260px;width:260px;height:100vh;z-index:150;transition:left .3s;border-right:1px solid var(--border2)} .sidebar.mobile-open{left:0;box-shadow:10px 0 40px rgba(0,0,0,.6)} .page{padding:16px 14px} .album-header{flex-direction:column;align-items:flex-start} .album-cover{width:130px;height:130px} .album-name{font-size:22px} .player-controls{width:auto;padding:0 8px;min-width:160px} .player-right .volume-wrap{display:none} .mobile-menu-btn{display:flex!important} .jobs-panel{left:16px;right:16px;width:auto} } .mobile-menu-btn{display:none;background:none;border:none;color:var(--text);cursor:pointer;padding:8px} @media(max-width:768px){ :root{--player-h:74px} /* Single-row compact player: [art][info+star][prev][play][next] + thin progress strip */ .player{ display:grid!important; grid-template-columns:1fr auto!important; grid-template-rows:1fr!important; padding:6px 12px 14px; gap:0 10px; align-items:center; } .player .player-art{width:46px!important;height:46px!important;border-radius:50%!important;flex-shrink:0} .player-track{max-width:none!important;width:100%!important;gap:8px} .player-info-wrap{flex:1;min-width:0} .player-info{flex:1;min-width:0} .player-title{flex:1;min-width:0;font-size:12px!important} .player-artist{font-size:10px!important;margin-top:1px} .player-status-row{display:none} /* Controls: horizontal row with only prev/play/next */ .player-controls{display:flex!important;flex-direction:row!important;width:auto!important;padding:0!important;gap:0!important;align-items:center;flex-shrink:0;min-width:0!important} .ctrl-buttons{gap:2px} #btn-shuffle,#btn-repeat{display:none!important} .play-pause-btn{width:40px;height:40px} /* Thin progress strip pinned to bottom of player bar */ .progress-bar-wrap{position:absolute;bottom:0;left:0;right:0;height:14px;padding:0 10px;gap:5px;display:flex;align-items:center} #time-total{display:none!important} .progress-time{font-size:9px!important;min-width:22px!important;color:var(--text3)} .progress-bar{height:2px!important;border-radius:0} .progress-fill::after{display:none} .player-right{display:none!important} } .mobile-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:140} .mobile-overlay.active{display:block} /* ── UPDATE BANNER ── */ .update-banner{ position:fixed;bottom:calc(var(--player-h) + 20px);left:50%; transform:translateX(-50%); display:flex;align-items:center;gap:10px; background:var(--surface);border:1px solid var(--accent); border-radius:12px;padding:10px 14px; box-shadow:0 8px 32px rgba(0,0,0,.55),0 0 0 1px rgba(232,160,32,.15); z-index:202;white-space:nowrap; animation:toastIn .3s ease; } .update-banner-text{font-size:13px;font-weight:600;color:var(--text)} .update-banner-btn{ background:var(--accent);color:#000;border:none; padding:6px 14px;border-radius:7px; font-size:12px;font-weight:700;cursor:pointer;font-family:var(--font); transition:opacity .15s; } .update-banner-btn:hover{opacity:.85} .update-banner-close{ background:none;border:none;color:var(--text3); cursor:pointer;font-size:15px;padding:0 2px;line-height:1; } .update-banner-close:hover{color:var(--text)} @media(max-width:768px){ .update-banner{bottom:calc(var(--player-h) + 80px + 12px)} } /* ── SEARCH page ── */ .search-section{margin-bottom:24px} .search-section-title{font-size:11px;font-weight:700;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px} /* ═══════════════════════════════════════════════════ AUDIOBOOKSHELF ═══════════════════════════════════════════════════ */ /* -- Books grid -- */ .abs-books-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:16px;padding-bottom:20px} .abs-book-card{cursor:pointer;transition:transform .15s} .abs-book-card:hover{transform:translateY(-2px)} .abs-book-cover-wrap{position:relative;aspect-ratio:1;border-radius:10px;overflow:hidden;background:var(--surface);margin-bottom:8px;box-shadow:0 4px 12px rgba(0,0,0,.4)} .abs-book-cover{width:100%;height:100%;object-fit:cover;display:block} .abs-book-cover-ph{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:40px;background:var(--surface2)} .abs-book-prog-wrap{position:absolute;bottom:0;left:0;right:0;height:3px;background:rgba(255,255,255,.15)} .abs-book-prog-fill{height:100%;background:var(--accent);transition:width .3s} .abs-book-done{position:absolute;top:6px;right:6px;width:20px;height:20px;border-radius:50%;background:var(--green);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:#000} .abs-book-title{font-size:12px;font-weight:600;line-height:1.3;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .abs-book-author{font-size:11px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px} .abs-loading{padding:40px 20px;text-align:center;color:var(--text2);font-size:14px} .abs-empty{padding:40px 20px;text-align:center;color:var(--text2);font-size:14px} .abs-error{padding:20px;color:var(--danger);font-size:13px} /* -- Book detail -- */ .abs-detail-header{display:flex;gap:20px;margin-bottom:20px;align-items:flex-start} .abs-detail-cover-wrap{flex-shrink:0;width:140px;aspect-ratio:1;border-radius:10px;overflow:hidden;background:var(--surface);box-shadow:0 8px 24px rgba(0,0,0,.5)} .abs-detail-cover{width:100%;height:100%;object-fit:cover;display:block} .abs-detail-cover-ph{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:50px;background:var(--surface2)} .abs-detail-meta{flex:1;min-width:0} .abs-detail-title{font-size:20px;font-weight:800;line-height:1.2;margin-bottom:6px} .abs-detail-author{font-size:13px;color:var(--text2);margin-bottom:4px} .abs-detail-series{font-size:12px;color:var(--accent);margin-bottom:4px} .abs-detail-year{font-size:12px;color:var(--text3);margin-bottom:4px} .abs-detail-dur{font-size:12px;color:var(--text3);margin-bottom:8px} .abs-detail-progress-wrap{display:flex;align-items:center;gap:8px;margin-bottom:10px} .abs-detail-progress-bar{flex:1;height:4px;background:var(--surface2);border-radius:2px;overflow:hidden} .abs-detail-progress-bar div{height:100%;background:var(--accent);border-radius:2px} .abs-detail-progress-wrap span{font-size:11px;color:var(--text2);flex-shrink:0} .abs-play-btn{display:inline-flex;align-items:center;gap:8px;padding:10px 20px;background:linear-gradient(135deg,var(--accent),var(--accent-dark));color:#000;border:none;border-radius:var(--radius-sm);font-family:var(--font);font-size:14px;font-weight:700;cursor:pointer;transition:opacity .2s,transform .15s;margin-top:8px} .abs-play-btn:hover{opacity:.9;transform:translateY(-1px)} .abs-detail-desc{font-size:13px;color:var(--text2);line-height:1.6;margin-bottom:20px;background:var(--surface);border-radius:var(--radius-sm);padding:14px;border:1px solid var(--border);max-height:120px;overflow-y:auto} .abs-detail-chapters{margin-top:4px} .abs-detail-chapters-title{font-size:14px;font-weight:700;margin-bottom:10px;display:flex;align-items:center;gap:8px} .abs-ch-count{font-size:12px;font-weight:400;color:var(--text2)} .abs-chapter-row{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--radius-sm);cursor:pointer;transition:background .15s} .abs-chapter-row:hover{background:var(--surface)} .abs-ch-num{font-size:11px;color:var(--text3);min-width:20px;text-align:right;flex-shrink:0} .abs-ch-title{flex:1;font-size:13px;line-height:1.3;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .abs-ch-start{font-size:11px;color:var(--text3);flex-shrink:0;font-variant-numeric:tabular-nums} /* -- Player overlay -- */ .abs-player-overlay{position:fixed;inset:0;z-index:300;background:var(--bg);display:flex;flex-direction:column;transform:translateY(100%);transition:transform .35s cubic-bezier(.32,.72,0,1);overflow:hidden} .abs-player-overlay.open{transform:translateY(0)} .abs-player-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 8px;flex-shrink:0} .abs-player-label{font-size:12px;font-weight:700;color:var(--text2);letter-spacing:.5px;text-transform:uppercase} .abs-hbtn{background:none;border:none;color:var(--text2);cursor:pointer;padding:6px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:color .15s} .abs-hbtn:hover{color:var(--text)} .abs-cover-area{flex:1;display:flex;align-items:center;justify-content:center;padding:8px 40px;min-height:0} .abs-cover-wrap{width:min(280px,calc(100vw - 80px));aspect-ratio:1;border-radius:14px;overflow:hidden;background:var(--surface);box-shadow:0 20px 60px rgba(0,0,0,.6),0 0 0 1px rgba(255,255,255,.06)} .abs-cover-img{width:100%;height:100%;object-fit:cover;display:block} .abs-cover-ph{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:64px;background:var(--surface2)} .abs-player-info{text-align:center;padding:12px 24px 0;flex-shrink:0} .abs-player-title{font-size:18px;font-weight:800;line-height:1.2;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .abs-player-author{font-size:13px;color:var(--text2);margin-bottom:4px} .abs-player-chapter{font-size:12px;color:var(--accent);min-height:18px} .abs-progress-area{padding:12px 24px 0;flex-shrink:0} .abs-prog-bar{position:relative;height:32px;display:flex;align-items:center;cursor:pointer;touch-action:none} .abs-prog-track{position:relative;width:100%;height:4px;background:var(--surface2);border-radius:2px;overflow:visible} .abs-prog-fill{height:100%;background:var(--accent);border-radius:2px;pointer-events:none} .abs-prog-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:14px;height:14px;border-radius:50%;background:var(--text);box-shadow:0 2px 6px rgba(0,0,0,.4);pointer-events:none;transition:transform .1s} .abs-prog-bar:active .abs-prog-thumb{transform:translate(-50%,-50%) scale(1.3)} .abs-prog-times{display:flex;justify-content:space-between;margin-top:4px;font-size:11px;color:var(--text3);font-variant-numeric:tabular-nums} .abs-controls{display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 20px 0;flex-shrink:0} .abs-ctrl-btn{background:none;border:none;color:var(--text2);cursor:pointer;padding:10px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:color .15s,background .15s;position:relative;flex-direction:column;gap:2px} .abs-ctrl-btn:hover{color:var(--text);background:var(--surface)} .abs-skip-label{font-size:9px;font-weight:700;color:var(--text3);line-height:1} .abs-play-pause{width:62px;height:62px;border-radius:50%;background:var(--accent);border:none;color:#000;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 8px 24px var(--accent-glow);transition:transform .15s,opacity .15s;flex-shrink:0;margin:0 8px} .abs-play-pause:hover{transform:scale(1.05);opacity:.9} .abs-play-pause:active{transform:scale(.97)} .abs-extra-controls{display:flex;align-items:center;justify-content:center;gap:12px;padding:10px 20px 16px;flex-shrink:0} .abs-picker-wrap{position:relative} .abs-extra-btn{display:flex;align-items:center;gap:5px;padding:7px 12px;background:var(--surface);border:1px solid var(--border);border-radius:20px;color:var(--text2);font-family:var(--font);font-size:12px;font-weight:600;cursor:pointer;transition:color .15s,background .15s;white-space:nowrap} .abs-extra-btn:hover,.abs-extra-btn.active{color:var(--accent);border-color:var(--accent);background:var(--accent-dim)} .abs-picker{display:none;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translateX(-50%);background:var(--surface);border:1px solid var(--border2);border-radius:10px;box-shadow:0 12px 32px rgba(0,0,0,.5);overflow:hidden;z-index:10;min-width:90px} .abs-picker.abs-picker-right{left:auto;right:0;transform:none;min-width:150px} .abs-picker.open{display:block} .abs-picker button{display:block;width:100%;padding:9px 16px;background:none;border:none;color:var(--text);font-family:var(--font);font-size:13px;cursor:pointer;text-align:left;transition:background .15s;white-space:nowrap} .abs-picker button:hover{background:var(--surface2)} .abs-picker button.active{color:var(--accent);font-weight:700} .abs-sleep-custom-row{display:flex;flex-direction:column;width:100%;padding:6px 12px 8px;border-top:1px solid var(--border2);box-sizing:border-box;gap:4px} .abs-sleep-custom-label{font-size:10px;color:var(--text3)} .abs-sleep-custom-controls{display:flex;gap:6px;align-items:center} .abs-sleep-custom-row input{flex:1;min-width:0;padding:5px 8px;background:var(--surface);border:1.5px solid var(--border2);border-radius:6px;color:var(--text);font-family:var(--font);font-size:13px;outline:none;transition:border-color .15s} .abs-sleep-custom-row input:focus{border-color:var(--accent)} .abs-sleep-custom-row input[type=number]::-webkit-inner-spin-button,.abs-sleep-custom-row input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0} .abs-sleep-custom-row input[type=number]{-moz-appearance:textfield} .abs-sleep-custom-ok{flex-shrink:0;padding:3px 6px;background:var(--accent);border:none;border-radius:5px;color:#fff;font-family:var(--font);font-size:10px;font-weight:600;cursor:pointer} .abs-chapter-list{flex-shrink:0;overflow-y:auto;max-height:0;transition:max-height .3s ease;border-top:1px solid transparent} .abs-chapter-list.open{max-height:220px;border-color:var(--border)} .abs-ch-item{display:flex;align-items:center;gap:10px;padding:8px 20px;cursor:pointer;transition:background .15s} .abs-ch-item:hover{background:var(--surface)} .abs-ch-item.active{background:var(--accent-dim)} .abs-ch-item.active .abs-ch-title{color:var(--accent)} .abs-ch-item.active .abs-ch-num{color:var(--accent)} @media(max-width:768px){ .abs-books-grid{grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:12px} .abs-detail-header{flex-direction:column;align-items:center;text-align:center} .abs-detail-cover-wrap{width:180px} .abs-cover-area{padding:8px 24px} .abs-cover-wrap{width:min(240px,calc(100vw - 48px))} } /* ── ABS MINI BAR (overlays the bottom player bar) ── */ .abs-mini-bar{position:fixed;bottom:0;left:0;right:0;height:var(--player-h);background:rgba(8,8,20,.96);backdrop-filter:blur(28px);border-top:1px solid var(--border2);padding:0 16px;display:flex;align-items:center;gap:12px;z-index:101;transform:translateY(100%);transition:transform .3s} .abs-mini-bar.visible{transform:translateY(0)} .abs-mini-prog-strip{position:absolute;top:0;left:0;right:0;height:3px;background:var(--border2)} .abs-mini-prog-fill{height:100%;background:var(--accent);transition:width .5s linear;width:0} .abs-mini-cover{width:46px;height:46px;border-radius:8px;background:var(--surface2);display:flex;align-items:center;justify-content:center;font-size:20px;flex-shrink:0;overflow:hidden;cursor:pointer} .abs-mini-info{flex:1;min-width:0;cursor:pointer} .abs-mini-title{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .abs-mini-chapter{font-size:11px;color:var(--text2);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .abs-mini-play{background:none;border:none;color:var(--text);cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0} .abs-mini-open{background:none;border:none;color:var(--text2);cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0} .abs-mini-open:hover{color:var(--text)} .abs-hbtn.active{color:var(--accent)} .abs-volume-row{display:flex;align-items:center;gap:8px;padding:0 24px 16px;width:220px;margin:0 auto} .abs-vol-slider{flex:1;-webkit-appearance:none;appearance:none;height:3px;border-radius:2px;background:var(--surface2);outline:none;cursor:pointer} .abs-vol-slider::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;border-radius:50%;background:var(--accent);cursor:pointer} .abs-vol-slider::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:var(--accent);cursor:pointer;border:none} @media(max-width:768px){.abs-mini-bar{bottom:80px;height:var(--player-h)}} /* ─── MUSIK-DUELL (Vergleich zweier Nutzer) ───────────────────────────────── Vorher lebte die Ansicht ausschliesslich von Inline-Stilen mit festen Flex-Verhaeltnissen. Am Handy ging das auf, am Desktop zerfiel es. Jetzt ein Raster: eine Spalte auf schmalen Schirmen, zwei ab 780 px — die Anzeigetafel bleibt in beiden Faellen ueber die volle Breite. */ .cmp-body{display:grid;grid-template-columns:1fr;gap:26px;align-content:start} .cmp-wide{grid-column:1/-1} @media(min-width:780px){ .cmp-body{grid-template-columns:1fr 1fr;gap:26px 30px} } .cmp-head{display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;margin-bottom:14px} .cmp-name{font-size:15px;font-weight:800;max-width:38vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .cmp-score{font-size:30px;font-weight:900;letter-spacing:-1px;font-variant-numeric:tabular-nums} .cmp-verdict{text-align:center;font-size:13px;color:var(--text2);margin-bottom:16px} /* Eine Kategoriezeile: Wert · Name · Wert. Feste Aussenspalten, damit die Zahlen untereinander stehen und die Mitte den Rest bekommt — genau das fehlte vorher. */ .cmp-cat{display:grid;grid-template-columns:minmax(64px,1fr) auto minmax(64px,1fr);align-items:center; gap:10px;padding:9px 10px;border-radius:10px} .cmp-cat+.cmp-cat{margin-top:4px} .cmp-cat-label{font-size:12px;color:var(--text2);text-transform:uppercase;letter-spacing:.4px; font-weight:800;white-space:nowrap} .cmp-val{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums} .cmp-val.a{text-align:right} .cmp-val.b{text-align:left} .cmp-val.win{color:var(--accent)} .cmp-val.lose{color:var(--text3)} .cmp-cat.win-a{background:linear-gradient(90deg,rgba(232,160,32,.13),transparent 70%)} .cmp-cat.win-b{background:linear-gradient(270deg,rgba(232,160,32,.13),transparent 70%)} /* Tauziehen-Zeile fuer gemeinsame Kuenstler */ .cmp-row{display:grid;grid-template-columns:34px 1fr minmax(90px,1.4fr) 1fr 34px;align-items:center; gap:8px;padding:6px 0} .cmp-row-name{text-align:center;font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden; text-overflow:ellipsis;min-width:0} .cmp-num{font-size:12px;color:var(--text2);font-weight:700;font-variant-numeric:tabular-nums} .cmp-bar{height:6px;border-radius:3px;background:var(--accent)} .cmp-track{display:flex;align-items:center;gap:10px;padding:6px 0;min-width:0} .cmp-track img{width:40px;height:40px;border-radius:6px;object-fit:cover;flex-shrink:0} /* ─── NEU VON DEINEN KÜNSTLERN ─────────────────────────────────────────── */ .artist-news-hint{background:rgba(232,160,32,.08);border:1px solid rgba(232,160,32,.28);border-radius:10px;padding:10px 14px;font-size:12px;color:var(--text2);line-height:1.5;margin-bottom:14px} .artist-news-hint strong{color:var(--text)} .artist-news-row{display:flex;align-items:center;gap:14px;padding:10px 12px;border-radius:12px;transition:background .15s} .artist-news-row:hover{background:var(--surface)} .artist-news-art{width:56px;height:56px;flex-shrink:0;border-radius:8px;overflow:hidden;background:var(--surface2);display:flex;align-items:center;justify-content:center} .artist-news-art img{width:100%;height:100%;object-fit:cover} .artist-news-info{flex:1;min-width:0} .artist-news-title{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .artist-news-sub{font-size:12px;color:var(--text2);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .artist-news-artist{cursor:pointer;transition:color .15s} .artist-news-artist:hover{color:var(--accent);text-decoration:underline} .artist-news-date{font-size:11px;color:var(--text3);margin-top:3px} .artist-news-action{flex-shrink:0} .artist-news-have{font-size:12px;color:var(--text3);white-space:nowrap} @media(max-width:600px){ .artist-news-art{width:46px;height:46px} .artist-news-row{gap:10px;padding:8px 6px} } /* Dublettenauflösung im Metadaten-Editor: zwei Dateien gegenübergestellt, darunter der Löschknopf */ .dublette-box{margin-top:12px;padding:12px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--radius-sm);text-align:left} .dublette-datei{margin-bottom:10px;font-size:12px} .dublette-datei b{display:block;margin-bottom:2px;color:var(--text2);font-size:11px;text-transform:uppercase;letter-spacing:.04em} .dublette-pfad{color:var(--text3);word-break:break-all;line-height:1.35} .dublette-meta{color:var(--text2);margin-top:2px} .dublette-urteil{margin:8px 0;font-size:12px;line-height:1.4} .dublette-urteil.ok{color:var(--text2)} .dublette-urteil.warn{color:var(--danger)} .dublette-box .btn-danger{width:100%;padding:9px 14px;background:transparent;border:1px solid var(--danger);border-radius:var(--radius-sm);color:var(--danger);font-family:var(--font);font-size:13px;font-weight:600;cursor:pointer;transition:background .2s} .dublette-box .btn-danger:hover:not(:disabled){background:rgba(224,85,85,.12)} .dublette-box .btn-danger:disabled{opacity:.55;cursor:default} /* ── Warteschlange bearbeiten ── */ /* Griff und Entfernen-Knopf sitzen am rechten Rand beider Queue-Listen. Am Zeigergeraet erscheinen sie erst beim Ueberfahren, damit die Liste ruhig bleibt; auf Touch-Geraeten gibt es kein Ueberfahren, dort stehen sie immer da. */ .queue-item,.np-queue-item{position:relative} .q-del,.q-grip{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:none;color:var(--text3);border-radius:6px;cursor:pointer;opacity:0;transition:opacity .15s,color .15s,background .15s} .q-grip{cursor:grab;touch-action:none} .queue-item:hover .q-del,.queue-item:hover .q-grip, .np-queue-item:hover .q-del,.np-queue-item:hover .q-grip{opacity:1} .q-del:hover{color:var(--danger);background:rgba(224,85,85,.12)} .q-grip:hover{color:var(--text)} @media(hover:none){.q-del,.q-grip{opacity:.65}} /* Die gezogene Zeile schwebt ueber den anderen; die weichenden gleiten, sie nicht — sonst haengt sie dem Finger hinterher. */ .q-dragging{z-index:5;background:var(--surface2)!important;box-shadow:0 8px 24px rgba(0,0,0,.45);cursor:grabbing} .q-dragging .q-grip{cursor:grabbing} .q-dragging-aktiv [data-qidx]:not(.q-dragging){transition:transform .16s ease} .q-dragging-aktiv{user-select:none} /* ── Konzerte deiner Künstler ── */ /* Kalenderblatt statt Cover: ein Konzert hat kein Bild, aber ein Datum — und danach sucht das Auge in einer Liste, die nach vorn läuft. */ .konzert-datum{flex-shrink:0;width:46px;height:46px;border-radius:10px;background:var(--surface);border:1px solid var(--border2);display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1} .kd-tag{font-size:17px;font-weight:700;color:var(--text)} .kd-monat{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--text2);margin-top:2px} .konzert-ticket{font-size:12px;padding:6px 12px;white-space:nowrap;text-decoration:none;display:inline-block} .konzert-abgesagt .konzert-datum{opacity:.45} .konzert-abgesagt .artist-news-title{text-decoration:line-through;color:var(--text2)}