feat(tracklist): multi-select + psyDnD, filter/sort, settings & UI polish

- AlbumTrackList: extract TrackRow as React.memo, selection state moved to
  selectionStore (Zustand) for O(1) re-renders per toggle; Ctrl/Cmd+Click
  enters select mode; drag selected tracks as {type:'songs'} payload;
  selection clears on outside click or song-list change
- QueuePanel: handle 'songs' multi-track drop type; whitelist drag types to
  suppress drop feedback for non-queue drags (lyrics grip etc.)
- AlbumDetail + PlaylistDetail: filter/sort toolbar (title/artist, natural
  order); disc grouping bypassed when sorted; playlist reorder DnD disabled
  while filter active
- useTracklistColumns: 'known' field auto-shows newly added columns for
  existing users
- PlayerBar: mute/unmute restores previous volume via premuteVolumeRef
  instead of hardcoded 0.7
- Settings/Input: reset buttons restyled as RotateCcw icon above card,
  matching HomeCustomizer layout
- i18n: filterSongs, sortNatural, sortByTitle, sortByArtist keys across
  all 7 locales
- components.css: album-card-title/artist nowrap to keep playlist grid
  cards uniform height

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-11 11:42:31 +02:00
parent b46acc88e3
commit b9b8f3fc15
16 changed files with 573 additions and 243 deletions
+6
View File
@@ -135,6 +135,7 @@ export const deTranslation = {
goToArtist: 'Zu {{artist}} wechseln',
moreLabelAlbums: 'Weitere Alben von {{label}} anzeigen',
trackTitle: 'Titel',
trackAlbum: 'Album',
trackArtist: 'Interpret',
trackGenre: 'Genre',
trackFormat: 'Format',
@@ -148,6 +149,11 @@ export const deTranslation = {
bioClose: 'Schließen',
ratingLabel: 'Bewertung',
enlargeCover: 'Vergrößern',
filterSongs: 'Titel filtern…',
sortNatural: 'Reihenfolge',
sortByTitle: 'AZ (Titel)',
sortByArtist: 'AZ (Künstler)',
sortByAlbum: 'AZ (Album)',
},
entityRating: {
albumShort: 'Albumbewertung',
+6
View File
@@ -136,6 +136,7 @@ export const enTranslation = {
goToArtist: 'Go to {{artist}}',
moreLabelAlbums: 'More albums on {{label}}',
trackTitle: 'Title',
trackAlbum: 'Album',
trackArtist: 'Artist',
trackGenre: 'Genre',
trackFormat: 'Format',
@@ -149,6 +150,11 @@ export const enTranslation = {
bioClose: 'Close',
ratingLabel: 'Rating',
enlargeCover: 'Enlarge',
filterSongs: 'Filter songs…',
sortNatural: 'Natural',
sortByTitle: 'AZ (Title)',
sortByArtist: 'AZ (Artist)',
sortByAlbum: 'AZ (Album)',
},
entityRating: {
albumShort: 'Album rating',
+6
View File
@@ -135,6 +135,7 @@ export const frTranslation = {
goToArtist: 'Aller à {{artist}}',
moreLabelAlbums: 'Plus d\'albums sur {{label}}',
trackTitle: 'Titre',
trackAlbum: 'Album',
trackArtist: 'Artiste',
trackGenre: 'Genre',
trackFormat: 'Format',
@@ -148,6 +149,11 @@ export const frTranslation = {
bioClose: 'Fermer',
ratingLabel: 'Note',
enlargeCover: 'Agrandir',
filterSongs: 'Filtrer…',
sortNatural: 'Naturel',
sortByTitle: 'AZ (Titre)',
sortByArtist: 'AZ (Artiste)',
sortByAlbum: 'AZ (Album)',
},
entityRating: {
albumShort: 'Note de lalbum',
+6
View File
@@ -135,6 +135,7 @@ export const nbTranslation = {
goToArtist: 'Gå til {{artist}}',
moreLabelAlbums: 'Flere album på {{label}}',
trackTitle: 'Tittel',
trackAlbum: 'Album',
trackArtist: 'Artist',
trackGenre: 'Sjanger',
trackFormat: 'Format',
@@ -148,6 +149,11 @@ export const nbTranslation = {
bioClose: 'Lukk',
ratingLabel: 'Vurdering',
enlargeCover: 'Forstørr',
filterSongs: 'Filtrer sanger…',
sortNatural: 'Naturlig',
sortByTitle: 'A–Å (Tittel)',
sortByArtist: 'A–Å (Artist)',
sortByAlbum: 'A–Å (Album)',
},
entityRating: {
albumShort: 'Albumvurdering',
+6
View File
@@ -135,6 +135,7 @@ export const nlTranslation = {
goToArtist: 'Naar {{artist}}',
moreLabelAlbums: 'Meer albums op {{label}}',
trackTitle: 'Titel',
trackAlbum: 'Album',
trackArtist: 'Artiest',
trackGenre: 'Genre',
trackFormat: 'Formaat',
@@ -148,6 +149,11 @@ export const nlTranslation = {
bioClose: 'Sluiten',
ratingLabel: 'Beoordeling',
enlargeCover: 'Vergroten',
filterSongs: 'Filteren…',
sortNatural: 'Natuurlijk',
sortByTitle: 'AZ (Titel)',
sortByArtist: 'AZ (Artiest)',
sortByAlbum: 'AZ (Album)',
},
entityRating: {
albumShort: 'Albumbeoordeling',
+6
View File
@@ -137,6 +137,7 @@ export const ruTranslation = {
goToArtist: 'Перейти к {{artist}}',
moreLabelAlbums: 'Другие альбомы на {{label}}',
trackTitle: 'Название',
trackAlbum: 'Альбом',
trackArtist: 'Исполнитель',
trackGenre: 'Жанр',
trackFormat: 'Формат',
@@ -150,6 +151,11 @@ export const ruTranslation = {
bioClose: 'Закрыть',
ratingLabel: 'Оценка',
enlargeCover: 'Увеличить обложку',
filterSongs: 'Фильтр треков…',
sortNatural: 'По умолчанию',
sortByTitle: 'А–Я (название)',
sortByArtist: 'А–Я (исполнитель)',
sortByAlbum: 'А–Я (альбом)',
},
entityRating: {
albumShort: 'Оценка альбома',
+6
View File
@@ -135,6 +135,7 @@ export const zhTranslation = {
goToArtist: '前往 {{artist}}',
moreLabelAlbums: '{{label}} 的更多专辑',
trackTitle: '标题',
trackAlbum: '专辑',
trackArtist: '艺术家',
trackGenre: '流派',
trackFormat: '格式',
@@ -148,6 +149,11 @@ export const zhTranslation = {
bioClose: '关闭',
ratingLabel: '评分',
enlargeCover: '放大',
filterSongs: '筛选歌曲…',
sortNatural: '默认顺序',
sortByTitle: 'AZ(标题)',
sortByArtist: 'AZ(艺术家)',
sortByAlbum: 'AZ(专辑)',
},
entityRating: {
albumShort: '专辑评分',