diff --git a/src/lib/components/GlobalPlayer.svelte b/src/lib/components/GlobalPlayer.svelte deleted file mode 100644 index 51c4572..0000000 --- a/src/lib/components/GlobalPlayer.svelte +++ /dev/null @@ -1,1209 +0,0 @@ - - - - - - - - -
-
- - -
{ - const t = e.target as HTMLElement | null; - // Only toggle when tapping the track info area. Avoid toggling from - // the button zones (above/below/side) by not attaching handlers to the - // whole bar. - if (t?.closest("button,input,label,a")) return; - toggleUiOpen(); - }} - onkeydown={(e) => { - if (e.key !== "Enter" && e.key !== " ") return; - const t = e.target as HTMLElement | null; - if (t?.closest("button,input,label,a")) return; - e.preventDefault(); - toggleUiOpen(); - }} - > - {#if snap.currentTrack} -
- {#if typeNumberLabel(snap.currentTrack)} - - {typeNumberLabel(snap.currentTrack)} - - {/if} - - {( - snap.currentTrack.animeName ?? - snap.currentTrack.album ?? - "" - ).trim()} - -
- -
- {(snap.currentTrack.title ?? "").trim() || "Unknown title"} - - — {(snap.currentTrack.artist ?? "").trim() || "Unknown Artist"} - -
- {:else} -
{nowPlayingLabel()}
- {/if} - -
- {formatTime(currentTime)} / {formatTime(duration)} -
- - -
- - - - - - -
- - {#if snap.uiOpen} -
-
- -
- - - - - - - - - - - Clear queue? - - This will remove all queued tracks. - - - - - Cancel - { - clearQueue(); - clearQueueDialogOpen = false; - }} - > - Clear - - - - - - -
- - -
-
-
- Queue ({snap.queue.length}) -
- - {#if snap.queue.length === 0} -

Queue is empty.

- {:else} -
    - {#each queueDisplay as item (item.track.id)} -
  • onDragOver(item.track.id, e)} - ondrop={(e) => onDrop(item.track.id, e)} - > - - - - - -
  • - {/each} -
- {/if} -
-
-
-
- {/if} -
-
- - - - - diff --git a/src/lib/components/SongEntry.svelte b/src/lib/components/SongEntry.svelte index 2d22a12..98fd5f6 100644 --- a/src/lib/components/SongEntry.svelte +++ b/src/lib/components/SongEntry.svelte @@ -6,13 +6,7 @@ SkipForward, Trash2, } from "@lucide/svelte"; - import { - addToQueue, - hasTrack, - play, - playNext, - removeTrack, - } from "$lib/player/player.svelte"; + import { player } from "$lib/player/store.svelte"; import { type SongType, trackFromSongRow } from "$lib/player/types"; import { Button } from "./ui/button"; @@ -63,7 +57,7 @@ }), ); - const isQueued = $derived(hasTrack(annSongId)); + const isQueued = $derived(player.hasTrack(annSongId)); function requestGlobalAutoplay() { if (typeof window === "undefined") return; @@ -91,7 +85,8 @@
{animeName} - {displayTypeNumber} @@ -115,7 +110,7 @@ class="btn-icon" title="Remove from queue" aria-label="Remove from queue" - onclick={() => removeTrack(annSongId)} + onclick={() => player.remove(annSongId)} > @@ -128,7 +123,7 @@ aria-label="Play" onclick={() => { if (!track) return; - play(track); + player.add(track, true); requestGlobalAutoplay(); }} > @@ -143,7 +138,7 @@ aria-label="Play next" onclick={() => { if (!track) return; - playNext(track); + player.playNext(track); requestGlobalAutoplay(); }} > @@ -158,7 +153,7 @@ aria-label="Add to queue" onclick={() => { if (!track) return; - addToQueue(track); + player.add(track); }} > diff --git a/src/lib/components/player/Controls.svelte b/src/lib/components/player/Controls.svelte new file mode 100644 index 0000000..4493742 --- /dev/null +++ b/src/lib/components/player/Controls.svelte @@ -0,0 +1,97 @@ + + +
+ + + + + + + + + + + + + + +
diff --git a/src/lib/components/player/PlayerDesktop.svelte b/src/lib/components/player/PlayerDesktop.svelte new file mode 100644 index 0000000..cccad8f --- /dev/null +++ b/src/lib/components/player/PlayerDesktop.svelte @@ -0,0 +1,132 @@ + + +
+ {#if player.currentTrack} +
+ +
+ + +
+ + +
+

+ {player.currentTrack.title} +

+

+ {player.currentTrack.artist} +

+

+ {player.currentTrack.album || + player.currentTrack.animeName || + ""} +

+
+ + +
+ +
+ {formatTime(audio.currentTime)} + {formatTime(audio.duration)} +
+
+ + +
+ +
+ + +
+ + +
+
+ + +
+ + +
+
+
+ +
+
+
+ {:else} +
+
+ +
+

No track playing

+

+ Pick a song from the library to start listening. +

+
+ {/if} +
diff --git a/src/lib/components/player/PlayerMobile.svelte b/src/lib/components/player/PlayerMobile.svelte new file mode 100644 index 0000000..05fa63b --- /dev/null +++ b/src/lib/components/player/PlayerMobile.svelte @@ -0,0 +1,137 @@ + + +{#if player.currentTrack} +
+
(open = true)} + > + +
+ +
+ +
+ +
+
+ {player.currentTrack.title || "Unknown Title"} +
+
+ {player.currentTrack.artist || "Unknown Artist"} +
+
+
+ + +
e.stopPropagation()} + > + + + + +
+
+ + +
+
+
+
+ + + +
+ +
+
+
+ + +
+ + +
+ + +
+

+ {player.currentTrack.title} +

+

+ {player.currentTrack.artist} +

+

+ {player.currentTrack.album || + player.currentTrack.animeName} +

+
+ + +
+ +
+ {formatTime(audio.currentTime)} + {formatTime(audio.duration)} +
+
+ + +
+ +
+ + + +
+
+ +
+
+
+
+
+{/if} diff --git a/src/lib/components/player/PlayerRoot.svelte b/src/lib/components/player/PlayerRoot.svelte new file mode 100644 index 0000000..eccaf3c --- /dev/null +++ b/src/lib/components/player/PlayerRoot.svelte @@ -0,0 +1,136 @@ + + +