fix: improve contrast and theming for enlarged cover view and hover colors
This commit is contained in:
parent
8361d31408
commit
66e384a591
2 changed files with 37 additions and 10 deletions
15
js/ui.js
15
js/ui.js
|
|
@ -216,8 +216,10 @@ export class UIRenderer {
|
||||||
if (backgroundSettings.isEnabled() && imageUrl) {
|
if (backgroundSettings.isEnabled() && imageUrl) {
|
||||||
bgElement.style.backgroundImage = `url('${imageUrl}')`;
|
bgElement.style.backgroundImage = `url('${imageUrl}')`;
|
||||||
bgElement.classList.add('active');
|
bgElement.classList.add('active');
|
||||||
|
document.body.classList.add('has-page-background');
|
||||||
} else {
|
} else {
|
||||||
bgElement.classList.remove('active');
|
bgElement.classList.remove('active');
|
||||||
|
document.body.classList.remove('has-page-background');
|
||||||
// Delay clearing the image to allow transition
|
// Delay clearing the image to allow transition
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (!bgElement.classList.contains('active')) {
|
if (!bgElement.classList.contains('active')) {
|
||||||
|
|
@ -247,6 +249,18 @@ export class UIRenderer {
|
||||||
root.style.setProperty('--highlight-rgb', `${r}, ${g}, ${b}`);
|
root.style.setProperty('--highlight-rgb', `${r}, ${g}, ${b}`);
|
||||||
root.style.setProperty('--active-highlight', color);
|
root.style.setProperty('--active-highlight', color);
|
||||||
root.style.setProperty('--ring', color);
|
root.style.setProperty('--ring', color);
|
||||||
|
|
||||||
|
// Calculate a safe hover color (darken if too light)
|
||||||
|
let hoverColor;
|
||||||
|
if (brightness > 200) {
|
||||||
|
const dr = Math.floor(r * 0.85);
|
||||||
|
const dg = Math.floor(g * 0.85);
|
||||||
|
const db = Math.floor(b * 0.85);
|
||||||
|
hoverColor = `rgba(${dr}, ${dg}, ${db}, 0.25)`;
|
||||||
|
} else {
|
||||||
|
hoverColor = `rgba(${r}, ${g}, ${b}, 0.15)`;
|
||||||
|
}
|
||||||
|
root.style.setProperty('--track-hover-bg', hoverColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
resetVibrantColor() {
|
resetVibrantColor() {
|
||||||
|
|
@ -257,6 +271,7 @@ export class UIRenderer {
|
||||||
root.style.removeProperty('--highlight-rgb');
|
root.style.removeProperty('--highlight-rgb');
|
||||||
root.style.removeProperty('--active-highlight');
|
root.style.removeProperty('--active-highlight');
|
||||||
root.style.removeProperty('--ring');
|
root.style.removeProperty('--ring');
|
||||||
|
root.style.removeProperty('--track-hover-bg');
|
||||||
}
|
}
|
||||||
|
|
||||||
showFullscreenCover(track, nextTrack) {
|
showFullscreenCover(track, nextTrack) {
|
||||||
|
|
|
||||||
32
styles.css
32
styles.css
|
|
@ -12,6 +12,7 @@
|
||||||
--shadow-md: 0 6px 16px rgba(0, 0, 0, 0.2);
|
--shadow-md: 0 6px 16px rgba(0, 0, 0, 0.2);
|
||||||
--shadow-lg: 0 10px 30px rgba(0, 0, 0, 0.5);
|
--shadow-lg: 0 10px 30px rgba(0, 0, 0, 0.5);
|
||||||
--shadow-xl: 0 20px 60px rgba(0, 0, 0, 0.8);
|
--shadow-xl: 0 20px 60px rgba(0, 0, 0, 0.8);
|
||||||
|
--cover-filter: blur(30px) brightness(0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
:root[data-theme="monochrome"] {
|
:root[data-theme="monochrome"] {
|
||||||
|
|
@ -32,6 +33,7 @@
|
||||||
--highlight-rgb: 255, 255, 255;
|
--highlight-rgb: 255, 255, 255;
|
||||||
--active-highlight: var(--highlight);
|
--active-highlight: var(--highlight);
|
||||||
--explicit-badge: #fafafa;
|
--explicit-badge: #fafafa;
|
||||||
|
--cover-filter: blur(30px) brightness(0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
:root[data-theme="dark"] {
|
:root[data-theme="dark"] {
|
||||||
|
|
@ -133,6 +135,7 @@
|
||||||
--active-highlight: var(--highlight);
|
--active-highlight: var(--highlight);
|
||||||
--explicit-badge: #ef4444;
|
--explicit-badge: #ef4444;
|
||||||
--explicit-badge-foreground: #ffffff;
|
--explicit-badge-foreground: #ffffff;
|
||||||
|
--cover-filter: blur(30px) brightness(1.1) opacity(0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
*, *::before, *::after {
|
*, *::before, *::after {
|
||||||
|
|
@ -373,6 +376,14 @@ kbd {
|
||||||
border-color: var(--ring);
|
border-color: var(--ring);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.has-page-background .search-bar input {
|
||||||
|
background-color: var(--background);
|
||||||
|
}
|
||||||
|
|
||||||
|
body.has-page-background .track-item:hover {
|
||||||
|
background-color: var(--track-hover-bg, var(--secondary));
|
||||||
|
}
|
||||||
|
|
||||||
.page {
|
.page {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
@ -1234,7 +1245,7 @@ input:checked + .slider::before {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
animation: fadeIn 0.3s ease;
|
animation: fadeIn 0.3s ease;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background-color: #000; /* Solid background to prevent see-through */
|
background-color: var(--background);
|
||||||
/* Use a CSS variable for the image so we can set it in JS */
|
/* Use a CSS variable for the image so we can set it in JS */
|
||||||
--bg-image: none;
|
--bg-image: none;
|
||||||
padding-bottom: 90px; /* Account for desktop player bar */
|
padding-bottom: 90px; /* Account for desktop player bar */
|
||||||
|
|
@ -1247,7 +1258,7 @@ input:checked + .slider::before {
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
filter: blur(30px) brightness(0.4);
|
filter: var(--cover-filter);
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
background-image: var(--bg-image);
|
background-image: var(--bg-image);
|
||||||
}
|
}
|
||||||
|
|
@ -1268,9 +1279,9 @@ input:checked + .slider::before {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 1rem;
|
top: 1rem;
|
||||||
right: 1rem;
|
right: 1rem;
|
||||||
background: rgba(0, 0, 0, 0.5);
|
background-color: var(--background);
|
||||||
border: none;
|
border: none;
|
||||||
color: #fff;
|
color: var(--foreground);
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
width: 48px;
|
width: 48px;
|
||||||
height: 48px;
|
height: 48px;
|
||||||
|
|
@ -1279,12 +1290,13 @@ input:checked + .slider::before {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
transition: background-color 0.2s;
|
transition: opacity 0.2s;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
#close-fullscreen-cover-btn:hover {
|
#close-fullscreen-cover-btn:hover {
|
||||||
background-color: rgba(0, 0, 0, 0.8);
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-cover-image {
|
#fullscreen-cover-image {
|
||||||
|
|
@ -1307,14 +1319,14 @@ input:checked + .slider::before {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
color: #ffffff;
|
color: var(--foreground);
|
||||||
text-shadow: 0 2px 10px rgba(0,0,0,0.5);
|
text-shadow: 0 2px 10px rgba(0,0,0,0.5);
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-track-artist {
|
#fullscreen-track-artist {
|
||||||
font-size: 1.25rem;
|
font-size: 1.25rem;
|
||||||
color: rgba(255, 255, 255, 0.8);
|
color: var(--muted-foreground);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
text-shadow: 0 2px 10px rgba(0,0,0,0.5);
|
text-shadow: 0 2px 10px rgba(0,0,0,0.5);
|
||||||
}
|
}
|
||||||
|
|
@ -1322,7 +1334,7 @@ input:checked + .slider::before {
|
||||||
#fullscreen-next-track {
|
#fullscreen-next-track {
|
||||||
margin-top: 1.5rem;
|
margin-top: 1.5rem;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
color: rgba(255, 255, 255, 0.6);
|
color: var(--muted-foreground);
|
||||||
text-shadow: 0 1px 4px rgba(0,0,0,0.5);
|
text-shadow: 0 1px 4px rgba(0,0,0,0.5);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
@ -1343,7 +1355,7 @@ input:checked + .slider::before {
|
||||||
|
|
||||||
#fullscreen-next-track .value {
|
#fullscreen-next-track .value {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: rgba(255, 255, 255, 0.9);
|
color: var(--foreground);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue