diff --git a/web-player/scripts/check-tokens.mjs b/web-player/scripts/check-tokens.mjs
index 4f2e14e..928ab06 100644
--- a/web-player/scripts/check-tokens.mjs
+++ b/web-player/scripts/check-tokens.mjs
@@ -15,6 +15,7 @@ const ARBITRARY_WHITELIST = [
/^my-\[\d+d?vh\]$/, // +error.svelte: centrado vertical de página de error
/^py-\[\d+d?vh\]$/, // Explorar: centrado vertical de "sin resultados"
/^transition-\[filter\]$/, // Explorar: genre-tile hover
+ /^transition-\[transform,width\]$/, // Tabs: indicador deslizante
/^bg-\[image:var\(--mf-[\w-]+\)\]$/
];
diff --git a/web-player/src/lib/components/music/TrackStatusBadge.svelte b/web-player/src/lib/components/music/TrackStatusBadge.svelte
index 1aa83b7..d22ba28 100644
--- a/web-player/src/lib/components/music/TrackStatusBadge.svelte
+++ b/web-player/src/lib/components/music/TrackStatusBadge.svelte
@@ -13,4 +13,9 @@
const info = $derived(TRACK_STATUS[status]);
-
+
diff --git a/web-player/src/lib/components/music/library/AlbumTrackPicker.svelte b/web-player/src/lib/components/music/library/AlbumTrackPicker.svelte
index f322e65..9b84fea 100644
--- a/web-player/src/lib/components/music/library/AlbumTrackPicker.svelte
+++ b/web-player/src/lib/components/music/library/AlbumTrackPicker.svelte
@@ -4,6 +4,7 @@
import X from '@lucide/svelte/icons/x';
import type { LibraryTrack } from '$lib/types';
import { plural } from '$lib/utils/format';
+ import { transferBetweenLists } from '$lib/utils/transitions';
import EmptyState from '$lib/components/ui/primitives/EmptyState.svelte';
import TrackPickList from './TrackPickList.svelte';
@@ -14,6 +15,8 @@
let { tracks, memberIds }: Props = $props();
+ const [send, receive] = transferBetweenLists();
+
let currentIds = $state(untrack(() => [...memberIds]));
const initialIds = untrack(() => new Set(memberIds));
@@ -43,13 +46,13 @@
{#if available.length > 0}
Añadir desde tu biblioteca
-
+
{/if}
{#if inAlbum.length > 0}
En este álbum
-
+
{:else}
+ const FADE = { duration: 200 };
+
+
{label}{label}
diff --git a/web-player/src/lib/components/ui/primitives/Tabs.svelte b/web-player/src/lib/components/ui/primitives/Tabs.svelte
index 4e86149..681006a 100644
--- a/web-player/src/lib/components/ui/primitives/Tabs.svelte
+++ b/web-player/src/lib/components/ui/primitives/Tabs.svelte
@@ -12,16 +12,43 @@
}
let { label, tabs, class: klass = '' }: Props = $props();
+
+ let links = $state>({});
+ let indicator = $state({ x: 0, width: 0 });
+ let measured = $state(false);
+ let animated = $state(false);
+
+ const activeHref = $derived(tabs.find((tab) => tab.active)?.href);
+
+ $effect(() => {
+ const link = activeHref ? links[activeHref] : undefined;
+ if (!link) return;
+ indicator = { x: link.offsetLeft, width: link.offsetWidth };
+ measured = true;
+ if (!animated) requestAnimationFrame(() => (animated = true));
+ });
-