Files
Psychotoxical-psysonic/src/styles/components/offline-library.css
T
cucadmuh ea6ac49885 feat(offline): Offline Library shows cached albums from all servers (#719)
* feat(offline): show cached albums from all servers in Offline Library

List every offline album regardless of active server; load cover art per
source server and switch before play/enqueue. Sidebar, mobile nav, and
disconnect auto-nav use any cached content; multi-server cards show a label.

* docs(changelog): link offline library PR #719

* chore(pr-719): address review — CHANGELOG in Added, helper tests

Move release note to ## Added per team changelog policy; cover
offlineAlbumCoverArt and ensureServerForOfflineAlbum in unit tests.
2026-05-15 17:20:19 +03:00

205 lines
3.7 KiB
CSS

/* ─── Offline Library ─── */
.offline-library {
padding: var(--space-6);
display: flex;
flex-direction: column;
gap: var(--space-6);
}
.offline-library-header {
display: flex;
align-items: center;
gap: 14px;
color: var(--accent);
}
.offline-library-title {
font-size: 22px;
font-weight: 700;
color: var(--text-primary);
margin: 0;
}
.offline-library-count {
font-size: 13px;
color: var(--text-secondary);
margin: 2px 0 0;
}
.offline-library-server {
font-size: 10px;
color: var(--text-muted);
margin: 0;
}
.offline-library-card .album-card-info {
gap: 3px;
}
.offline-library-card-meta {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 2px;
}
.offline-library-enqueue {
background: none;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-muted);
font-size: 10px;
padding: 2px 6px;
cursor: pointer;
transition: color var(--transition-fast), border-color var(--transition-fast);
}
.offline-library-enqueue:hover {
color: var(--accent);
border-color: var(--accent);
}
.offline-library-tracks {
font-size: 10px;
color: var(--text-muted);
}
.offline-library-delete {
background: none;
border: none;
padding: 2px 4px;
cursor: pointer;
color: var(--text-muted);
display: flex;
align-items: center;
border-radius: var(--radius-sm);
transition: color var(--transition-fast);
}
.offline-library-delete:hover {
color: var(--color-error, #e05050);
}
/* Filter tabs */
.offline-filter-tabs {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.offline-filter-tab {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border-radius: 20px;
border: 1px solid var(--border);
background: none;
color: var(--text-secondary);
font-size: 13px;
cursor: pointer;
transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.offline-filter-tab:hover {
color: var(--text-primary);
border-color: var(--accent);
}
.offline-filter-tab.active {
background: var(--accent);
color: var(--ctp-base);
border-color: var(--accent);
font-weight: 600;
}
.offline-filter-tab-count {
font-size: 11px;
opacity: 0.75;
}
.offline-filter-tab.active .offline-filter-tab-count {
opacity: 0.85;
}
/* Artist discography groups */
.offline-artist-group {
display: flex;
flex-direction: column;
gap: 12px;
}
.offline-artist-group-heading {
font-size: 16px;
font-weight: 700;
color: var(--text-primary);
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
}
.album-detail {
display: flex;
flex-direction: column;
gap: 0;
position: relative;
}
.album-detail-header {
position: relative;
padding: var(--space-6) var(--space-6) 0;
overflow: hidden;
}
.album-detail-bg {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
z-index: 0;
opacity: 0.35;
transition: opacity var(--transition-slow);
}
.album-detail-overlay {
position: absolute;
inset: 0;
background: linear-gradient(to bottom,
rgba(30, 30, 46, 0.5) 0%,
var(--bg-app) 100%);
z-index: 0;
}
.album-detail-hero {
display: flex;
gap: var(--space-6);
align-items: flex-start;
padding: var(--space-4) 0 var(--space-6);
}
.album-detail-cover-btn {
padding: 0;
border-radius: var(--radius-lg);
flex-shrink: 0;
cursor: zoom-in;
position: relative;
overflow: hidden;
display: block;
width: clamp(120px, 15vw, 200px);
height: clamp(120px, 15vw, 200px);
}
.album-detail-cover-btn:hover .album-detail-cover {
transform: scale(1.04);
}
.album-detail-cover {
width: 100%;
height: 100%;
border-radius: var(--radius-lg);
object-fit: cover;
box-shadow: var(--shadow-lg);
display: block;
transition: transform 0.2s ease;
}