add lyrics toggle for mobile
This commit is contained in:
parent
4dd3ec1a0c
commit
daa553488f
3 changed files with 100 additions and 18 deletions
|
|
@ -261,6 +261,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="fullscreen-controls">
|
<div class="fullscreen-controls">
|
||||||
|
<div id="fullscreen-mobile-quality" class="fullscreen-mobile-quality" aria-hidden="true"></div>
|
||||||
<div class="fullscreen-progress-container">
|
<div class="fullscreen-progress-container">
|
||||||
<span id="fs-current-time">0:00</span>
|
<span id="fs-current-time">0:00</span>
|
||||||
<div id="fs-progress-bar" class="progress-bar">
|
<div id="fs-progress-bar" class="progress-bar">
|
||||||
|
|
@ -284,7 +285,6 @@
|
||||||
<button id="fs-repeat-btn" title="Repeat">
|
<button id="fs-repeat-btn" title="Repeat">
|
||||||
<use svg="!lucide/repeat.svg" size="24" />
|
<use svg="!lucide/repeat.svg" size="24" />
|
||||||
</button>
|
</button>
|
||||||
<button id="fs-quality-btn" class="fs-quality-btn" title="Quality" style="display: none">
|
|
||||||
<button id="fs-quality-btn" class="fs-quality-btn" title="Quality" style="display: none">
|
<button id="fs-quality-btn" class="fs-quality-btn" title="Quality" style="display: none">
|
||||||
<use svg="!lucide/pencil-line.svg" size="20" />
|
<use svg="!lucide/pencil-line.svg" size="20" />
|
||||||
<span class="fs-quality-label">Auto</span>
|
<span class="fs-quality-label">Auto</span>
|
||||||
|
|
|
||||||
20
js/ui.js
20
js/ui.js
|
|
@ -1303,8 +1303,7 @@ export class UIRenderer {
|
||||||
await this.extractAndApplyColor(this.api.getCoverUrl(track.album?.cover, '80'));
|
await this.extractAndApplyColor(this.api.getCoverUrl(track.album?.cover, '80'));
|
||||||
}
|
}
|
||||||
|
|
||||||
const qualityBadge = this.getFullscreenQualityBadgeHTML(track);
|
this.updateFullscreenQualityBadgePlacement(track, overlay);
|
||||||
title.innerHTML = `${escapeHtml(track.title)} ${qualityBadge}`;
|
|
||||||
artist.textContent = getTrackArtists(track);
|
artist.textContent = getTrackArtists(track);
|
||||||
|
|
||||||
if (nextTrack) {
|
if (nextTrack) {
|
||||||
|
|
@ -1400,6 +1399,7 @@ export class UIRenderer {
|
||||||
const shouldShowLyrics = this.fullscreenLyricsVisible && !lyricsUnavailable;
|
const shouldShowLyrics = this.fullscreenLyricsVisible && !lyricsUnavailable;
|
||||||
|
|
||||||
overlay.classList.toggle('lyrics-hidden', !shouldShowLyrics);
|
overlay.classList.toggle('lyrics-hidden', !shouldShowLyrics);
|
||||||
|
this.updateFullscreenQualityBadgePlacement(this.player?.currentTrack, overlay);
|
||||||
|
|
||||||
lyricsToggleButtons.forEach((lyricsToggleBtn) => {
|
lyricsToggleButtons.forEach((lyricsToggleBtn) => {
|
||||||
lyricsToggleBtn.classList.toggle('active', shouldShowLyrics);
|
lyricsToggleBtn.classList.toggle('active', shouldShowLyrics);
|
||||||
|
|
@ -1413,6 +1413,22 @@ export class UIRenderer {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateFullscreenQualityBadgePlacement(track, overlay = document.getElementById('fullscreen-cover-overlay')) {
|
||||||
|
if (!track || !overlay) return;
|
||||||
|
|
||||||
|
const title = document.getElementById('fullscreen-track-title');
|
||||||
|
const mobileQuality = document.getElementById('fullscreen-mobile-quality');
|
||||||
|
if (!title) return;
|
||||||
|
|
||||||
|
const qualityBadge = this.getFullscreenQualityBadgeHTML(track);
|
||||||
|
const useMobileBadgeOnly = window.matchMedia('(max-width: 768px)').matches && overlay.classList.contains('lyrics-hidden');
|
||||||
|
|
||||||
|
title.innerHTML = useMobileBadgeOnly ? escapeHtml(track.title) : `${escapeHtml(track.title)} ${qualityBadge}`;
|
||||||
|
if (mobileQuality) {
|
||||||
|
mobileQuality.innerHTML = useMobileBadgeOnly ? qualityBadge : '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async dismissFullscreenCover({ animate = true } = {}) {
|
async dismissFullscreenCover({ animate = true } = {}) {
|
||||||
const overlay = document.getElementById('fullscreen-cover-overlay');
|
const overlay = document.getElementById('fullscreen-cover-overlay');
|
||||||
if (!overlay || overlay.style.display === 'none') return;
|
if (!overlay || overlay.style.display === 'none') return;
|
||||||
|
|
|
||||||
96
styles.css
96
styles.css
|
|
@ -3987,6 +3987,9 @@ input:checked + .slider::before {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
@ -10112,6 +10115,9 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
@ -10665,6 +10671,10 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
#fullscreen-cover-overlay .fullscreen-main-view {
|
#fullscreen-cover-overlay .fullscreen-main-view {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
grid-template-columns: minmax(78px, 92px) minmax(0, 1fr);
|
grid-template-columns: minmax(78px, 92px) minmax(0, 1fr);
|
||||||
grid-template-rows: auto minmax(0, 1fr) auto;
|
grid-template-rows: auto minmax(0, 1fr) auto;
|
||||||
grid-template-areas:
|
grid-template-areas:
|
||||||
|
|
@ -10682,12 +10692,14 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
#fullscreen-cover-overlay .fullscreen-media-column {
|
#fullscreen-cover-overlay .fullscreen-media-column {
|
||||||
display: contents;
|
display: contents;
|
||||||
width: auto;
|
width: auto;
|
||||||
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay .fullscreen-artwork-card {
|
#fullscreen-cover-overlay .fullscreen-artwork-card {
|
||||||
grid-area: art;
|
grid-area: art;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 92px;
|
max-width: 92px;
|
||||||
|
box-sizing: border-box;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
align-self: start;
|
align-self: start;
|
||||||
margin-left: 0.95rem;
|
margin-left: 0.95rem;
|
||||||
|
|
@ -10736,7 +10748,10 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
#fullscreen-cover-overlay .fullscreen-lyrics-pane {
|
#fullscreen-cover-overlay .fullscreen-lyrics-pane {
|
||||||
grid-area: lyrics;
|
grid-area: lyrics;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
|
min-width: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
justify-self: stretch;
|
justify-self: stretch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10776,11 +10791,17 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
grid-area: controls;
|
grid-area: controls;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: none;
|
max-width: none;
|
||||||
|
min-width: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
padding: 0.15rem 0 0;
|
padding: 0.15rem 0 0;
|
||||||
gap: 0.9rem;
|
gap: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#fullscreen-cover-overlay .fullscreen-mobile-quality {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay .fullscreen-volume-container {
|
#fullscreen-cover-overlay .fullscreen-volume-container {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
@ -10807,32 +10828,48 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-main-view {
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-main-view {
|
||||||
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1fr);
|
grid-template-columns: minmax(0, 1fr);
|
||||||
grid-template-rows: minmax(0, 1fr) auto auto auto;
|
grid-template-rows: minmax(0, 1fr) auto minmax(0, 1fr) auto;
|
||||||
grid-template-areas:
|
align-items: center;
|
||||||
'.'
|
|
||||||
'art'
|
|
||||||
'info'
|
|
||||||
'controls';
|
|
||||||
align-content: stretch;
|
|
||||||
justify-items: center;
|
justify-items: center;
|
||||||
gap: 0.95rem;
|
gap: 0;
|
||||||
padding:
|
padding:
|
||||||
calc(4.45rem + env(safe-area-inset-top))
|
calc(4.45rem + env(safe-area-inset-top))
|
||||||
0
|
clamp(1rem, 4vw, 1.4rem)
|
||||||
calc(0.8rem + env(safe-area-inset-bottom))
|
calc(0.8rem + env(safe-area-inset-bottom))
|
||||||
0;
|
clamp(1rem, 4vw, 1.4rem);
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-lyrics-pane {
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-lyrics-pane {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-media-column {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
grid-row: 2;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
align-self: center;
|
||||||
|
width: min(100%, 320px);
|
||||||
|
max-width: min(88vw, 320px);
|
||||||
|
min-height: 0;
|
||||||
|
min-width: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-artwork-card {
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-artwork-card {
|
||||||
max-width: min(88vw, 320px);
|
max-width: min(88vw, 320px);
|
||||||
width: min(88vw, 320px);
|
width: min(100%, 320px);
|
||||||
margin-left: 0;
|
margin: 0 auto;
|
||||||
|
align-self: center;
|
||||||
justify-self: center;
|
justify-self: center;
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
box-shadow: 0 24px 56px rgb(0 0 0 / 0.28);
|
box-shadow: 0 24px 56px rgb(0 0 0 / 0.28);
|
||||||
|
|
@ -10843,15 +10880,17 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-track-info {
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-track-info {
|
||||||
align-self: start;
|
align-self: center;
|
||||||
justify-self: center;
|
width: min(100%, 320px);
|
||||||
width: min(88vw, 320px);
|
|
||||||
padding: 0;
|
padding: 0;
|
||||||
gap: 0.3rem;
|
gap: 0.3rem;
|
||||||
|
margin-top: 0.9rem;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-track-text {
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-track-text {
|
||||||
gap: 0.2rem;
|
gap: 0.2rem;
|
||||||
|
justify-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay.lyrics-hidden #fullscreen-track-title {
|
#fullscreen-cover-overlay.lyrics-hidden #fullscreen-track-title {
|
||||||
|
|
@ -10864,6 +10903,33 @@ body:has(#side-panel.active) #close-fullscreen-cover-btn {
|
||||||
color: rgb(255 255 255 / 0.66);
|
color: rgb(255 255 255 / 0.66);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-controls {
|
||||||
|
grid-row: 4;
|
||||||
|
width: min(100%, 320px);
|
||||||
|
max-width: min(88vw, 320px);
|
||||||
|
justify-self: center;
|
||||||
|
align-self: end;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fullscreen-cover-overlay.lyrics-hidden #fullscreen-track-title .quality-badge,
|
||||||
|
#fullscreen-cover-overlay.lyrics-hidden #fullscreen-track-title .shaka-quality-badge {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-mobile-quality {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 1.25rem;
|
||||||
|
margin: 0 auto -0.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-mobile-quality .quality-badge,
|
||||||
|
#fullscreen-cover-overlay.lyrics-hidden .fullscreen-mobile-quality .shaka-quality-badge {
|
||||||
|
display: inline-flex !important;
|
||||||
|
}
|
||||||
|
|
||||||
#fullscreen-cover-overlay .fullscreen-volume-container {
|
#fullscreen-cover-overlay .fullscreen-volume-container {
|
||||||
width: min(280px, calc(100% - 3rem));
|
width: min(280px, calc(100% - 3rem));
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue