Move store-connected components out of ui/ into components/music and lint the ui boundary

This commit is contained in:
2026-09-24 13:58:13 +02:00
parent 2361b88e0a
commit a54d1ef077
12 changed files with 46 additions and 18 deletions
+28
View File
@@ -48,6 +48,34 @@ export default ts.config(
'@typescript-eslint/no-unused-expressions': 'off' '@typescript-eslint/no-unused-expressions': 'off'
} }
}, },
{
files: ['src/lib/components/ui/**'],
rules: {
'no-restricted-imports': [
'error',
{
patterns: [
{
group: ['../*'],
message: 'Use $lib/... instead of relative parent imports.'
},
{
group: [
'$lib/player/*',
'$lib/data/*',
'$lib/server/*',
'$lib/components/music/*',
'$lib/components/shell/*',
'$lib/components/player/*'
],
message:
'components/ui is the presentation layer: it cannot depend on app state, data or other component layers.'
}
]
}
]
}
},
{ {
ignores: ['build/', '.svelte-kit/', 'static/', 'src/lib/api/schema.d.ts'] ignores: ['build/', '.svelte-kit/', 'static/', 'src/lib/api/schema.d.ts']
} }
@@ -5,7 +5,7 @@
import { fetchAlbumTracks } from '$lib/data/albums'; import { fetchAlbumTracks } from '$lib/data/albums';
import type { Menu } from '$lib/state/menu.svelte'; import type { Menu } from '$lib/state/menu.svelte';
import type { Playlist } from '$lib/types'; import type { Playlist } from '$lib/types';
import ContextMenu from './ContextMenu.svelte'; import ContextMenu from '$lib/components/ui/overlay/ContextMenu.svelte';
interface Props { interface Props {
menu: Menu<string>; menu: Menu<string>;
@@ -3,7 +3,7 @@
import { player } from '$lib/player/player.svelte'; import { player } from '$lib/player/player.svelte';
import type { Menu } from '$lib/state/menu.svelte'; import type { Menu } from '$lib/state/menu.svelte';
import type { Playlist, Track } from '$lib/types'; import type { Playlist, Track } from '$lib/types';
import ContextMenu from './ContextMenu.svelte'; import ContextMenu from '$lib/components/ui/overlay/ContextMenu.svelte';
interface Props { interface Props {
menu: Menu<Track>; menu: Menu<Track>;
@@ -25,8 +25,8 @@
import { player } from '$lib/player/player.svelte'; import { player } from '$lib/player/player.svelte';
import { fmtTime, fmtDate } from '$lib/utils/format'; import { fmtTime, fmtDate } from '$lib/utils/format';
import { pressable } from '$lib/actions/pressable'; import { pressable } from '$lib/actions/pressable';
import MediaIdentity from './MediaIdentity.svelte'; import MediaIdentity from '$lib/components/ui/media/MediaIdentity.svelte';
import EqBars from './EqBars.svelte'; import EqBars from '$lib/components/ui/media/EqBars.svelte';
import IconButton from '$lib/components/ui/primitives/IconButton.svelte'; import IconButton from '$lib/components/ui/primitives/IconButton.svelte';
interface RowAction { interface RowAction {
+2 -2
View File
@@ -16,8 +16,8 @@
import SectionHeading from '$lib/components/ui/layout/SectionHeading.svelte'; import SectionHeading from '$lib/components/ui/layout/SectionHeading.svelte';
import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte'; import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte';
import Button from '$lib/components/ui/primitives/Button.svelte'; import Button from '$lib/components/ui/primitives/Button.svelte';
import PlayAllButton from '$lib/components/ui/media/PlayAllButton.svelte'; import PlayAllButton from '$lib/components/music/PlayAllButton.svelte';
import TrackContextMenu from '$lib/components/ui/overlay/TrackContextMenu.svelte'; import TrackContextMenu from '$lib/components/music/TrackContextMenu.svelte';
import { createMenu } from '$lib/state/menu.svelte'; import { createMenu } from '$lib/state/menu.svelte';
import { HOME_CONTINUE_LIMIT } from '$lib/config'; import { HOME_CONTINUE_LIMIT } from '$lib/config';
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import { albumCover } from '$lib/utils/hrefs'; import { albumCover } from '$lib/utils/hrefs';
import { player } from '$lib/player/player.svelte'; import { player } from '$lib/player/player.svelte';
import PlayAllButton from '$lib/components/ui/media/PlayAllButton.svelte'; import PlayAllButton from '$lib/components/music/PlayAllButton.svelte';
import X from '@lucide/svelte/icons/x'; import X from '@lucide/svelte/icons/x';
import Plus from '@lucide/svelte/icons/plus'; import Plus from '@lucide/svelte/icons/plus';
import Page from '$lib/components/ui/layout/Page.svelte'; import Page from '$lib/components/ui/layout/Page.svelte';
@@ -14,7 +14,7 @@
import Button from '$lib/components/ui/primitives/Button.svelte'; import Button from '$lib/components/ui/primitives/Button.svelte';
import BackLink from '$lib/components/ui/primitives/BackLink.svelte'; import BackLink from '$lib/components/ui/primitives/BackLink.svelte';
import SectionHeading from '$lib/components/ui/layout/SectionHeading.svelte'; import SectionHeading from '$lib/components/ui/layout/SectionHeading.svelte';
import TrackList from '$lib/components/ui/media/TrackList.svelte'; import TrackList from '$lib/components/music/TrackList.svelte';
import { albumMeta } from '$lib/utils/format'; import { albumMeta } from '$lib/utils/format';
let { data, form } = $props(); let { data, form } = $props();
@@ -20,8 +20,8 @@
import { genreHref, playlistCover } from '$lib/utils/hrefs'; import { genreHref, playlistCover } from '$lib/utils/hrefs';
import { createMenu } from '$lib/state/menu.svelte'; import { createMenu } from '$lib/state/menu.svelte';
import { createPagedList } from '$lib/state/pagedList.svelte'; import { createPagedList } from '$lib/state/pagedList.svelte';
import TrackContextMenu from '$lib/components/ui/overlay/TrackContextMenu.svelte'; import TrackContextMenu from '$lib/components/music/TrackContextMenu.svelte';
import AlbumContextMenu from '$lib/components/ui/overlay/AlbumContextMenu.svelte'; import AlbumContextMenu from '$lib/components/music/AlbumContextMenu.svelte';
import { genreInfo, genreTiles } from '$lib/data/genres'; import { genreInfo, genreTiles } from '$lib/data/genres';
import { import {
type SearchFilter, type SearchFilter,
@@ -9,7 +9,7 @@
import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte'; import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte';
import Button from '$lib/components/ui/primitives/Button.svelte'; import Button from '$lib/components/ui/primitives/Button.svelte';
import ConfirmDialog from '$lib/components/ui/overlay/ConfirmDialog.svelte'; import ConfirmDialog from '$lib/components/ui/overlay/ConfirmDialog.svelte';
import TrackList from '$lib/components/ui/media/TrackList.svelte'; import TrackList from '$lib/components/music/TrackList.svelte';
let { data } = $props(); let { data } = $props();
@@ -2,14 +2,14 @@
import Heart from '@lucide/svelte/icons/heart'; import Heart from '@lucide/svelte/icons/heart';
import X from '@lucide/svelte/icons/x'; import X from '@lucide/svelte/icons/x';
import { player } from '$lib/player/player.svelte'; import { player } from '$lib/player/player.svelte';
import PlayAllButton from '$lib/components/ui/media/PlayAllButton.svelte'; import PlayAllButton from '$lib/components/music/PlayAllButton.svelte';
import { liked } from '$lib/player/liked.svelte'; import { liked } from '$lib/player/liked.svelte';
import { plural } from '$lib/utils/format'; import { plural } from '$lib/utils/format';
import Page from '$lib/components/ui/layout/Page.svelte'; import Page from '$lib/components/ui/layout/Page.svelte';
import PageHeader from '$lib/components/ui/layout/PageHeader.svelte'; import PageHeader from '$lib/components/ui/layout/PageHeader.svelte';
import Button from '$lib/components/ui/primitives/Button.svelte'; import Button from '$lib/components/ui/primitives/Button.svelte';
import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte'; import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte';
import TrackList from '$lib/components/ui/media/TrackList.svelte'; import TrackList from '$lib/components/music/TrackList.svelte';
const tracks = $derived(liked.list); const tracks = $derived(liked.list);
const listTracks = $derived(tracks.map((track) => ({ ...track, date: track.likedAt }))); const listTracks = $derived(tracks.map((track) => ({ ...track, date: track.likedAt })));
@@ -9,11 +9,11 @@
import Alert from '$lib/components/ui/primitives/Alert.svelte'; import Alert from '$lib/components/ui/primitives/Alert.svelte';
import Artwork from '$lib/components/ui/media/Artwork.svelte'; import Artwork from '$lib/components/ui/media/Artwork.svelte';
import PageHeader from '$lib/components/ui/layout/PageHeader.svelte'; import PageHeader from '$lib/components/ui/layout/PageHeader.svelte';
import TrackList from '$lib/components/ui/media/TrackList.svelte'; import TrackList from '$lib/components/music/TrackList.svelte';
import TrackContextMenu from '$lib/components/ui/overlay/TrackContextMenu.svelte'; import TrackContextMenu from '$lib/components/music/TrackContextMenu.svelte';
import { createMenu } from '$lib/state/menu.svelte'; import { createMenu } from '$lib/state/menu.svelte';
import type { Track } from '$lib/types'; import type { Track } from '$lib/types';
import PlayAllButton from '$lib/components/ui/media/PlayAllButton.svelte'; import PlayAllButton from '$lib/components/music/PlayAllButton.svelte';
let { data, form } = $props(); let { data, form } = $props();
@@ -3,7 +3,7 @@
import ListMusic from '@lucide/svelte/icons/list-music'; import ListMusic from '@lucide/svelte/icons/list-music';
import X from '@lucide/svelte/icons/x'; import X from '@lucide/svelte/icons/x';
import { player } from '$lib/player/player.svelte'; import { player } from '$lib/player/player.svelte';
import PlayAllButton from '$lib/components/ui/media/PlayAllButton.svelte'; import PlayAllButton from '$lib/components/music/PlayAllButton.svelte';
import Page from '$lib/components/ui/layout/Page.svelte'; import Page from '$lib/components/ui/layout/Page.svelte';
import PageHeader from '$lib/components/ui/layout/PageHeader.svelte'; import PageHeader from '$lib/components/ui/layout/PageHeader.svelte';
import Modal from '$lib/components/ui/overlay/Modal.svelte'; import Modal from '$lib/components/ui/overlay/Modal.svelte';
@@ -13,7 +13,7 @@
import Button from '$lib/components/ui/primitives/Button.svelte'; import Button from '$lib/components/ui/primitives/Button.svelte';
import BackLink from '$lib/components/ui/primitives/BackLink.svelte'; import BackLink from '$lib/components/ui/primitives/BackLink.svelte';
import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte'; import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte';
import TrackList from '$lib/components/ui/media/TrackList.svelte'; import TrackList from '$lib/components/music/TrackList.svelte';
import { playlistMeta } from '$lib/utils/format'; import { playlistMeta } from '$lib/utils/format';
let { data, form } = $props(); let { data, form } = $props();