{onShuffleAll && (
)}
@@ -548,7 +548,7 @@ export default function AlbumHeader({
onClick={onDownload}
{...tooltipAttrs(t('albumDetail.downloadTooltip'))}
>
-
{t('albumDetail.download')}{totalSize > 0 ? ` · ${formatMb(totalSize)}` : ''}
+
{t('albumDetail.download')}{totalSize > 0 ? ` · ${formatMb(totalSize)}` : ''}
)
)}
@@ -562,28 +562,31 @@ export default function AlbumHeader({
) : offlineStatus === 'cached' ? (
) : (
)
)}
diff --git a/src/components/SelectionToggleButton.test.tsx b/src/components/SelectionToggleButton.test.tsx
new file mode 100644
index 00000000..701f01cf
--- /dev/null
+++ b/src/components/SelectionToggleButton.test.tsx
@@ -0,0 +1,47 @@
+import { describe, expect, it, vi } from 'vitest';
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import SelectionToggleButton from './SelectionToggleButton';
+
+describe('SelectionToggleButton', () => {
+ it('shows the select label and calls onToggle on click', async () => {
+ const onToggle = vi.fn();
+ const user = userEvent.setup();
+ render(
+
,
+ );
+ const btn = screen.getByRole('button', { name: 'Multi-select' });
+ await user.click(btn);
+ expect(onToggle).toHaveBeenCalledOnce();
+ });
+
+ it('shows the cancel label and active styling when active', () => {
+ render(
+
{}}
+ selectLabel="Multi-select"
+ cancelLabel="Cancel selection"
+ />,
+ );
+ const btn = screen.getByRole('button', { name: 'Cancel selection' });
+ expect(btn).toHaveClass('btn-sort-active');
+ });
+
+ it('keeps the label in a toolbar-btn-label span for compact-mode hiding', () => {
+ render(
+ {}}
+ selectLabel="Multi-select"
+ cancelLabel="Cancel"
+ />,
+ );
+ expect(document.querySelector('.toolbar-btn-label')?.textContent).toBe('Multi-select');
+ });
+});
diff --git a/src/components/SelectionToggleButton.tsx b/src/components/SelectionToggleButton.tsx
new file mode 100644
index 00000000..9dda07de
--- /dev/null
+++ b/src/components/SelectionToggleButton.tsx
@@ -0,0 +1,44 @@
+import { CheckSquare2 } from 'lucide-react';
+
+interface Props {
+ /** Whether selection mode is currently active. */
+ active: boolean;
+ onToggle: () => void;
+ /** Label when not selecting (e.g. "Multi-select"). */
+ selectLabel: string;
+ /** Label while selecting (e.g. "Cancel selection"). */
+ cancelLabel: string;
+ /** Tooltip when inactive — defaults to `selectLabel`. */
+ startTooltip?: string;
+ iconSize?: number;
+}
+
+/**
+ * Shared multi-select toggle for browse-page toolbars (Albums, Artists,
+ * New Releases, Random Albums, Lossless Albums). The label sits in a
+ * `toolbar-btn-label` span so the existing mobile / compact-mode rule can
+ * collapse it to icon-only while keeping the icon + tooltip + aria-label.
+ */
+export default function SelectionToggleButton({
+ active,
+ onToggle,
+ selectLabel,
+ cancelLabel,
+ startTooltip,
+ iconSize = 15,
+}: Props) {
+ const label = active ? cancelLabel : selectLabel;
+ return (
+
+ );
+}
diff --git a/src/components/WikipediaIcon.tsx b/src/components/WikipediaIcon.tsx
new file mode 100644
index 00000000..bb692ae4
--- /dev/null
+++ b/src/components/WikipediaIcon.tsx
@@ -0,0 +1,7 @@
+export default function WikipediaIcon({ size = 16 }: { size?: number }) {
+ return (
+
+ );
+}
diff --git a/src/components/artistDetail/ArtistDetailHero.tsx b/src/components/artistDetail/ArtistDetailHero.tsx
index fcad1fff..d7b6892d 100644
--- a/src/components/artistDetail/ArtistDetailHero.tsx
+++ b/src/components/artistDetail/ArtistDetailHero.tsx
@@ -2,7 +2,7 @@ import React, { useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useAlbumDetailBack } from '../../hooks/useAlbumDetailBack';
import {
- ArrowLeft, Camera, Check, ExternalLink, HardDriveDownload, Heart,
+ ArrowLeft, Camera, Check, HardDriveDownload, Heart,
Loader2, Play, Radio, Share2, Shuffle, Users,
} from 'lucide-react';
import type { SubsonicAlbum, SubsonicArtist, SubsonicArtistInfo } from '../../api/subsonicTypes';
@@ -17,6 +17,7 @@ import { useCachedUrl } from '../CachedImage';
import { useCoverLightboxSrc } from '../../cover/lightbox';
import type { CoverArtRef } from '../../cover/types';
import LastfmIcon from '../LastfmIcon';
+import WikipediaIcon from '../WikipediaIcon';
import StarRating from '../StarRating';
import { tooltipAttrs } from '../tooltipAttrs';
import { offlineActionPolicy, type OfflineActionPolicy } from '../../utils/offline/offlineActionPolicy';
@@ -241,7 +242,7 @@ export default function ArtistDetailHero({
/>
-
+
{(info?.lastFmUrl || artist.name) && (
{info?.lastFmUrl && (
@@ -251,7 +252,7 @@ export default function ArtistDetailHero({
{...tooltipAttrs(t('artistDetail.lastfmTooltip'))}
>
- {openedLink === 'lastfm' ? t('artistDetail.openedInBrowser') : 'Last.fm'}
+ {openedLink === 'lastfm' ? t('artistDetail.openedInBrowser') : 'Last.fm'}
)}
)}
@@ -269,16 +270,17 @@ export default function ArtistDetailHero({
)}
-
+
{albums.length > 0 && (
<>
>
)}
@@ -308,7 +310,7 @@ export default function ArtistDetailHero({
{...tooltipAttrs(t('artistDetail.radioTooltip'))}
>
{radioLoading ?
:
}
- {!isMobile && (radioLoading ? t('artistDetail.loading') : t('artistDetail.radio'))}
+ {!isMobile &&
{radioLoading ? t('artistDetail.loading') : t('artistDetail.radio')}}
{id && artist && (
:
}
{!isMobile && (
- artistOfflineStatus === 'downloading' && artistOfflineProgress
- ? t('artistDetail.offlineDownloading', {
- done: artistOfflineProgress.done,
- total: artistOfflineProgress.total,
- })
- : artistOfflineStatus === 'queued'
- ? t('artistDetail.offlineQueued')
- : artistOfflineStatus === 'cached'
- ? t('artistDetail.offlineCached')
- : t('artistDetail.cacheOffline')
+
{
+ artistOfflineStatus === 'downloading' && artistOfflineProgress
+ ? t('artistDetail.offlineDownloading', {
+ done: artistOfflineProgress.done,
+ total: artistOfflineProgress.total,
+ })
+ : artistOfflineStatus === 'queued'
+ ? t('artistDetail.offlineQueued')
+ : artistOfflineStatus === 'cached'
+ ? t('artistDetail.offlineCached')
+ : t('artistDetail.cacheOffline')
+ }
)}
)}
diff --git a/src/components/favorites/FavoritesSongsSectionHeader.tsx b/src/components/favorites/FavoritesSongsSectionHeader.tsx
index 681514e9..698ffff0 100644
--- a/src/components/favorites/FavoritesSongsSectionHeader.tsx
+++ b/src/components/favorites/FavoritesSongsSectionHeader.tsx
@@ -67,10 +67,12 @@ export default function FavoritesSongsSectionHeader({
{/* Action Buttons */}
-
+
{/* Filter Toggle Button */}
{(selectedArtist || selectedGenres.length > 0 || yearRange[0] !== minYear || yearRange[1] !== currentYear) && (
)}
diff --git a/src/components/playlist/PlaylistHero.tsx b/src/components/playlist/PlaylistHero.tsx
index 21bfefda..24829bf8 100644
--- a/src/components/playlist/PlaylistHero.tsx
+++ b/src/components/playlist/PlaylistHero.tsx
@@ -148,15 +148,16 @@ export default function PlaylistHero({
)}
{saving &&
}
-
+
)}
{actionPolicy.canEditPlaylist && isLayoutVisible('importCsv') && (
@@ -189,10 +191,11 @@ export default function PlaylistHero({
className="btn btn-ghost"
onClick={handleImportCsv}
disabled={csvImporting}
+ aria-label={t('playlists.importCSVTooltip')}
data-tooltip={t('playlists.importCSVTooltip')}
>
{csvImporting ?
:
}
- {t('playlists.importCSV')}
+
{t('playlists.importCSV')}
)}
{actionPolicy.canDownload && isLayoutVisible('downloadZip') && songs.length > 0 && (
@@ -205,8 +208,8 @@ export default function PlaylistHero({
{activeZip.total ? Math.round((activeZip.bytes / activeZip.total) * 100) : '…'}%
) : (
-
diff --git a/src/components/playlist/PlaylistSuggestions.tsx b/src/components/playlist/PlaylistSuggestions.tsx
index a3aa7366..0b70cef3 100644
--- a/src/components/playlist/PlaylistSuggestions.tsx
+++ b/src/components/playlist/PlaylistSuggestions.tsx
@@ -65,7 +65,7 @@ export default function PlaylistSuggestions({
return (
-
+
{t('playlists.suggestions')}
{t('playlists.suggestionsHint')}
@@ -74,10 +74,11 @@ export default function PlaylistSuggestions({
className="btn btn-surface"
onClick={() => loadSuggestions(songs)}
disabled={loadingSuggestions || songs.length === 0}
+ aria-label={t('playlists.refreshSuggestions')}
data-tooltip={t('playlists.refreshSuggestions')}
>
- {t('playlists.refreshSuggestions')}
+ {t('playlists.refreshSuggestions')}
diff --git a/src/components/playlists/PlaylistsHeader.tsx b/src/components/playlists/PlaylistsHeader.tsx
index b3bdbe8c..315a1971 100644
--- a/src/components/playlists/PlaylistsHeader.tsx
+++ b/src/components/playlists/PlaylistsHeader.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
-import { CheckSquare2, Plus, Trash2 } from 'lucide-react';
+import { CheckSquare2, Plus, Sparkles, Trash2 } from 'lucide-react';
import type { SubsonicPlaylist } from '../../api/subsonicTypes';
import {
defaultSmartFilters, type SmartFilters,
@@ -48,7 +48,7 @@ export default function PlaylistsHeader({
? t('playlists.selectionCount', { count: selectedIds.size })
: t('playlists.title')}
-
+
{policy.canEditPlaylist && !(selectionMode && selectedIds.size > 0) && (<>
{creating ? (
<>
@@ -72,8 +72,8 @@ export default function PlaylistsHeader({
>
) : (
-
{ setCreatingSmart(false); setCreating(true); }}>
- {t('playlists.newPlaylist')}
+ { setCreatingSmart(false); setCreating(true); }} aria-label={t('playlists.newPlaylist')} data-tooltip={t('playlists.newPlaylist')}>
+ {t('playlists.newPlaylist')}
)}
{!creating && isNavidromeServer && (
@@ -83,8 +83,8 @@ export default function PlaylistsHeader({
setSmartFilters(defaultSmartFilters);
setGenreQuery('');
setCreatingSmart(v => !v);
- }}>
- {t('smartPlaylists.create')}
+ }} aria-label={t('smartPlaylists.create')} data-tooltip={t('smartPlaylists.create')}>
+ {t('smartPlaylists.create')}
)}
>
@@ -98,25 +98,27 @@ export default function PlaylistsHeader({
className="btn btn-danger"
onClick={handleDeleteSelected}
disabled={deletableCount === 0}
+ aria-label={t('playlists.deleteSelected')}
data-tooltip={deletableCount === selectedIds.size
? undefined
: t('playlists.deleteSelectedPartial', { n: deletableCount, total: selectedIds.size })}
data-tooltip-pos="bottom"
>
- {t('playlists.deleteSelected')}
+
{t('playlists.deleteSelected')}
);
})()}
- {selectionMode ? t('playlists.cancelSelect') : t('playlists.select')}
+ {selectionMode ? t('playlists.cancelSelect') : t('playlists.select')}
diff --git a/src/components/playlists/PlaylistsNewFolderButton.tsx b/src/components/playlists/PlaylistsNewFolderButton.tsx
index f45fb749..f768b63e 100644
--- a/src/components/playlists/PlaylistsNewFolderButton.tsx
+++ b/src/components/playlists/PlaylistsNewFolderButton.tsx
@@ -61,8 +61,8 @@ export default function PlaylistsNewFolderButton() {
}
return (
-
setCreating(true)}>
- {t('playlists.folders.newFolder')}
+ setCreating(true)} aria-label={t('playlists.folders.newFolder')} data-tooltip={t('playlists.folders.newFolder')}>
+ {t('playlists.folders.newFolder')}
);
}
diff --git a/src/components/randomMix/RandomMixHeader.tsx b/src/components/randomMix/RandomMixHeader.tsx
index 1a04c1ce..06b9a269 100644
--- a/src/components/randomMix/RandomMixHeader.tsx
+++ b/src/components/randomMix/RandomMixHeader.tsx
@@ -28,28 +28,31 @@ export default function RandomMixHeader({
{t('randomMix.title')}
-
+
- {selectedGenre ? t('randomMix.remixGenre', { genre: selectedGenre }) : t('randomMix.remix')}
+ {selectedGenre ? t('randomMix.remixGenre', { genre: selectedGenre }) : t('randomMix.remix')}
{isGenreLoading ? (
- <> {Math.min(genreMixSongsLength, randomMixSize)} / {randomMixSize}>
+ <> {Math.min(genreMixSongsLength, randomMixSize)} / {randomMixSize}>
) : (
- <> {t('randomMix.playAll')}>
+ <> {t('randomMix.playAll')}>
)}
diff --git a/src/components/settings/AppearanceTab.tsx b/src/components/settings/AppearanceTab.tsx
index 955ef5c1..e3983ad9 100644
--- a/src/components/settings/AppearanceTab.tsx
+++ b/src/components/settings/AppearanceTab.tsx
@@ -1,7 +1,7 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { invoke } from '@tauri-apps/api/core';
-import { LayoutGrid, Palette, Sliders, Type, ZoomIn } from 'lucide-react';
+import { LayoutGrid, Maximize2, Palette, Sliders, Type, ZoomIn } from 'lucide-react';
import { useAuthStore } from '../../store/authStore';
import {
LIBRARY_GRID_MAX_COLUMNS_MAX,
@@ -308,6 +308,34 @@ export function AppearanceTab() {
+
+
}
+ >
+
+
+
+
+
+ {(['large', 'small'] as const).map(size => (
+ theme.setButtonSize(size)}
+ >
+ {t(`settings.buttonSize_${size}`)}
+
+ ))}
+
+
+
+
+
+
>
);
}
diff --git a/src/components/tracks/TracksPageChrome.tsx b/src/components/tracks/TracksPageChrome.tsx
index c8d787f2..df232dd8 100644
--- a/src/components/tracks/TracksPageChrome.tsx
+++ b/src/components/tracks/TracksPageChrome.tsx
@@ -166,12 +166,12 @@ export default function TracksPageChrome({
>
)}
-
-
playSongNow(hero)}>
- {t('tracks.playSong')}
+
+
playSongNow(hero)} aria-label={t('tracks.playSong')} data-tooltip={t('tracks.playSong')}>
+ {t('tracks.playSong')}
-
enqueue([songToTrack(hero)])}>
- {t('tracks.enqueueSong')}
+ enqueue([songToTrack(hero)])} aria-label={t('tracks.enqueueSong')} data-tooltip={t('tracks.enqueueSong')}>
+ {t('tracks.enqueueSong')}
)}
-
-
- {selectionMode ? t('albums.cancelSelect') : t('albums.select')}
-
+
diff --git a/src/pages/Artists.tsx b/src/pages/Artists.tsx
index 84d6c786..3dda0c87 100644
--- a/src/pages/Artists.tsx
+++ b/src/pages/Artists.tsx
@@ -1,6 +1,7 @@
import { useEffect, useState, useCallback, useRef } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
-import { LayoutGrid, List, Images, CheckSquare2 } from 'lucide-react';
+import { LayoutGrid, List, Images } from 'lucide-react';
+import SelectionToggleButton from '../components/SelectionToggleButton';
import StarFilterButton from '../components/StarFilterButton';
import OverlayScrollArea from '../components/OverlayScrollArea';
import { usePlayerStore } from '../store/playerStore';
@@ -361,16 +362,14 @@ export default function Artists() {
>
)}
-
-
- {selectionMode ? t('artists.cancelSelect') : t('artists.select')}
-
+
diff --git a/src/pages/ComposerDetail.tsx b/src/pages/ComposerDetail.tsx
index 1335d27b..7b9f5fe3 100644
--- a/src/pages/ComposerDetail.tsx
+++ b/src/pages/ComposerDetail.tsx
@@ -8,7 +8,8 @@ import AlbumCard from '../components/AlbumCard';
import { ArtistHeroCover } from '../cover/artistHero';
import { coverArtRef } from '../cover/ref';
import { useCoverLightboxSrc } from '../cover/lightbox';
-import { ArrowLeft, Users, ExternalLink, Heart, Feather, Share2 } from 'lucide-react';
+import { ArrowLeft, Users, Heart, Feather, Share2 } from 'lucide-react';
+import WikipediaIcon from '../components/WikipediaIcon';
import { open } from '@tauri-apps/plugin-shell';
import { usePlayerStore } from '../store/playerStore';
import { useAuthStore } from '../store/authStore';
@@ -211,12 +212,12 @@ export default function ComposerDetail() {
{t('composerDetail.workCount', { count: albums.length })}
-
+
{wikiUrl && (
- openLink(wikiUrl, 'wiki')}>
-
- {openedLink === 'wiki' ? t('artistDetail.openedInBrowser') : 'Wikipedia'}
+ openLink(wikiUrl, 'wiki')} aria-label={t('artistDetail.wikipediaTooltip')} data-tooltip={t('artistDetail.wikipediaTooltip')}>
+
+ {openedLink === 'wiki' ? t('artistDetail.openedInBrowser') : 'Wikipedia'}
)}
@@ -225,11 +226,12 @@ export default function ComposerDetail() {
- {t('artistDetail.favorite')}
+ {t('artistDetail.favorite')}
)}
diff --git a/src/pages/GenreDetail.tsx b/src/pages/GenreDetail.tsx
index 6223e2ba..92859101 100644
--- a/src/pages/GenreDetail.tsx
+++ b/src/pages/GenreDetail.tsx
@@ -166,10 +166,12 @@ export default function GenreDetail() {
- {t('genres.back')}
+ {t('genres.back')}
{genre}
{headerCount != null && headerCount > 0 && (
@@ -185,12 +187,13 @@ export default function GenreDetail() {
className="btn btn-primary long-press-play-btn"
{...pressBind}
disabled={bulkLoading}
+ aria-label={t('genres.playTooltip')}
data-tooltip={t('genres.playTooltip')}
>
{bulkLoading ? : }
- {t('common.play')}
+ {t('common.play')}
{t('radio.title')}
{canManage && (
-
-
setBrowseOpen(true)}>
- {t('radio.browseDirectory')}
+
+
setBrowseOpen(true)} aria-label={t('radio.browseDirectory')} data-tooltip={t('radio.browseDirectory')}>
+ {t('radio.browseDirectory')}
-
setModalStation('new')}>
- {t('radio.addStation')}
+ setModalStation('new')} aria-label={t('radio.addStation')} data-tooltip={t('radio.addStation')}>
+ {t('radio.addStation')}
)}
diff --git a/src/pages/LosslessAlbums.tsx b/src/pages/LosslessAlbums.tsx
index a865b135..987713e6 100644
--- a/src/pages/LosslessAlbums.tsx
+++ b/src/pages/LosslessAlbums.tsx
@@ -18,7 +18,8 @@ import { usePerfProbeFlags } from '../utils/perf/perfFlags';
import { showToast } from '../utils/ui/toast';
import { invoke } from '@tauri-apps/api/core';
import { join } from '@tauri-apps/api/path';
-import { CheckSquare2, Download, HardDriveDownload, ListPlus } from 'lucide-react';
+import { Download, HardDriveDownload, ListPlus } from 'lucide-react';
+import SelectionToggleButton from '../components/SelectionToggleButton';
import { albumGridWarmCovers } from '../cover/layoutSizes';
import { VirtualCardGrid } from '../components/VirtualCardGrid';
import OverlayScrollArea from '../components/OverlayScrollArea';
@@ -330,16 +331,13 @@ export default function LosslessAlbums() {
>
)}
-
-
- {selectionMode ? t('albums.cancelSelect') : t('albums.select')}
-
+
diff --git a/src/pages/MostPlayed.tsx b/src/pages/MostPlayed.tsx
index 0aa561e5..83712a36 100644
--- a/src/pages/MostPlayed.tsx
+++ b/src/pages/MostPlayed.tsx
@@ -157,10 +157,11 @@ export default function MostPlayed() {
setSortAsc(v => !v)}
+ aria-label={sortAsc ? t('mostPlayed.sortLeast') : t('mostPlayed.sortMost')}
data-tooltip={sortAsc ? t('mostPlayed.sortMost') : t('mostPlayed.sortLeast')}
>
{sortAsc ? : }
- {sortAsc ? t('mostPlayed.sortLeast') : t('mostPlayed.sortMost')}
+ {sortAsc ? t('mostPlayed.sortLeast') : t('mostPlayed.sortMost')}
@@ -173,11 +174,12 @@ export default function MostPlayed() {
setFilterCompilations(v => !v)}
+ aria-label={t('mostPlayed.filterCompilations')}
data-tooltip={t('mostPlayed.filterCompilations')}
data-tooltip-pos="left"
>
- {t('mostPlayed.filterCompilationsShort')}
+ {t('mostPlayed.filterCompilationsShort')}
{topArtists.length === 0 && (
diff --git a/src/pages/NewReleases.tsx b/src/pages/NewReleases.tsx
index 46a8f470..3698ffbd 100644
--- a/src/pages/NewReleases.tsx
+++ b/src/pages/NewReleases.tsx
@@ -5,7 +5,8 @@ import { resolveAlbum } from '../utils/offline/offlineMediaResolve';
import type { SubsonicAlbum } from '../api/subsonicTypes';
import { dedupeById } from '../utils/dedupeById';
import { useEffect, useLayoutEffect, useState, useCallback, useRef, useMemo } from 'react';
-import { CheckSquare2, Download, HardDriveDownload } from 'lucide-react';
+import { Download, HardDriveDownload } from 'lucide-react';
+import SelectionToggleButton from '../components/SelectionToggleButton';
import AlbumCard from '../components/AlbumCard';
import GenreFilterBar from '../components/GenreFilterBar';
import { useTranslation } from 'react-i18next';
@@ -271,16 +272,13 @@ export default function NewReleases() {
) : (
)}
-
-
- {selectionMode ? t('albums.cancelSelect') : t('albums.select')}
-
+
diff --git a/src/pages/RandomAlbums.tsx b/src/pages/RandomAlbums.tsx
index dac5a72b..5e966094 100644
--- a/src/pages/RandomAlbums.tsx
+++ b/src/pages/RandomAlbums.tsx
@@ -6,7 +6,8 @@ import type { SubsonicAlbum } from '../api/subsonicTypes';
import { dedupeById } from '../utils/dedupeById';
import { shuffleArray } from '../utils/playback/shuffleArray';
import React, { useEffect, useLayoutEffect, useState, useCallback, useRef } from 'react';
-import { RefreshCw, CheckSquare2, Download, HardDriveDownload } from 'lucide-react';
+import { RefreshCw, Download, HardDriveDownload } from 'lucide-react';
+import SelectionToggleButton from '../components/SelectionToggleButton';
import AlbumCard from '../components/AlbumCard';
import GenreFilterBar from '../components/GenreFilterBar';
import { useTranslation } from 'react-i18next';
@@ -314,13 +315,13 @@ export default function RandomAlbums() {
{selectionMode && selectedIds.size > 0 ? (
<>
-
+
- {t('albums.addOffline')}
+ {t('albums.addOffline')}
-
+
- {t('albums.downloadZips')}
+ {t('albums.downloadZips')}
>
) : (
@@ -330,23 +331,21 @@ export default function RandomAlbums() {
className="btn btn-surface"
onClick={handleRefresh}
disabled={loading}
+ aria-label={t('randomAlbums.refresh')}
data-tooltip={t('randomAlbums.refresh')}
>
- {t('randomAlbums.refresh')}
+ {t('randomAlbums.refresh')}
>
)}
-
-
- {selectionMode ? t('albums.cancelSelect') : t('albums.select')}
-
+