diff --git a/src/components/GenreFilterBar.tsx b/src/components/GenreFilterBar.tsx index a21f0920..67ce5655 100644 --- a/src/components/GenreFilterBar.tsx +++ b/src/components/GenreFilterBar.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 're import { createPortal } from 'react-dom'; import { Check, Filter, X } from 'lucide-react'; import { useTranslation } from 'react-i18next'; -import FilterQuickClear from './FilterQuickClear'; +import FilterQuickClear from '@/ui/FilterQuickClear'; import { tooltipAttrs } from '@/ui/tooltipAttrs'; type GenreRow = GenreFilterOption; diff --git a/src/components/PagedSongList.tsx b/src/components/PagedSongList.tsx index d4984581..eb7daedb 100644 --- a/src/components/PagedSongList.tsx +++ b/src/components/PagedSongList.tsx @@ -2,7 +2,7 @@ import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import React, { useRef } from 'react'; import SongRow, { SongListHeader } from './SongRow'; import { useInpageScrollSentinel } from '../hooks/useInpageScrollSentinel'; -import InpageScrollSentinel from './InpageScrollSentinel'; +import InpageScrollSentinel from '@/ui/InpageScrollSentinel'; interface Props { songs: SubsonicSong[]; diff --git a/src/components/playerBar/PlayerTrackInfo.tsx b/src/components/playerBar/PlayerTrackInfo.tsx index c4bbcd1b..b3727f5f 100644 --- a/src/components/playerBar/PlayerTrackInfo.tsx +++ b/src/components/playerBar/PlayerTrackInfo.tsx @@ -10,7 +10,7 @@ import { CoverArtImage } from '../../cover/CoverArtImage'; import { albumCoverRef } from '../../cover/ref'; import { useAlbumCoverRef } from '../../cover/useLibraryCoverRef'; import { usePlaybackTrackCoverRef } from '../../cover/useLibraryCoverRef'; -import MarqueeText from '../MarqueeText'; +import MarqueeText from '@/ui/MarqueeText'; import { OpenArtistRefInline } from '@/features/artist'; import StarRating from '../StarRating'; import { PlaybackBufferingOverlay } from '../playback/PlaybackBufferingOverlay'; diff --git a/src/features/album/pages/Albums.tsx b/src/features/album/pages/Albums.tsx index bf26f54b..fc9077eb 100644 --- a/src/features/album/pages/Albums.tsx +++ b/src/features/album/pages/Albums.tsx @@ -9,10 +9,10 @@ import { useAuthStore } from '@/store/authStore'; import { clampLibraryGridMaxColumns } from '@/store/authStoreHelpers'; import { computeCardGridColumnCount } from '@/utils/cardGridLayout'; import GenreFilterBar from '@/components/GenreFilterBar'; -import YearFilterButton from '@/components/YearFilterButton'; -import StarFilterButton from '@/components/StarFilterButton'; -import LosslessFilterButton from '@/components/LosslessFilterButton'; -import SortDropdown from '@/components/SortDropdown'; +import YearFilterButton from '@/ui/YearFilterButton'; +import StarFilterButton from '@/ui/StarFilterButton'; +import LosslessFilterButton from '@/ui/LosslessFilterButton'; +import SortDropdown from '@/ui/SortDropdown'; import { useTranslation } from 'react-i18next'; import { useLocation, useNavigate } from 'react-router-dom'; import { useOfflineStore } from '@/features/offline'; @@ -23,13 +23,13 @@ import { join } from '@tauri-apps/api/path'; import { showToast } from '@/utils/ui/toast'; import { useZipDownloadStore } from '@/features/offline'; import { Download, HardDriveDownload, Disc3, ListPlus } from 'lucide-react'; -import SelectionToggleButton from '@/components/SelectionToggleButton'; -import FilterQuickClear from '@/components/FilterQuickClear'; +import SelectionToggleButton from '@/ui/SelectionToggleButton'; +import FilterQuickClear from '@/ui/FilterQuickClear'; import { usePerfProbeFlags } from '@/utils/perf/perfFlags'; import { useRangeSelection } from '@/lib/hooks/useRangeSelection'; import { useMainstageInpageHeaderTight } from '@/hooks/useMainstageInpageHeaderTight'; import { useInpageScrollViewport } from '@/hooks/useInpageScrollViewport'; -import InpageScrollSentinel from '@/components/InpageScrollSentinel'; +import InpageScrollSentinel from '@/ui/InpageScrollSentinel'; import { VirtualCardGrid } from '@/components/VirtualCardGrid'; import OverlayScrollArea from '@/ui/OverlayScrollArea'; import { ALBUMS_INPAGE_SCROLL_VIEWPORT_ID } from '@/constants/appScroll'; diff --git a/src/features/album/pages/LosslessAlbums.tsx b/src/features/album/pages/LosslessAlbums.tsx index c74111dd..817a2b1f 100644 --- a/src/features/album/pages/LosslessAlbums.tsx +++ b/src/features/album/pages/LosslessAlbums.tsx @@ -19,16 +19,16 @@ import { showToast } from '@/utils/ui/toast'; import { invoke } from '@tauri-apps/api/core'; import { join } from '@tauri-apps/api/path'; import { Download, HardDriveDownload, ListPlus } from 'lucide-react'; -import SelectionToggleButton from '@/components/SelectionToggleButton'; +import SelectionToggleButton from '@/ui/SelectionToggleButton'; import { albumGridWarmCovers } from '@/cover/layoutSizes'; import { VirtualCardGrid } from '@/components/VirtualCardGrid'; import OverlayScrollArea from '@/ui/OverlayScrollArea'; import { LOSSLESS_ALBUMS_INPAGE_SCROLL_VIEWPORT_ID } from '@/constants/appScroll'; import { useInpageScrollSentinel } from '@/hooks/useInpageScrollSentinel'; import { useInpageScrollViewport } from '@/hooks/useInpageScrollViewport'; -import InpageScrollSentinel from '@/components/InpageScrollSentinel'; +import InpageScrollSentinel from '@/ui/InpageScrollSentinel'; import { useLibraryIndexStore } from '@/store/libraryIndexStore'; -import SortDropdown from '@/components/SortDropdown'; +import SortDropdown from '@/ui/SortDropdown'; import { albumArtistDisplayName } from '@/features/album/utils/deriveAlbumHeaderArtistRefs'; import { albumBrowseSortForServer, diff --git a/src/features/album/pages/NewReleases.tsx b/src/features/album/pages/NewReleases.tsx index a823c729..c6f13dcc 100644 --- a/src/features/album/pages/NewReleases.tsx +++ b/src/features/album/pages/NewReleases.tsx @@ -6,7 +6,7 @@ import type { SubsonicAlbum } from '@/lib/api/subsonicTypes'; import { dedupeById } from '@/lib/util/dedupeById'; import { useEffect, useLayoutEffect, useState, useCallback, useRef, useMemo } from 'react'; import { Download, HardDriveDownload } from 'lucide-react'; -import SelectionToggleButton from '@/components/SelectionToggleButton'; +import SelectionToggleButton from '@/ui/SelectionToggleButton'; import AlbumCard from '@/features/album/components/AlbumCard'; import GenreFilterBar from '@/components/GenreFilterBar'; import { useTranslation } from 'react-i18next'; @@ -28,7 +28,7 @@ import { NEW_RELEASES_INPAGE_SCROLL_VIEWPORT_ID } from '@/constants/appScroll'; import { useAsyncInpagePagination } from '@/hooks/useAsyncInpagePagination'; import { useInpageScrollSentinel } from '@/hooks/useInpageScrollSentinel'; import { useInpageScrollViewport } from '@/hooks/useInpageScrollViewport'; -import InpageScrollSentinel from '@/components/InpageScrollSentinel'; +import InpageScrollSentinel from '@/ui/InpageScrollSentinel'; import { useAlbumGridBrowseFilters, type AlbumGridBrowseSnapshot } from '@/features/album/hooks/useAlbumGridBrowseFilters'; import { useAlbumBrowseScrollRestore } from '@/features/album/hooks/useAlbumBrowseScrollRestore'; import { useAlbumBrowseScrollReset } from '@/features/album/hooks/useAlbumBrowseScrollReset'; diff --git a/src/features/album/pages/RandomAlbums.tsx b/src/features/album/pages/RandomAlbums.tsx index 8344c488..5e18d071 100644 --- a/src/features/album/pages/RandomAlbums.tsx +++ b/src/features/album/pages/RandomAlbums.tsx @@ -7,7 +7,7 @@ import { dedupeById } from '@/lib/util/dedupeById'; import { shuffleArray } from '@/lib/util/shuffleArray'; import React, { useEffect, useLayoutEffect, useState, useCallback, useRef } from 'react'; import { RefreshCw, Download, HardDriveDownload } from 'lucide-react'; -import SelectionToggleButton from '@/components/SelectionToggleButton'; +import SelectionToggleButton from '@/ui/SelectionToggleButton'; import AlbumCard from '@/features/album/components/AlbumCard'; import GenreFilterBar from '@/components/GenreFilterBar'; import { useTranslation } from 'react-i18next'; diff --git a/src/features/artist/pages/Artists.tsx b/src/features/artist/pages/Artists.tsx index b5a7ac15..17613dfc 100644 --- a/src/features/artist/pages/Artists.tsx +++ b/src/features/artist/pages/Artists.tsx @@ -1,8 +1,8 @@ import { useEffect, useState, useCallback, useRef } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import { LayoutGrid, List, Images } from 'lucide-react'; -import SelectionToggleButton from '@/components/SelectionToggleButton'; -import StarFilterButton from '@/components/StarFilterButton'; +import SelectionToggleButton from '@/ui/SelectionToggleButton'; +import StarFilterButton from '@/ui/StarFilterButton'; import OverlayScrollArea from '@/ui/OverlayScrollArea'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { useAuthStore } from '@/store/authStore'; @@ -30,7 +30,7 @@ import { useInpageScrollSentinel } from '@/hooks/useInpageScrollSentinel'; import { useInpageScrollViewport } from '@/hooks/useInpageScrollViewport'; import { ArtistsGridView } from '@/features/artist/components/ArtistsGridView'; import { ArtistsListView } from '@/features/artist/components/ArtistsListView'; -import InpageScrollSentinel from '@/components/InpageScrollSentinel'; +import InpageScrollSentinel from '@/ui/InpageScrollSentinel'; import { useArtistsBrowseFilters, type ArtistBrowseScrollSnapshot } from '@/features/artist/hooks/useArtistsBrowseFilters'; import { useArtistsBrowseScrollRestore } from '@/features/artist/hooks/useArtistsBrowseScrollRestore'; import { useArtistsBrowseScrollReset } from '@/features/artist/hooks/useArtistsBrowseScrollReset'; diff --git a/src/features/composers/pages/Composers.tsx b/src/features/composers/pages/Composers.tsx index 7d1a86af..99d52100 100644 --- a/src/features/composers/pages/Composers.tsx +++ b/src/features/composers/pages/Composers.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useCallback, useRef, useMemo } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import { ndListArtistsByRole } from '@/lib/api/navidromeBrowse'; import { LayoutGrid, List } from 'lucide-react'; -import StarFilterButton from '@/components/StarFilterButton'; +import StarFilterButton from '@/ui/StarFilterButton'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { useAuthStore } from '@/store/authStore'; import { useTranslation } from 'react-i18next'; @@ -28,7 +28,7 @@ import OverlayScrollArea from '@/ui/OverlayScrollArea'; import { useVirtualizerScrollMargin } from '@/lib/hooks/useVirtualizerScrollMargin'; import { useClientSliceInfiniteScroll } from '@/hooks/useClientSliceInfiniteScroll'; import { useInpageScrollViewport } from '@/hooks/useInpageScrollViewport'; -import InpageScrollSentinel from '@/components/InpageScrollSentinel'; +import InpageScrollSentinel from '@/ui/InpageScrollSentinel'; const ALPHABET = [ALL_SENTINEL, '#', ...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('')]; diff --git a/src/features/genre/pages/GenreDetail.tsx b/src/features/genre/pages/GenreDetail.tsx index 36513878..d1e54576 100644 --- a/src/features/genre/pages/GenreDetail.tsx +++ b/src/features/genre/pages/GenreDetail.tsx @@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next'; import { ArrowLeft, Disc3, Play, ListPlus, Loader2 } from 'lucide-react'; import { AlbumCard } from '@/features/album'; import { LongPressWaveOverlay } from '@/components/LongPressWaveOverlay'; -import InpageScrollSentinel from '@/components/InpageScrollSentinel'; +import InpageScrollSentinel from '@/ui/InpageScrollSentinel'; import OverlayScrollArea from '@/ui/OverlayScrollArea'; import { VirtualCardGrid } from '@/components/VirtualCardGrid'; import { GENRE_DETAIL_INPAGE_SCROLL_VIEWPORT_ID } from '@/constants/appScroll'; diff --git a/src/features/playlist/components/PlaylistFilterToolbar.tsx b/src/features/playlist/components/PlaylistFilterToolbar.tsx index 046dc675..3f71a50d 100644 --- a/src/features/playlist/components/PlaylistFilterToolbar.tsx +++ b/src/features/playlist/components/PlaylistFilterToolbar.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; import { Search, X } from 'lucide-react'; -import SortDropdown, { type SortOption } from '@/components/SortDropdown'; +import SortDropdown, { type SortOption } from '@/ui/SortDropdown'; import type { PlaylistSortKey, PlaylistSortDir } from '@/features/playlist/utils/playlistDisplayedSongs'; type PlaylistSortValue = diff --git a/src/features/search/pages/SearchBrowsePage.tsx b/src/features/search/pages/SearchBrowsePage.tsx index 50b2e864..ca20ca89 100644 --- a/src/features/search/pages/SearchBrowsePage.tsx +++ b/src/features/search/pages/SearchBrowsePage.tsx @@ -10,7 +10,7 @@ import { AlbumRow } from '@/features/album'; import { ArtistRow } from '@/features/artist'; import PagedSongList from '@/components/PagedSongList'; import CustomSelect from '@/ui/CustomSelect'; -import StarFilterButton from '@/components/StarFilterButton'; +import StarFilterButton from '@/ui/StarFilterButton'; import { tooltipAttrs } from '@/ui/tooltipAttrs'; import { APP_MAIN_SCROLL_VIEWPORT_ID } from '@/constants/appScroll'; import { useAuthStore } from '@/store/authStore'; diff --git a/src/components/FilterQuickClear.tsx b/src/ui/FilterQuickClear.tsx similarity index 100% rename from src/components/FilterQuickClear.tsx rename to src/ui/FilterQuickClear.tsx diff --git a/src/components/InpageScrollSentinel.tsx b/src/ui/InpageScrollSentinel.tsx similarity index 100% rename from src/components/InpageScrollSentinel.tsx rename to src/ui/InpageScrollSentinel.tsx diff --git a/src/components/LosslessFilterButton.tsx b/src/ui/LosslessFilterButton.tsx similarity index 94% rename from src/components/LosslessFilterButton.tsx rename to src/ui/LosslessFilterButton.tsx index c6f6c5e3..4c1454a8 100644 --- a/src/components/LosslessFilterButton.tsx +++ b/src/ui/LosslessFilterButton.tsx @@ -1,6 +1,6 @@ import { Gem } from 'lucide-react'; import { useTranslation } from 'react-i18next'; -import FilterQuickClear from './FilterQuickClear'; +import FilterQuickClear from '@/ui/FilterQuickClear'; interface Props { active: boolean; diff --git a/src/components/MarqueeText.tsx b/src/ui/MarqueeText.tsx similarity index 96% rename from src/components/MarqueeText.tsx rename to src/ui/MarqueeText.tsx index 4dd47717..83113041 100644 --- a/src/components/MarqueeText.tsx +++ b/src/ui/MarqueeText.tsx @@ -1,5 +1,5 @@ import React, { useRef, useState, useEffect, useCallback } from 'react'; -import { usePerfProbeFlags } from '../utils/perf/perfFlags'; +import { usePerfProbeFlags } from '@/utils/perf/perfFlags'; interface Props { text: string; diff --git a/src/components/SelectionToggleButton.test.tsx b/src/ui/SelectionToggleButton.test.tsx similarity index 95% rename from src/components/SelectionToggleButton.test.tsx rename to src/ui/SelectionToggleButton.test.tsx index 701f01cf..9fce76c6 100644 --- a/src/components/SelectionToggleButton.test.tsx +++ b/src/ui/SelectionToggleButton.test.tsx @@ -1,7 +1,7 @@ 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'; +import SelectionToggleButton from '@/ui/SelectionToggleButton'; describe('SelectionToggleButton', () => { it('shows the select label and calls onToggle on click', async () => { diff --git a/src/components/SelectionToggleButton.tsx b/src/ui/SelectionToggleButton.tsx similarity index 100% rename from src/components/SelectionToggleButton.tsx rename to src/ui/SelectionToggleButton.tsx diff --git a/src/components/SortDropdown.tsx b/src/ui/SortDropdown.tsx similarity index 100% rename from src/components/SortDropdown.tsx rename to src/ui/SortDropdown.tsx diff --git a/src/components/StarFilterButton.tsx b/src/ui/StarFilterButton.tsx similarity index 97% rename from src/components/StarFilterButton.tsx rename to src/ui/StarFilterButton.tsx index 2ca6a6fb..ecf5b332 100644 --- a/src/components/StarFilterButton.tsx +++ b/src/ui/StarFilterButton.tsx @@ -1,6 +1,6 @@ import { Star } from 'lucide-react'; import { useTranslation } from 'react-i18next'; -import FilterQuickClear from './FilterQuickClear'; +import FilterQuickClear from '@/ui/FilterQuickClear'; interface Props { active: boolean; diff --git a/src/components/YearFilterButton.tsx b/src/ui/YearFilterButton.tsx similarity index 99% rename from src/components/YearFilterButton.tsx rename to src/ui/YearFilterButton.tsx index 0ac11a36..6f2c13a2 100644 --- a/src/components/YearFilterButton.tsx +++ b/src/ui/YearFilterButton.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { CalendarRange, X } from 'lucide-react'; import { useTranslation } from 'react-i18next'; -import FilterQuickClear from './FilterQuickClear'; +import FilterQuickClear from '@/ui/FilterQuickClear'; import { tooltipAttrs } from '@/ui/tooltipAttrs'; import { ALBUM_YEAR_MAX,