Add managed catalog sync and player UX improvements
This commit is contained in:
351
src/styles.css
351
src/styles.css
@@ -177,10 +177,6 @@ input:focus-visible,
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.player-layout.library-collapsed {
|
||||
/* desktop collapse handled by .sidebar-wrap */
|
||||
}
|
||||
|
||||
.station-library {
|
||||
position: relative;
|
||||
min-width: 0;
|
||||
@@ -261,6 +257,11 @@ input:focus-visible,
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.library-select-sort-icon {
|
||||
flex: 0 0 auto;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.library-select {
|
||||
min-width: 0;
|
||||
position: relative;
|
||||
@@ -709,6 +710,32 @@ input:focus-visible,
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.station-info-indicator {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border: 1px solid rgba(255, 132, 132, 0.32);
|
||||
border-radius: 999px;
|
||||
background: rgba(255, 132, 132, 0.14);
|
||||
color: #ffc2c2;
|
||||
font-size: 0.72rem;
|
||||
font-weight: 800;
|
||||
line-height: 1;
|
||||
cursor: help;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.station-info-indicator:focus-visible {
|
||||
outline: 2px solid rgba(255, 184, 184, 0.62);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
.station-info-indicator-inline {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.library-tag {
|
||||
max-width: 100%;
|
||||
padding: 4px 8px;
|
||||
@@ -721,6 +748,24 @@ input:focus-visible,
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.library-tag-healthy {
|
||||
border-color: rgba(132,242,168,0.34);
|
||||
background: rgba(132,242,168,0.14);
|
||||
color: #b6ffd0;
|
||||
}
|
||||
|
||||
.library-tag-warning {
|
||||
border-color: rgba(255, 184, 77, 0.34);
|
||||
background: rgba(255, 184, 77, 0.14);
|
||||
color: #ffd99a;
|
||||
}
|
||||
|
||||
.library-tag-proxy {
|
||||
border-color: rgba(255, 132, 132, 0.32);
|
||||
background: rgba(255, 132, 132, 0.14);
|
||||
color: #ffc2c2;
|
||||
}
|
||||
|
||||
.library-tag.muted {
|
||||
color: var(--text-soft);
|
||||
}
|
||||
@@ -1267,6 +1312,82 @@ header {
|
||||
border-color: rgba(255,255,255,0.28);
|
||||
}
|
||||
|
||||
/* ── Coverflow sparkle effects (box-shadow / border — no ::after needed) ── */
|
||||
|
||||
.coverflow-item.icon-flash,
|
||||
.coverflow-item.icon-gradient-sweep,
|
||||
.coverflow-item.icon-glow-pulse {
|
||||
/* Disable transition so CSS animation isn't fought by transition interpolation */
|
||||
transition: none !important;
|
||||
}
|
||||
|
||||
.coverflow-item.icon-flash {
|
||||
animation: icon-flash 0.8s ease-out forwards;
|
||||
}
|
||||
|
||||
.coverflow-item.icon-gradient-sweep {
|
||||
animation: icon-gradient-sweep 1.1s ease-out forwards;
|
||||
}
|
||||
|
||||
.coverflow-item.icon-glow-pulse {
|
||||
animation: icon-glow-pulse 1.4s ease-out forwards;
|
||||
}
|
||||
|
||||
/* Selected variants — start/end from the accent-tinted baseline */
|
||||
.coverflow-item.selected.icon-flash {
|
||||
animation: icon-flash-selected 0.8s ease-out forwards;
|
||||
}
|
||||
.coverflow-item.selected.icon-gradient-sweep {
|
||||
animation: icon-gradient-sweep-selected 1.1s ease-out forwards;
|
||||
}
|
||||
.coverflow-item.selected.icon-glow-pulse {
|
||||
animation: icon-glow-pulse-selected 1.4s ease-out forwards;
|
||||
}
|
||||
|
||||
/* Non-selected */
|
||||
@keyframes icon-flash {
|
||||
0% { box-shadow: 0 12px 28px rgba(0,0,0,0.28); border-color: var(--border); }
|
||||
20% { box-shadow: 0 0 0 3px rgba(255,255,255,0.9), 0 0 22px 4px rgba(255,255,255,0.55); border-color: rgba(255,255,255,0.95); }
|
||||
55% { box-shadow: 0 0 0 2px rgba(255,255,255,0.4), 0 0 12px 2px rgba(255,255,255,0.2); border-color: rgba(255,255,255,0.5); }
|
||||
100% { box-shadow: 0 12px 28px rgba(0,0,0,0.28); border-color: var(--border); }
|
||||
}
|
||||
|
||||
@keyframes icon-gradient-sweep {
|
||||
0% { box-shadow: 0 12px 28px rgba(0,0,0,0.28); border-color: var(--border); background: rgba(255,255,255,0.08); }
|
||||
15% { border-color: rgba(var(--accent-rgb), 0.9); }
|
||||
40% { box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.8), 0 0 24px 6px rgba(var(--accent-rgb), 0.45); background: rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 1); }
|
||||
80% { box-shadow: 0 0 0 1px rgba(var(--accent-rgb), 0.3), 0 12px 28px rgba(0,0,0,0.28); background: rgba(255,255,255,0.08); }
|
||||
100% { box-shadow: 0 12px 28px rgba(0,0,0,0.28); border-color: var(--border); background: rgba(255,255,255,0.08); }
|
||||
}
|
||||
|
||||
@keyframes icon-glow-pulse {
|
||||
0% { box-shadow: 0 12px 28px rgba(0,0,0,0.28); border-color: var(--border); }
|
||||
30% { box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.85), 0 0 28px 8px rgba(var(--accent-rgb), 0.5); border-color: rgba(var(--accent-rgb), 1); }
|
||||
65% { box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.4), 0 8px 28px rgba(var(--accent-rgb), 0.25); border-color: rgba(var(--accent-rgb), 0.55); }
|
||||
100% { box-shadow: 0 12px 28px rgba(0,0,0,0.28); border-color: var(--border); }
|
||||
}
|
||||
|
||||
/* Selected variants */
|
||||
@keyframes icon-flash-selected {
|
||||
0% { box-shadow: 0 14px 34px rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 0.48); }
|
||||
20% { box-shadow: 0 0 0 3px rgba(255,255,255,0.95), 0 0 26px 6px rgba(255,255,255,0.5); border-color: rgba(255,255,255,0.95); }
|
||||
55% { box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.6), 0 0 16px 3px rgba(var(--accent-rgb), 0.35); border-color: rgba(var(--accent-rgb), 0.75); }
|
||||
100% { box-shadow: 0 14px 34px rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 0.48); }
|
||||
}
|
||||
|
||||
@keyframes icon-gradient-sweep-selected {
|
||||
0% { box-shadow: 0 14px 34px rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 0.48); }
|
||||
40% { box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 1), 0 0 32px 8px rgba(var(--accent-rgb), 0.6); border-color: rgba(var(--accent-rgb), 1); }
|
||||
100% { box-shadow: 0 14px 34px rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 0.48); }
|
||||
}
|
||||
|
||||
@keyframes icon-glow-pulse-selected {
|
||||
0% { box-shadow: 0 14px 34px rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 0.48); }
|
||||
30% { box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 1), 0 0 32px 10px rgba(var(--accent-rgb), 0.65); border-color: rgba(var(--accent-rgb), 1); }
|
||||
65% { box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.55), 0 8px 28px rgba(var(--accent-rgb), 0.38); border-color: rgba(var(--accent-rgb), 0.7); }
|
||||
100% { box-shadow: 0 14px 34px rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 0.48); }
|
||||
}
|
||||
|
||||
.coverflow-item img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@@ -1361,6 +1482,67 @@ header {
|
||||
font-size: 0.98rem;
|
||||
}
|
||||
|
||||
.station-health-summary {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
width: fit-content;
|
||||
margin-top: 12px;
|
||||
padding: 5px 10px;
|
||||
border: 1px solid rgba(255,255,255,0.14);
|
||||
border-radius: 999px;
|
||||
background: rgba(255,255,255,0.06);
|
||||
color: var(--text-main);
|
||||
font-size: 0.76rem;
|
||||
font-weight: 800;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.station-health-summary-info {
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.station-info-indicator-player {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.station-health-summary-healthy {
|
||||
border-color: rgba(132,242,168,0.34);
|
||||
background: rgba(132,242,168,0.14);
|
||||
color: #b6ffd0;
|
||||
}
|
||||
|
||||
.station-health-summary-warning {
|
||||
border-color: rgba(255, 184, 77, 0.34);
|
||||
background: rgba(255, 184, 77, 0.14);
|
||||
color: #ffd99a;
|
||||
}
|
||||
|
||||
.station-health-summary-proxy {
|
||||
border-color: rgba(255, 132, 132, 0.32);
|
||||
background: rgba(255, 132, 132, 0.14);
|
||||
color: #ffc2c2;
|
||||
}
|
||||
|
||||
.station-health-detail {
|
||||
margin-top: 7px;
|
||||
color: var(--text-soft);
|
||||
font-size: 0.82rem;
|
||||
line-height: 1.35;
|
||||
max-width: 54ch;
|
||||
}
|
||||
|
||||
.station-health-detail-warning {
|
||||
color: #ffd99a;
|
||||
}
|
||||
|
||||
.station-health-detail-proxy {
|
||||
color: #ffc2c2;
|
||||
}
|
||||
|
||||
.status-indicator-wrap {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
@@ -1371,6 +1553,14 @@ header {
|
||||
font-size: 0.88rem;
|
||||
}
|
||||
|
||||
.managed-catalog-status {
|
||||
margin-top: 8px;
|
||||
color: var(--text-soft);
|
||||
font-size: 0.76rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
|
||||
.status-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
@@ -1404,6 +1594,11 @@ header {
|
||||
box-shadow: 0 0 14px rgba(143,179,255,0.12);
|
||||
}
|
||||
|
||||
.engine-airplay {
|
||||
border-color: rgba(77,215,200,0.52);
|
||||
box-shadow: 0 0 14px rgba(77,215,200,0.14);
|
||||
}
|
||||
|
||||
.engine-html {
|
||||
border-color: rgba(255,255,255,0.18);
|
||||
}
|
||||
@@ -1736,6 +1931,39 @@ input[type=range]::-webkit-slider-thumb {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.station-card-health {
|
||||
margin-top: 7px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
width: fit-content;
|
||||
padding: 3px 8px;
|
||||
border: 1px solid rgba(255,255,255,0.14);
|
||||
border-radius: 999px;
|
||||
background: rgba(255,255,255,0.06);
|
||||
color: var(--text-main);
|
||||
font-size: 0.7rem;
|
||||
font-weight: 800;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.station-card-health-healthy {
|
||||
border-color: rgba(132,242,168,0.34);
|
||||
background: rgba(132,242,168,0.14);
|
||||
color: #b6ffd0;
|
||||
}
|
||||
|
||||
.station-card-health-warning {
|
||||
border-color: rgba(255, 184, 77, 0.34);
|
||||
background: rgba(255, 184, 77, 0.14);
|
||||
color: #ffd99a;
|
||||
}
|
||||
|
||||
.station-card-health-proxy {
|
||||
border-color: rgba(255, 132, 132, 0.32);
|
||||
background: rgba(255, 132, 132, 0.14);
|
||||
color: #ffc2c2;
|
||||
}
|
||||
|
||||
.device {
|
||||
margin-bottom: 10px;
|
||||
padding: 13px 14px;
|
||||
@@ -1773,6 +2001,52 @@ input[type=range]::-webkit-slider-thumb {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.editor-tools {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.editor-tools .btn {
|
||||
flex: 1 1 160px;
|
||||
}
|
||||
|
||||
.hidden-file-input {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.editor-note {
|
||||
margin: 0 0 12px;
|
||||
color: var(--text-muted);
|
||||
font-size: 0.82rem;
|
||||
}
|
||||
|
||||
.editor-note strong {
|
||||
color: var(--text-main);
|
||||
}
|
||||
|
||||
.editor-note-subtle {
|
||||
margin-top: -4px;
|
||||
font-size: 0.78rem;
|
||||
}
|
||||
|
||||
.editor-checkbox {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin: -4px 0 16px;
|
||||
color: var(--text-muted);
|
||||
font-size: 0.82rem;
|
||||
}
|
||||
|
||||
.editor-checkbox input {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin: 0;
|
||||
accent-color: var(--accent);
|
||||
}
|
||||
|
||||
.field-row {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
@@ -1861,6 +2135,12 @@ input[type=range]::-webkit-slider-thumb {
|
||||
background: rgba(143,179,255,0.14);
|
||||
}
|
||||
|
||||
.cast-btn.cast-airplay-active,
|
||||
.cast-btn.cast-airplay-active:hover {
|
||||
border-color: rgba(77,215,200,0.56);
|
||||
background: rgba(77,215,200,0.15);
|
||||
}
|
||||
|
||||
@media (max-width: 1100px) {
|
||||
body.library-open {
|
||||
overflow: hidden;
|
||||
@@ -1937,7 +2217,7 @@ input[type=range]::-webkit-slider-thumb {
|
||||
min-height: 100dvh;
|
||||
width: 100%;
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: auto minmax(0, 1fr) auto auto auto auto auto auto;
|
||||
grid-template-rows: auto auto auto auto auto auto auto auto;
|
||||
grid-template-areas:
|
||||
"header"
|
||||
"artwork"
|
||||
@@ -2131,13 +2411,18 @@ input[type=range]::-webkit-slider-thumb {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
#station-health-detail {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.artwork-stack {
|
||||
width: 100%;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.artwork-container {
|
||||
width: min(34vw, 132px);
|
||||
width: min(34vw, 132px, 22dvh);
|
||||
max-height: min(132px, 22dvh);
|
||||
padding: 4px;
|
||||
border-radius: 18px;
|
||||
}
|
||||
@@ -2183,7 +2468,7 @@ input[type=range]::-webkit-slider-thumb {
|
||||
}
|
||||
|
||||
.track-info {
|
||||
min-height: 108px;
|
||||
min-height: 72px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
@@ -2363,10 +2648,12 @@ input[type=range]::-webkit-slider-thumb {
|
||||
.editor-station-actions,
|
||||
.editor-actions {
|
||||
width: 100%;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.editor-station-actions .btn,
|
||||
.editor-actions .btn {
|
||||
.editor-actions .btn,
|
||||
.editor-tools .btn {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
@@ -2395,6 +2682,54 @@ input[type=range]::-webkit-slider-thumb {
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 761px) and (max-height: 860px) {
|
||||
#station-subtitle,
|
||||
#managed-catalog-status,
|
||||
#cast-output-row,
|
||||
#station-health-detail {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.artwork-container {
|
||||
width: min(100%, 360px);
|
||||
}
|
||||
|
||||
.track-info h2 {
|
||||
font-size: clamp(1.9rem, 4vw, 2.8rem);
|
||||
}
|
||||
|
||||
.status-indicator-wrap {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.station-health-summary {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 760px) and (max-height: 650px) {
|
||||
.artwork-container {
|
||||
width: min(26vw, 100px, 16dvh);
|
||||
}
|
||||
|
||||
.artwork-coverflow {
|
||||
height: 56px;
|
||||
}
|
||||
|
||||
.coverflow-item {
|
||||
width: 50px;
|
||||
height: 44px;
|
||||
}
|
||||
|
||||
.track-info {
|
||||
min-height: 72px;
|
||||
}
|
||||
|
||||
.track-info h2 {
|
||||
font-size: clamp(1.25rem, 7vw, 1.8rem);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 380px) {
|
||||
.glass-card {
|
||||
padding: 13px;
|
||||
|
||||
Reference in New Issue
Block a user