feat: queue-ux-improvements (#419)

* feat(queue): add ETA display, equalizer indicator and collapsible now playing

* deleted endsAt and showDuration strings, changed eta update to 30s

* feat(queue): ETA tooltip, persistent Now Playing collapse, EQ bar pause, remove redundant Play icon

* feat(queue): fold ETA into existing total/remaining toggle as third mode

The standalone ETA span next to the track counter is removed; instead the
clickable duration label in the queue header now rotates through three
modes per click: total → remaining → eta → total. Counter (N/M) stays
where it was.

ETA mode keeps the live-feel treatment from the original PR (accent
colour while playing, muted at 50% opacity when paused). The other two
modes use plain accent.

i18n: queue.etaTooltip removed (no longer a separate descriptive label),
queue.showEta added as the action tooltip ('Show estimated end time')
in all 8 locales — matches the showRemaining / showTotal pattern.

* docs(changelog): add #419 queue UX improvements entry

Adds the [1.45.0] / Added entry for this PR's queue panel refinements
(position counter, tri-state duration toggle including ETA, collapsible
Now Playing section, animated EQ indicator).

---------

Co-authored-by: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com>
This commit is contained in:
Kveld.
2026-05-02 16:45:55 -03:00
committed by GitHub
parent 5662dafe97
commit 18b4a982ef
33 changed files with 10115 additions and 1498 deletions
+3 -20
View File
@@ -915,8 +915,6 @@ export const deTranslation = {
sidebarLyricsStyleAppleDesc: 'Aktive Zeile oben mit sanfter Animation.',
seekbarStyle: 'Seekbar-Stil',
seekbarStyleDesc: 'Aussehen der Wiedergabe-Seekbar auswählen',
reducedAnimations: 'Animationen reduzieren',
reducedAnimationsDesc: 'Animierte Seekbar-Stile auf 30 fps drosseln, um die GPU-Last auf schwächerer Hardware zu senken. Optisch kaum wahrnehmbar.',
seekbarTruewave: 'Echte Wellenform',
seekbarPseudowave: 'Pseudo-Wellenform',
seekbarLinedot: 'Linie & Punkt',
@@ -1109,6 +1107,8 @@ export const deTranslation = {
autoAdded: '— Automatisch hinzugefügt —',
radioAdded: '— Radio —',
hide: 'Verbergen',
hideNowPlaying: 'Wiedergabeinformationen ausblenden',
showNowPlaying: 'Wiedergabeinformationen anzeigen',
close: 'Schließen',
nextTracks: 'Nächste Titel',
shareQueue: 'Warteschlangen-Link kopieren',
@@ -1118,6 +1118,7 @@ export const deTranslation = {
trackPlural: 'Titel',
showRemaining: 'Restzeit anzeigen',
showTotal: 'Gesamtzeit anzeigen',
showEta: 'Endzeit anzeigen',
replayGain: 'ReplayGain',
rgTrack: 'T {{db}} dB',
rgAlbum: 'A {{db}} dB',
@@ -1181,24 +1182,6 @@ export const deTranslation = {
topRatedArtists: 'Bestbewertete Künstler',
noRatedSongs: 'Noch keine bewerteten Songs. Songs in Album- oder Playlist-Ansicht bewerten.',
noRatedArtists: 'Noch keine bewerteten Künstler.',
exportShare: 'Teilen',
exportTitle: 'Top-Alben teilen',
exportSubtitle: 'Ein teilbares Bild deiner meistgespielten Alben erstellen.',
exportFormat: 'Format',
exportFormatStory: 'Story',
exportFormatSquare: 'Quadrat',
exportFormatTwitter: 'Twitter-Card',
exportGrid: 'Raster',
exportGridLabel: '{{n}}×{{n}}',
exportPreview: 'Vorschau',
exportGenerate: 'Erstellen',
exportSave: 'Bild speichern…',
exportCancel: 'Abbrechen',
exportFooterLabel: 'Top-Alben',
exportNotEnough: 'Für ein {{n}}×{{n}}-Raster braucht es mindestens {{count}} Alben in der Library.',
exportSaving: 'Speichere…',
exportSaved: 'Gespeichert.',
exportSaveFailed: 'Bild konnte nicht gespeichert werden.',
},
player: {
regionLabel: 'Musikplayer',
+3 -20
View File
@@ -921,8 +921,6 @@ export const enTranslation = {
fsPortraitDim: 'Photo dimming',
seekbarStyle: 'Seekbar Style',
seekbarStyleDesc: 'Choose the look of the player seek bar',
reducedAnimations: 'Reduce animations',
reducedAnimationsDesc: 'Cap animated seekbar styles to 30 fps to lower GPU usage on slower hardware. Visual difference is minimal.',
seekbarTruewave: 'Truewave',
seekbarPseudowave: 'Pseudowave',
seekbarLinedot: 'Line & Dot',
@@ -1115,6 +1113,8 @@ export const enTranslation = {
autoAdded: '— Added automatically —',
radioAdded: '— Radio —',
hide: 'Hide',
hideNowPlaying: 'Hide now playing info',
showNowPlaying: 'Show now playing info',
close: 'Close',
nextTracks: 'Next Tracks',
shareQueue: 'Copy queue share link',
@@ -1124,6 +1124,7 @@ export const enTranslation = {
trackPlural: 'tracks',
showRemaining: 'Show remaining time',
showTotal: 'Show total time',
showEta: 'Show estimated end time',
replayGain: 'ReplayGain',
rgTrack: 'T {{db}} dB',
rgAlbum: 'A {{db}} dB',
@@ -1187,24 +1188,6 @@ export const enTranslation = {
topRatedArtists: 'Top Rated Artists',
noRatedSongs: 'No rated songs yet. Rate songs in album or playlist view.',
noRatedArtists: 'No rated artists yet.',
exportShare: 'Share',
exportTitle: 'Share Top Albums',
exportSubtitle: 'Generate a shareable image of your most-played albums.',
exportFormat: 'Format',
exportFormatStory: 'Story',
exportFormatSquare: 'Square',
exportFormatTwitter: 'Twitter Card',
exportGrid: 'Grid',
exportGridLabel: '{{n}}×{{n}}',
exportPreview: 'Preview',
exportGenerate: 'Generate',
exportSave: 'Save image…',
exportCancel: 'Cancel',
exportFooterLabel: 'Top Albums',
exportNotEnough: 'Need at least {{count}} albums in your library for a {{n}}×{{n}} grid.',
exportSaving: 'Saving…',
exportSaved: 'Saved.',
exportSaveFailed: 'Could not save the image.',
},
player: {
regionLabel: 'Music Player',
+3 -2
View File
@@ -908,8 +908,6 @@ export const esTranslation = {
sidebarLyricsStyleAppleDesc: 'La línea activa se ancla arriba con animación suave.',
seekbarStyle: 'Estilo de Barra de Progreso',
seekbarStyleDesc: 'Elige la apariencia de la barra de progreso del reproductor',
reducedAnimations: 'Reducir animaciones',
reducedAnimationsDesc: 'Limita los estilos animados de la barra de progreso a 30 fps para reducir el uso de GPU en hardware más lento. La diferencia visual es mínima.',
seekbarTruewave: 'Forma de Onda Real',
seekbarPseudowave: 'Forma de Onda Pseudo',
seekbarLinedot: 'Línea y Punto',
@@ -1102,6 +1100,8 @@ export const esTranslation = {
autoAdded: '— Agregado automáticamente —',
radioAdded: '— Radio —',
hide: 'Ocultar',
hideNowPlaying: 'Ocultar información de reproducción',
showNowPlaying: 'Mostrar información de reproducción',
close: 'Cerrar',
nextTracks: 'Siguientes',
shareQueue: 'Copiar enlace de la cola',
@@ -1111,6 +1111,7 @@ export const esTranslation = {
trackPlural: 'pistas',
showRemaining: 'Mostrar tiempo restante',
showTotal: 'Mostrar tiempo total',
showEta: 'Mostrar hora estimada de fin',
replayGain: 'ReplayGain',
rgTrack: 'T {{db}} dB',
rgAlbum: 'A {{db}} dB',
+3 -2
View File
@@ -903,8 +903,6 @@ export const frTranslation = {
sidebarLyricsStyleAppleDesc: "La ligne active reste en haut avec une animation fluide.",
seekbarStyle: 'Style de la barre de lecture',
seekbarStyleDesc: 'Choisir l\'apparence de la barre de progression',
reducedAnimations: 'Réduire les animations',
reducedAnimationsDesc: 'Limiter les styles de barre de lecture animés à 30 fps pour réduire l\'utilisation du GPU sur le matériel plus lent. La différence visuelle est minime.',
seekbarTruewave: 'Forme d\'onde réelle',
seekbarPseudowave: 'Forme d\'onde pseudo',
seekbarLinedot: 'Ligne & point',
@@ -1097,6 +1095,8 @@ export const frTranslation = {
autoAdded: '— Ajouté automatiquement —',
radioAdded: '— Radio —',
hide: 'Masquer',
hideNowPlaying: 'Masquer les infos de lecture',
showNowPlaying: 'Afficher les infos de lecture',
close: 'Fermer',
nextTracks: 'Pistes suivantes',
shareQueue: 'Copier le lien de la file dattente',
@@ -1106,6 +1106,7 @@ export const frTranslation = {
trackPlural: 'pistes',
showRemaining: 'Afficher le temps restant',
showTotal: 'Afficher la durée totale',
showEta: 'Afficher l\'heure de fin estimée',
replayGain: 'ReplayGain',
rgTrack: 'T {{db}} dB',
rgAlbum: 'A {{db}} dB',
+3 -2
View File
@@ -902,8 +902,6 @@ export const nbTranslation = {
sidebarLyricsStyleAppleDesc: 'Aktiv linje forankres øverst med jevn animasjon.',
seekbarStyle: 'Søkefelt-stil',
seekbarStyleDesc: 'Velg utseendet på avspillingssøkefeltet',
reducedAnimations: 'Reduser animasjoner',
reducedAnimationsDesc: 'Begrens animerte søkefelt-stiler til 30 fps for å redusere GPU-belastning på tregere maskinvare. Visuell forskjell er minimal.',
seekbarTruewave: 'Ekte bølgeform',
seekbarPseudowave: 'Pseudo-bølgeform',
seekbarLinedot: 'Linje & punkt',
@@ -1096,6 +1094,8 @@ export const nbTranslation = {
autoAdded: '- Lagt til automatisk -',
radioAdded: '- Radio -',
hide: 'Skjul',
hideNowPlaying: 'Skjul avspillingsinfo',
showNowPlaying: 'Vis avspillingsinfo',
close: 'Lukk',
nextTracks: 'Neste spor',
shareQueue: 'Kopiér lenke til kø',
@@ -1105,6 +1105,7 @@ export const nbTranslation = {
trackPlural: 'spor',
showRemaining: 'Vis gjenværende tid',
showTotal: 'Vis total tid',
showEta: 'Vis estimert sluttid',
replayGain: 'ReplayGain',
rgTrack: 'T {{db}} dB',
rgAlbum: 'A {{db}} dB',
+3 -2
View File
@@ -902,8 +902,6 @@ export const nlTranslation = {
sidebarLyricsStyleAppleDesc: 'Actieve regel verankerd bovenaan met vloeiende animatie.',
seekbarStyle: 'Zoekbalkstijl',
seekbarStyleDesc: 'Kies het uiterlijk van de afspeelbalk',
reducedAnimations: 'Animaties beperken',
reducedAnimationsDesc: 'Beperk geanimeerde zoekbalkstijlen tot 30 fps om GPU-gebruik op tragere hardware te verminderen. Visueel verschil is minimaal.',
seekbarTruewave: 'Echte golfvorm',
seekbarPseudowave: 'Pseudo-golfvorm',
seekbarLinedot: 'Lijn & punt',
@@ -1096,6 +1094,8 @@ export const nlTranslation = {
autoAdded: '— Automatisch toegevoegd —',
radioAdded: '— Radio —',
hide: 'Verbergen',
hideNowPlaying: 'Now playing info verbergen',
showNowPlaying: 'Now playing info weergeven',
close: 'Sluiten',
nextTracks: 'Volgende nummers',
shareQueue: 'Wachtrij-deellink kopiëren',
@@ -1105,6 +1105,7 @@ export const nlTranslation = {
trackPlural: 'nummers',
showRemaining: 'Resterende tijd tonen',
showTotal: 'Totale tijd tonen',
showEta: 'Geschatte eindtijd tonen',
replayGain: 'ReplayGain',
rgTrack: 'T {{db}} dB',
rgAlbum: 'A {{db}} dB',
+3 -2
View File
@@ -954,8 +954,6 @@ export const ruTranslation = {
sidebarLyricsStyleAppleDesc: 'Активная строка фиксируется сверху с плавной анимацией.',
seekbarStyle: 'Стиль прогресс-бара',
seekbarStyleDesc: 'Выбор внешнего вида полосы воспроизведения',
reducedAnimations: 'Снизить анимации',
reducedAnimationsDesc: 'Ограничить анимированные стили прогресс-бара 30 кадрами в секунду для снижения нагрузки на GPU на слабом железе. Визуальная разница минимальна.',
seekbarTruewave: 'Реальная форма волны',
seekbarPseudowave: 'Псевдо форма волны',
seekbarLinedot: 'Линия и точка',
@@ -1171,6 +1169,8 @@ export const ruTranslation = {
autoAdded: '— Добавлено автоматически —',
radioAdded: '— Радио —',
hide: 'Скрыть',
hideNowPlaying: 'Скрыть информацию о воспроизведении',
showNowPlaying: 'Показать информацию о воспроизведении',
close: 'Закрыть',
nextTracks: 'Дальше',
shareQueue: 'Копировать ссылку на очередь',
@@ -1180,6 +1180,7 @@ export const ruTranslation = {
trackPlural: 'треков',
showRemaining: 'Осталось',
showTotal: 'Всего',
showEta: 'Показать ориентировочное окончание',
replayGain: 'ReplayGain',
rgTrack: 'Т {{db}} дБ',
rgAlbum: 'А {{db}} дБ',
+3 -2
View File
@@ -897,8 +897,6 @@ export const zhTranslation = {
sidebarLyricsStyleAppleDesc: '活动行固定在顶部,带有平滑弹簧动画。',
seekbarStyle: '进度条样式',
seekbarStyleDesc: '选择播放进度条的外观',
reducedAnimations: '减少动画',
reducedAnimationsDesc: '将动画进度条样式限制为 30 fps,以降低较慢硬件上的 GPU 占用。视觉差异极小。',
seekbarTruewave: '真实波形',
seekbarPseudowave: '伪波形',
seekbarLinedot: '线条与点',
@@ -1091,6 +1089,8 @@ export const zhTranslation = {
autoAdded: '— 自动添加 —',
radioAdded: '— 收音机 —',
hide: '隐藏',
hideNowPlaying: '隐藏播放信息',
showNowPlaying: '显示播放信息',
close: '关闭',
nextTracks: '即将播放',
shareQueue: '复制队列分享链接',
@@ -1100,6 +1100,7 @@ export const zhTranslation = {
trackPlural: '首曲目',
showRemaining: '显示剩余时间',
showTotal: '显示总时间',
showEta: '显示预计结束时间',
replayGain: 'ReplayGain',
rgTrack: '曲目 {{db}} dB',
rgAlbum: '专辑 {{db}} dB',