Index: frontend/src/components/Sidebar.tsx
===================================================================
--- frontend/src/components/Sidebar.tsx	(revision a5406e15fca40fca7cc5f6ddb05de390f713d71b)
+++ frontend/src/components/Sidebar.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -5,23 +5,5 @@
 import { usePlayer } from "../context/playerContext";
 import type { BasicPlaylist, BasicSong, SidebarProps } from "../utils/types";
-
-const toEmbedUrl = (url: string): string => {
-	try {
-		const parsed = new URL(url);
-		if (
-			(parsed.hostname === "www.youtube.com" ||
-				parsed.hostname === "youtube.com") &&
-			parsed.searchParams.has("v")
-		) {
-			return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
-		}
-		if (parsed.hostname === "youtu.be") {
-			return `https://www.youtube.com/embed${parsed.pathname}`;
-		}
-		return url;
-	} catch {
-		return url;
-	}
-};
+import { toEmbedUrl } from "../utils/utils";
 
 const Sidebar = ({ isOpen, onClose }: SidebarProps) => {
Index: frontend/src/components/SongItem.tsx
===================================================================
--- frontend/src/components/SongItem.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
+++ frontend/src/components/SongItem.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -0,0 +1,259 @@
+import { useEffect, useRef, useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { usePlayer } from "../context/playerContext";
+import { toEmbedUrl } from "../utils/utils";
+
+export interface SongItemData {
+	id: number;
+	title: string;
+	cover?: string | null;
+	genre?: string;
+	link?: string | null;
+	releasedBy?: string;
+	isLikedByCurrentUser?: boolean;
+}
+
+interface SongItemProps {
+	song: SongItemData;
+	/** Optional label shown before the artist, e.g. "Song" for search results */
+	label?: string;
+	/** Optional role badge for artist contributions, e.g. "PERFORMER" */
+	role?: string;
+	/** Optional index number for playlist/collection views */
+	index?: number;
+	/** Callback when the like button is clicked */
+	onLikeToggle?: (songId: number) => void;
+}
+
+const ROLE_COLORS: { [key: string]: string } = {
+	COMPOSER: "bg-purple-500/20 text-purple-300",
+	PERFORMER: "bg-blue-500/20 text-blue-300",
+	PRODUCER: "bg-green-500/20 text-green-300",
+	MAIN_VOCAL: "bg-pink-500/20 text-pink-300",
+};
+
+const SongItem = ({
+	song,
+	label,
+	role,
+	index,
+	onLikeToggle,
+}: SongItemProps) => {
+	const navigate = useNavigate();
+	const { play, currentSong } = usePlayer();
+	const [playlistOpen, setPlaylistOpen] = useState(false);
+	const dropdownRef = useRef<HTMLDivElement>(null);
+
+	const isPlaying = currentSong?.id === song.id;
+
+	useEffect(() => {
+		const handleClickOutside = (event: MouseEvent) => {
+			if (
+				dropdownRef.current &&
+				!dropdownRef.current.contains(event.target as Node)
+			) {
+				setPlaylistOpen(false);
+			}
+		};
+		if (playlistOpen) {
+			document.addEventListener("mousedown", handleClickOutside);
+		}
+		return () => document.removeEventListener("mousedown", handleClickOutside);
+	}, [playlistOpen]);
+
+	const handleAddToPlaylist = (playlistName: string) => {
+		console.log(`Adding song ${song.id} to ${playlistName}`);
+		// TODO: Implement actual API call
+		setPlaylistOpen(false);
+	};
+
+	const handleCreateNewPlaylist = () => {
+		console.log(`Creating new playlist for song ${song.id}`);
+		// TODO: Implement actual playlist creation
+		setPlaylistOpen(false);
+	};
+
+	// Build subtitle
+	const subtitleParts: string[] = [];
+	if (label) subtitleParts.push(label);
+	if (song.releasedBy) subtitleParts.push(song.releasedBy);
+	const subtitle = subtitleParts.join(" • ");
+
+	return (
+		<div
+			onClick={() => navigate(`/songs/${song.id}`)}
+			className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"
+		>
+			{/* Optional index */}
+			{index != null && (
+				<span className="text-gray-500 font-medium w-8 text-center text-sm shrink-0">
+					{index}
+				</span>
+			)}
+
+			{/* Cover */}
+			<img
+				src={song.cover || "/favicon.png"}
+				alt={song.title}
+				className="w-12 h-12 rounded object-cover shrink-0"
+				onError={(e) => {
+					(e.target as HTMLImageElement).src = "/favicon.png";
+				}}
+			/>
+
+			{/* Title & subtitle */}
+			<div className="flex-1 min-w-0">
+				<p
+					className={`font-medium truncate ${
+						isPlaying ? "text-[#1db954]" : "text-white"
+					}`}
+				>
+					{song.title}
+				</p>
+				{subtitle && (
+					<p className="text-sm text-gray-400 truncate">{subtitle}</p>
+				)}
+			</div>
+
+			{/* Role badge (artist contributions) */}
+			{role && (
+				<span
+					className={`px-3 py-1 rounded-full text-xs font-medium hidden sm:block ${
+						ROLE_COLORS[role] || "bg-white/10 text-gray-300"
+					}`}
+				>
+					{role.replace("_", " ")}
+				</span>
+			)}
+
+			{/* Genre */}
+			{song.genre && (
+				<span className="text-xs text-gray-500 uppercase tracking-wider mr-2 hidden sm:block">
+					{song.genre}
+				</span>
+			)}
+
+			{/* Play button */}
+			{song.link && (
+				<button
+					onClick={(e) => {
+						e.stopPropagation();
+						play({
+							id: song.id,
+							title: song.title,
+							artist: song.releasedBy || "",
+							cover: song.cover,
+							embedUrl: toEmbedUrl(song.link!),
+						});
+					}}
+					className={`p-2 rounded-full transition-all cursor-pointer ${
+						isPlaying
+							? "bg-white text-[#1db954] opacity-100"
+							: "bg-[#1db954] text-black hover:scale-110 opacity-0 group-hover:opacity-100"
+					}`}
+					aria-label={isPlaying ? "Now playing" : "Play song"}
+				>
+					{isPlaying ? (
+						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
+							<path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z" />
+						</svg>
+					) : (
+						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
+							<path d="M8 5v14l11-7z" />
+						</svg>
+					)}
+				</button>
+			)}
+
+			{/* Like button */}
+			{onLikeToggle && (
+				<button
+					onClick={(e) => {
+						e.stopPropagation();
+						onLikeToggle(song.id);
+					}}
+					className="p-2 hover:bg-white/10 rounded-full transition-colors cursor-pointer"
+					aria-label={song.isLikedByCurrentUser ? "Unlike" : "Like"}
+				>
+					<svg
+						className="w-5 h-5"
+						fill={song.isLikedByCurrentUser ? "#ef4444" : "none"}
+						stroke={song.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
+						strokeWidth="2"
+						viewBox="0 0 24 24"
+					>
+						<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+					</svg>
+				</button>
+			)}
+
+			{/* Three-dot menu */}
+			<div className="relative" ref={dropdownRef}>
+				<button
+					onClick={(e) => {
+						e.stopPropagation();
+						setPlaylistOpen((prev) => !prev);
+					}}
+					className="p-2 hover:bg-white/10 rounded-full transition-colors cursor-pointer text-gray-400 hover:text-white"
+					aria-label="More options"
+				>
+					<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
+						<circle cx="12" cy="5" r="1.5" />
+						<circle cx="12" cy="12" r="1.5" />
+						<circle cx="12" cy="19" r="1.5" />
+					</svg>
+				</button>
+
+				{playlistOpen && (
+					<div className="absolute right-0 bottom-full mb-2 w-48 bg-[#282828] border border-white/10 rounded-lg shadow-lg py-1 z-50">
+						<div className="px-3 py-2 text-xs text-gray-400 border-b border-white/10">
+							Add to playlist
+						</div>
+						<button
+							onClick={(e) => {
+								e.stopPropagation();
+								handleAddToPlaylist("Playlist 1");
+							}}
+							className="w-full text-left px-4 py-2 text-sm text-white hover:bg-white/10 transition-colors"
+						>
+							Playlist 1
+						</button>
+						<button
+							onClick={(e) => {
+								e.stopPropagation();
+								handleAddToPlaylist("Playlist 2");
+							}}
+							className="w-full text-left px-4 py-2 text-sm text-white hover:bg-white/10 transition-colors"
+						>
+							Playlist 2
+						</button>
+						<button
+							onClick={(e) => {
+								e.stopPropagation();
+								handleCreateNewPlaylist();
+							}}
+							className="w-full text-left px-4 py-2 text-sm text-[#1db954] hover:bg-white/10 transition-colors border-t border-white/10 flex items-center gap-2"
+						>
+							<svg
+								className="w-4 h-4"
+								fill="none"
+								stroke="currentColor"
+								viewBox="0 0 24 24"
+							>
+								<path
+									strokeLinecap="round"
+									strokeLinejoin="round"
+									strokeWidth={2}
+									d="M12 4v16m8-8H4"
+								/>
+							</svg>
+							Create new playlist
+						</button>
+					</div>
+				)}
+			</div>
+		</div>
+	);
+};
+
+export default SongItem;
Index: frontend/src/components/search/SongResult.tsx
===================================================================
--- frontend/src/components/search/SongResult.tsx	(revision a5406e15fca40fca7cc5f6ddb05de390f713d71b)
+++ frontend/src/components/search/SongResult.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,87 +1,25 @@
-import { useNavigate } from "react-router-dom";
-import { usePlayer } from "../../context/playerContext";
+import axiosInstance from "../../api/axiosInstance";
 import type { Song } from "../../utils/types";
+import SongItem from "../SongItem";
 
 interface SongResultProps {
 	song: Song;
+	/** Propagate like state change upward if needed */
+	onLikeToggled?: (songId: number, isLiked: boolean) => void;
 }
 
-const toEmbedUrl = (url: string): string => {
-	try {
-		const parsed = new URL(url);
-		if (
-			(parsed.hostname === "www.youtube.com" ||
-				parsed.hostname === "youtube.com") &&
-			parsed.searchParams.has("v")
-		) {
-			return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
+const SongResult = ({ song, onLikeToggled }: SongResultProps) => {
+	const handleLike = async (songId: number) => {
+		try {
+			const response = await axiosInstance.post(
+				`/musical-entity/${songId}/like`,
+			);
+			onLikeToggled?.(songId, response.data.isLiked);
+		} catch (err) {
+			console.error("Error toggling like:", err);
 		}
-		if (parsed.hostname === "youtu.be") {
-			return `https://www.youtube.com/embed${parsed.pathname}`;
-		}
-		return url;
-	} catch {
-		return url;
-	}
-};
+	};
 
-const SongResult = ({ song }: SongResultProps) => {
-	const navigate = useNavigate();
-	const { play, currentSong } = usePlayer();
-
-	return (
-		<div
-			onClick={() => navigate(`/songs/${song.id}`)}
-			className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"
-		>
-			<img
-				src={song.cover || "/favicon.png"}
-				alt={song.title}
-				className="w-12 h-12 rounded object-cover"
-				onError={(e) => {
-					(e.target as HTMLImageElement).src = "/favicon.png";
-				}}
-			/>
-			<div className="flex-1 min-w-0">
-				<p className="text-white font-medium truncate">{song.title}</p>
-				<p className="text-sm text-gray-400 truncate">
-					Song • {song.releasedBy}
-				</p>
-			</div>
-			<span className="text-xs text-gray-500 uppercase tracking-wider mr-2">
-				{song.genre}
-			</span>
-			{song.link && (
-				<button
-					onClick={(e) => {
-						e.stopPropagation();
-						play({
-							id: song.id,
-							title: song.title,
-							artist: song.releasedBy,
-							cover: song.cover,
-							embedUrl: toEmbedUrl(song.link!),
-						});
-					}}
-					className={`p-2 rounded-full transition-all opacity-0 group-hover:opacity-100 ${
-						currentSong?.id === song.id
-							? "bg-white text-[#1db954]"
-							: "bg-[#1db954] text-black hover:scale-110"
-					}`}
-					aria-label={currentSong?.id === song.id ? "Now playing" : "Play song"}
-				>
-					{currentSong?.id === song.id ? (
-						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
-							<path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z" />
-						</svg>
-					) : (
-						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
-							<path d="M8 5v14l11-7z" />
-						</svg>
-					)}
-				</button>
-			)}
-		</div>
-	);
+	return <SongItem song={song} label="Song" onLikeToggle={handleLike} />;
 };
 
Index: frontend/src/components/userProfile/ArtistView.tsx
===================================================================
--- frontend/src/components/userProfile/ArtistView.tsx	(revision a5406e15fca40fca7cc5f6ddb05de390f713d71b)
+++ frontend/src/components/userProfile/ArtistView.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,209 +1,149 @@
+import { Disc3, Music } from "lucide-react";
+import { useState } from "react";
 import { useNavigate } from "react-router-dom";
-import { useState } from "react";
-import { Music, Disc3, Play, Plus } from "lucide-react";
+import { toast } from "react-toastify";
+import axiosInstance from "../../api/axiosInstance";
 import type { ArtistContribution } from "../../utils/types";
-import axiosInstance from "../../api/axiosInstance";
+import SongItem from "../SongItem";
 
 interface ArtistViewProps {
-  contributions: ArtistContribution[];
+	contributions: ArtistContribution[];
 }
 
 const ArtistView = ({ contributions }: ArtistViewProps) => {
-  const navigate = useNavigate();
-  const [items, setItems] = useState(contributions);
-  const [toast, setToast] = useState<{ message: string; show: boolean }>({
-    message: "",
-    show: false,
-  });
+	const navigate = useNavigate();
+	const [items, setItems] = useState(contributions);
 
-  const albums = items.filter((c) => c.entityType === "ALBUM");
-  const songs = items.filter((c) => c.entityType === "SONG");
+	const albums = items.filter((c) => c.entityType === "ALBUM");
+	const songs = items.filter((c) => c.entityType === "SONG");
 
-  const getRoleColor = (role: string) => {
-    const colors: { [key: string]: string } = {
-      COMPOSER: "bg-purple-100 text-purple-700",
-      PERFORMER: "bg-blue-100 text-blue-700",
-      PRODUCER: "bg-green-100 text-green-700",
-      MAIN_VOCAL: "bg-pink-100 text-pink-700",
-    };
-    return colors[role] || "bg-gray-100 text-gray-700";
-  };
+	const getRoleColor = (role: string) => {
+		const colors: { [key: string]: string } = {
+			COMPOSER: "bg-purple-500/20 text-purple-300",
+			PERFORMER: "bg-blue-500/20 text-blue-300",
+			PRODUCER: "bg-green-500/20 text-green-300",
+			MAIN_VOCAL: "bg-pink-500/20 text-pink-300",
+		};
+		return colors[role] || "bg-white/10 text-gray-300";
+	};
 
-  const showToast = (message: string) => {
-    setToast({ message, show: true });
-    setTimeout(() => {
-      setToast({ message: "", show: false });
-    }, 2000);
-  };
+	const handleLike = async (id: number, title: string) => {
+		try {
+			const response = await axiosInstance.post(`/musical-entity/${id}/like`);
+			const data = response.data;
 
-  const handleLike = async (id: number, title: string) => {
-    try {
-      const response = await axiosInstance.post(`/musical-entity/${id}/like`);
-      const data = response.data;
+			setItems((prevItems) =>
+				prevItems.map((item) =>
+					item.id === data.entityId
+						? { ...item, isLikedByCurrentUser: data.isLiked }
+						: item,
+				),
+			);
+			toast.success(
+				data.isLiked ? `Liked "${title}"` : `Removed "${title}" from likes`,
+			);
+		} catch (err: any) {
+			toast.error(err.response?.data?.error || "Failed to like the item");
+		}
+	};
 
-      setItems((prevItems) =>
-        prevItems.map((item) =>
-          item.id === data.entityId
-            ? { ...item, isLikedByCurrentUser: data.isLiked }
-            : item,
-        ),
-      );
+	return (
+		<div className="mt-8">
+			{albums.length > 0 && (
+				<div className="mb-12">
+					<div className="flex items-center gap-3 mb-6">
+						<Disc3 className="w-6 h-6 text-[#1db954]" />
+						<h2 className="text-2xl font-bold text-white">Albums</h2>
+					</div>
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{albums.map((album) => (
+							<div
+								key={album.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/album/${album.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg mb-3 overflow-hidden shadow-md group-hover:shadow-xl transition-all duration-300 bg-[#181818]">
+									<img
+										src={album.cover || "/favicon.png"}
+										alt={album.title}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
 
-      showToast(
-        data.isLiked ? `Liked "${title}"` : `Removed ${title} from likes`,
-      );
-    } catch (err: any) {
-      showToast(err.response?.data?.error);
-    }
-  };
+									<button
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
+										title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
+										onClick={(e) => {
+											e.stopPropagation();
+											handleLike(album.id, album.title);
+										}}
+									>
+										<svg
+											className="w-5 h-5"
+											fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
+											stroke={
+												album.isLikedByCurrentUser ? "#ef4444" : "#9ca3af"
+											}
+											strokeWidth="2"
+											viewBox="0 0 24 24"
+										>
+											<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+										</svg>
+									</button>
 
-  return (
-    <div className="mt-8">
-      {toast.show && (
-        <div className="fixed bottom-8 left-1/2 -translate-x-1/2 z-50 animate-fade-in-up">
-          <div className="bg-gray-900 text-white px-6 py-3 rounded-full shadow-lg text-sm font-medium">
-            {toast.message}
-          </div>
-        </div>
-      )}
+									<div className="absolute bottom-0 left-0 right-0 bg-linear-to-t from-black/80 to-transparent p-3">
+										<span
+											className={`text-xs px-2 py-1 rounded-full font-medium ${getRoleColor(album.role)}`}
+										>
+											{album.role.replace("_", " ")}
+										</span>
+									</div>
+								</div>
+								<h3 className="font-semibold text-sm line-clamp-2 text-white group-hover:text-[#1db954] transition-colors">
+									{album.title}
+								</h3>
+							</div>
+						))}
+					</div>
+				</div>
+			)}
 
-      {albums.length > 0 && (
-        <div className="mb-12">
-          <div className="flex items-center gap-3 mb-6">
-            <Disc3 className="w-6 h-6 text-gray-700" />
-            <h2 className="text-2xl font-bold text-gray-800">Albums</h2>
-          </div>
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {albums.map((album) => (
-              <div
-                key={album.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/album/${album.id}`)}
-              >
-                <div className="relative aspect-square bg-gradient-to-br from-blue-400 to-purple-500 rounded-lg mb-3 overflow-hidden shadow-md group-hover:shadow-lg transition-all duration-300">
-                  <div className="absolute inset-0 flex items-center justify-center">
-                    <Disc3 className="w-16 h-16 text-white opacity-30" />
-                  </div>
+			{songs.length > 0 && (
+				<div className="mb-12">
+					<div className="flex items-center gap-3 mb-6">
+						<Music className="w-6 h-6 text-[#1db954]" />
+						<h2 className="text-2xl font-bold text-white">Songs</h2>
+					</div>
+					<div className="space-y-1">
+						{songs.map((song) => (
+							<SongItem
+								key={song.id}
+								song={{
+									id: song.id,
+									title: song.title,
+									cover: song.cover,
+									genre: song.genre,
+									link: song.link,
+									isLikedByCurrentUser: song.isLikedByCurrentUser,
+								}}
+								role={song.role}
+								onLikeToggle={() => handleLike(song.id, song.title)}
+							/>
+						))}
+					</div>
+				</div>
+			)}
 
-                  <button
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
-                    title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
-                    onClick={(e) => {
-                      e.stopPropagation();
-                      handleLike(album.id, album.title);
-                    }}
-                  >
-                    <svg
-                      className="w-5 h-5"
-                      fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
-                      stroke={
-                        album.isLikedByCurrentUser ? "#ef4444" : "#6b7280"
-                      }
-                      strokeWidth="2"
-                      viewBox="0 0 24 24"
-                    >
-                      <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                    </svg>
-                  </button>
-
-                  <div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/60 to-transparent p-3">
-                    <span
-                      className={`text-xs px-2 py-1 rounded-full font-medium ${getRoleColor(album.role)}`}
-                    >
-                      {album.role.replace("_", " ")}
-                    </span>
-                  </div>
-                </div>
-                <h3 className="font-semibold text-sm line-clamp-2 text-gray-900 group-hover:text-blue-600 transition-colors">
-                  {album.title}
-                </h3>
-              </div>
-            ))}
-          </div>
-        </div>
-      )}
-
-      {songs.length > 0 && (
-        <div className="mb-12">
-          <div className="flex items-center gap-3 mb-6">
-            <Music className="w-6 h-6 text-gray-700" />
-            <h2 className="text-2xl font-bold text-gray-800">Songs</h2>
-          </div>
-          <div className="space-y-2">
-            {songs.map((song) => (
-              <div
-                key={song.id}
-                className="group relative flex items-center gap-4 p-3 rounded-lg hover:bg-gray-50 transition-all cursor-pointer"
-                onClick={() => navigate(`/musical-entity/${song.id}`)}
-              >
-                <div className="relative shrink-0">
-                  <div className="w-12 h-12 bg-gradient-to-br from-blue-400 to-purple-500 rounded flex items-center justify-center shadow-sm">
-                    <Music className="w-6 h-6 text-white" />
-                  </div>
-                  <button
-                    className="absolute inset-0 bg-black/60 rounded flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200"
-                    aria-label="Play song"
-                  >
-                    <Play className="w-6 h-6 text-white fill-white" />
-                  </button>
-                </div>
-
-                <div className="flex-1 min-w-0">
-                  <h3 className="font-semibold text-base text-gray-900 group-hover:text-blue-600 transition-colors truncate">
-                    {song.title}
-                  </h3>
-                  <div className="flex items-center gap-2 mt-1">
-                    <span className="text-sm text-gray-600">{song.genre}</span>
-                  </div>
-                </div>
-
-                <span
-                  className={`px-3 py-1 rounded-full text-sm font-medium ${getRoleColor(song.role)}`}
-                >
-                  {song.role.replace("_", " ")}
-                </span>
-
-                <div className="flex items-center gap-2">
-                  <button
-                    className="p-2 hover:bg-gray-200 rounded-full transition-colors duration-200 cursor-pointer"
-                    title="Add to playlist"
-                  >
-                    <Plus className="w-5 h-5 text-gray-600" />
-                  </button>
-
-                  <button
-                    className="p-2 hover:bg-gray-200 rounded-full transition-colors duration-200 cursor-pointer"
-                    title={song.isLikedByCurrentUser ? "Unlike" : "Like"}
-                    onClick={(e) => {
-                      e.stopPropagation();
-                      handleLike(song.id, song.title);
-                    }}
-                  >
-                    <svg
-                      className="w-5 h-5"
-                      fill={song.isLikedByCurrentUser ? "#ef4444" : "none"}
-                      stroke={song.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
-                      strokeWidth="2"
-                      viewBox="0 0 24 24"
-                    >
-                      <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                    </svg>
-                  </button>
-                </div>
-              </div>
-            ))}
-          </div>
-        </div>
-      )}
-
-      {contributions.length === 0 && (
-        <div className="flex flex-col items-center justify-center py-16 text-gray-400">
-          <Music className="w-20 h-20 mb-4 opacity-20" />
-          <p className="text-lg font-medium">No contributions yet</p>
-          <p className="text-sm mt-2">Start creating music to see it here</p>
-        </div>
-      )}
-    </div>
-  );
+			{contributions.length === 0 && (
+				<div className="flex flex-col items-center justify-center py-16 text-gray-500">
+					<Music className="w-20 h-20 mb-4 opacity-20" />
+					<p className="text-lg font-medium">No contributions yet</p>
+					<p className="text-sm mt-2">Start creating music to see it here</p>
+				</div>
+			)}
+		</div>
+	);
 };
 
Index: frontend/src/components/userProfile/ListenerView.tsx
===================================================================
--- frontend/src/components/userProfile/ListenerView.tsx	(revision a5406e15fca40fca7cc5f6ddb05de390f713d71b)
+++ frontend/src/components/userProfile/ListenerView.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,333 +1,285 @@
+import { Album, Bookmark, Heart, ListMusic, Music } from "lucide-react";
+import { useState } from "react";
 import { useNavigate } from "react-router-dom";
-import { Heart, ListMusic, Music, Album, Bookmark } from "lucide-react";
-import type { Playlist, MusicalEntity } from "../../utils/types";
+import { toast } from "react-toastify";
 import axiosInstance from "../../api/axiosInstance";
-import { useState } from "react";
+import type { MusicalEntity, Playlist } from "../../utils/types";
+import SongItem from "../SongItem";
 
 interface ListenerViewProps {
-  likedEntities: MusicalEntity[] | [];
-  createdPlaylists: Playlist[] | [];
-  savedPlaylists: Playlist[] | [];
+	likedEntities: MusicalEntity[] | [];
+	createdPlaylists: Playlist[] | [];
+	savedPlaylists: Playlist[] | [];
 }
 
 const ListenerView = ({
-  likedEntities,
-  createdPlaylists,
-  savedPlaylists,
+	likedEntities,
+	createdPlaylists,
+	savedPlaylists,
 }: ListenerViewProps) => {
-  const navigate = useNavigate();
-  const [items, setItems] = useState(likedEntities);
-  const [savedItems, setSavedItems] = useState(savedPlaylists);
-  const [toast, setToast] = useState<{ message: string; show: boolean }>({
-    message: "",
-    show: false,
-  });
-
-  const showToast = (message: string) => {
-    setToast({ message, show: true });
-    setTimeout(() => {
-      setToast({ message: "", show: false });
-    }, 2000);
-  };
-
-  const likedSongs = items.filter((e) => e.type === "SONG");
-  const likedAlbums = items.filter((e) => e.type === "ALBUM");
-
-  const handleSavePlaylist = async (
-    e: React.MouseEvent,
-    playlistId: number,
-    playlistName: string,
-  ) => {
-    e.stopPropagation();
-
-    try {
-      const response = await axiosInstance.post(`/playlist/${playlistId}/save`);
-      const data = response.data;
-
-      setSavedItems((prevItems) =>
-        data.isSaved
-          ? [...prevItems, prevItems.find((p) => p.id === playlistId)!]
-          : prevItems.filter((p) => p.id !== playlistId),
-      );
-
-      showToast(
-        data.isSaved
-          ? `Saved "${playlistName}"`
-          : `Removed "${playlistName}" from saved playlists`,
-      );
-    } catch (err: any) {
-      showToast(err.response?.data?.error || "Failed to save playlist");
-    }
-  };
-
-  const handleLike = async (id: number, title: string) => {
-    try {
-      const response = await axiosInstance.post(`/musical-entity/${id}/like`);
-      const data = response.data;
-
-      setItems((prevItems) =>
-        prevItems.map((item) =>
-          item.id === data.entityId
-            ? { ...item, isLikedByCurrentUser: data.isLiked }
-            : item,
-        ),
-      );
-
-      showToast(
-        data.isLiked ? `Liked "${title}"` : `Removed "${title}" from likes`,
-      );
-    } catch (err: any) {
-      showToast(err.response?.data?.error);
-    }
-  };
-
-  return (
-    <div className="mt-8 space-y-12">
-      {toast.show && (
-        <div className="fixed bottom-8 left-1/2 -translate-x-1/2 z-50 animate-fade-in-up">
-          <div className="bg-gray-900 text-white px-6 py-3 rounded-full shadow-lg text-sm font-medium">
-            {toast.message}
-          </div>
-        </div>
-      )}
-
-      {createdPlaylists && createdPlaylists.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <ListMusic className="w-6 h-6 text-gray-700" />
-            <h3 className="text-2xl font-bold text-gray-800">
-              Created Playlists
-            </h3>
-            <span className="text-sm text-gray-500">
-              ({createdPlaylists.length})
-            </span>
-          </div>
-
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {createdPlaylists.map((playlist) => (
-              <div
-                key={playlist.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
-              >
-                <div className="relative aspect-square rounded-lg overflow-hidden bg-gray-100 mb-3 shadow-md group-hover:shadow-lg transition-all">
-                  {playlist.cover ? (
-                    <img
-                      src={playlist.cover}
-                      alt={playlist.name}
-                      className="w-full h-full object-cover"
-                    />
-                  ) : (
-                    <div className="w-full h-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center">
-                      <ListMusic className="w-16 h-16 text-white opacity-30" />
-                    </div>
-                  )}
-
-                  <button
-                    onClick={(e) =>
-                      handleSavePlaylist(e, playlist.id, playlist.name)
-                    }
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
-                    title={playlist.isSavedByCurrentUser ? "Unsave" : "Save"}
-                  >
-                    <Bookmark
-                      className={`w-5 h-5 ${
-                        playlist.isSavedByCurrentUser
-                          ? "fill-blue-600 text-blue-600"
-                          : "text-gray-600"
-                      }`}
-                    />
-                  </button>
-                </div>
-                <p className="text-sm font-semibold text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                  {playlist.name}
-                </p>
-                <p className="text-xs text-gray-500 truncate">
-                  {playlist.creatorName}
-                </p>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {savedItems && savedItems.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <Bookmark className="w-6 h-6 text-blue-600 fill-blue-600" />
-            <h3 className="text-2xl font-bold text-gray-800">
-              Saved Playlists
-            </h3>
-            <span className="text-sm text-gray-500">({savedItems.length})</span>
-          </div>
-
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {savedItems.map((playlist) => (
-              <div
-                key={playlist.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
-              >
-                <div className="relative aspect-square rounded-lg overflow-hidden bg-gray-100 mb-3 shadow-md group-hover:shadow-lg transition-all">
-                  {playlist.cover ? (
-                    <img
-                      src={playlist.cover}
-                      alt={playlist.name}
-                      className="w-full h-full object-cover"
-                    />
-                  ) : (
-                    <div className="w-full h-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center">
-                      <ListMusic className="w-16 h-16 text-white opacity-30" />
-                    </div>
-                  )}
-
-                  <button
-                    onClick={(e) =>
-                      handleSavePlaylist(e, playlist.id, playlist.name)
-                    }
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
-                    title="Unsave"
-                  >
-                    <Bookmark className="w-5 h-5 fill-blue-600 text-blue-600" />
-                  </button>
-                </div>
-                <p className="text-sm font-semibold text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                  {playlist.name}
-                </p>
-                <p className="text-xs text-gray-500 truncate">
-                  {playlist.creatorName}
-                </p>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {likedSongs && likedSongs.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <Heart className="w-6 h-6 text-red-500 fill-red-500" />
-            <h3 className="text-2xl font-bold text-gray-800">Liked Songs</h3>
-            <span className="text-sm text-gray-500">
-              ({likedSongs?.length})
-            </span>
-          </div>
-
-          <div className="space-y-2">
-            {likedSongs.map((song, index) => (
-              <div
-                key={song.id}
-                className="flex items-center gap-4 p-3 rounded-lg hover:bg-gray-50 cursor-pointer group transition-colors"
-                onClick={() => navigate(`/musical-entity/${song.id}`)}
-              >
-                <span className="text-gray-500 font-medium w-8 text-center">
-                  {index + 1}
-                </span>
-                <div className="w-12 h-12 rounded bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center flex-shrink-0 shadow-sm">
-                  <Music className="w-6 h-6 text-white" />
-                </div>
-                <div className="flex-1 min-w-0">
-                  <p className="font-semibold text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                    {song.title}
-                  </p>
-                  <p className="text-sm text-gray-600 truncate">
-                    {song.releasedBy}
-                  </p>
-                </div>
-                <span className="text-sm text-gray-600 px-3 py-1 bg-gray-100 rounded-full">
-                  {song.genre}
-                </span>
-
-                <button
-                  onClick={(e) => {
-                    e.stopPropagation();
-                    handleLike(song.id, song.title);
-                  }}
-                  className="p-2 hover:bg-gray-200 rounded-full transition-colors duration-200 cursor-pointer"
-                  title={song.isLikedByCurrentUser ? "Unlike" : "Like"}
-                >
-                  <svg
-                    className="w-5 h-5"
-                    fill={song.isLikedByCurrentUser ? "#ef4444" : "none"}
-                    stroke={song.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
-                    strokeWidth="2"
-                    viewBox="0 0 24 24"
-                  >
-                    <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                  </svg>
-                </button>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {likedAlbums && likedAlbums.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <Album className="w-6 h-6 text-gray-700" />
-            <h3 className="text-2xl font-bold text-gray-800">Liked Albums</h3>
-            <span className="text-sm text-gray-500">
-              ({likedAlbums.length})
-            </span>
-          </div>
-
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {likedAlbums.map((album) => (
-              <div
-                key={album.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/album/${album.id}`)}
-              >
-                <div className="relative aspect-square rounded-lg overflow-hidden bg-gradient-to-br from-blue-400 to-purple-500 mb-3 flex items-center justify-center shadow-md group-hover:shadow-lg transition-all">
-                  <Album className="w-16 h-16 text-white opacity-30" />
-
-                  <button
-                    onClick={(e) => {
-                      e.stopPropagation();
-                      handleLike(album.id, album.title);
-                    }}
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
-                    title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
-                  >
-                    <svg
-                      className="w-5 h-5"
-                      fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
-                      stroke={
-                        album.isLikedByCurrentUser ? "#ef4444" : "#6b7280"
-                      }
-                      strokeWidth="2"
-                      viewBox="0 0 24 24"
-                    >
-                      <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                    </svg>
-                  </button>
-                </div>
-                <p className="font-semibold text-sm text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                  {album.title}
-                </p>
-                <p className="text-xs text-gray-600 truncate mt-1">
-                  {album.releasedBy}
-                </p>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {likedEntities &&
-        likedEntities.length === 0 &&
-        (!createdPlaylists || createdPlaylists.length === 0) &&
-        (!savedItems || savedItems.length === 0) && (
-          <div className="flex flex-col items-center justify-center py-16 text-gray-400">
-            <Music className="w-20 h-20 mb-4 opacity-20" />
-            <p className="text-lg font-medium">Nothing here yet</p>
-            <p className="text-sm mt-2">
-              Start exploring music to build your collection
-            </p>
-          </div>
-        )}
-    </div>
-  );
+	const navigate = useNavigate();
+	const [items, setItems] = useState(likedEntities);
+	const [savedItems, setSavedItems] = useState(savedPlaylists);
+
+	const likedSongs = items.filter((e) => e.type === "SONG");
+	const likedAlbums = items.filter((e) => e.type === "ALBUM");
+
+	const handleSavePlaylist = async (
+		e: React.MouseEvent,
+		playlistId: number,
+		playlistName: string,
+	) => {
+		e.stopPropagation();
+
+		try {
+			const response = await axiosInstance.post(`/playlist/${playlistId}/save`);
+			const data = response.data;
+
+			setSavedItems((prevItems) =>
+				data.isSaved
+					? [...prevItems, prevItems.find((p) => p.id === playlistId)!]
+					: prevItems.filter((p) => p.id !== playlistId),
+			);
+
+			toast.success(
+				data.isSaved
+					? `Saved "${playlistName}" to your library`
+					: `Removed "${playlistName}" from your library`,
+			);
+		} catch (err: any) {
+			toast.error(err.response?.data?.error || "Failed to save the playlist");
+		}
+	};
+
+	const handleLike = async (id: number, title: string) => {
+		try {
+			const response = await axiosInstance.post(`/musical-entity/${id}/like`);
+			const data = response.data;
+
+			setItems((prevItems) =>
+				prevItems.map((item) =>
+					item.id === data.entityId
+						? { ...item, isLikedByCurrentUser: data.isLiked }
+						: item,
+				),
+			);
+
+			toast.success(
+				data.isLiked ? `Liked "${title}"` : `Removed "${title}" from likes`,
+			);
+		} catch (err: any) {
+			toast.error(err.response?.data?.error || "Failed to like the item");
+		}
+	};
+
+	return (
+		<div className="mt-8 space-y-12">
+			{createdPlaylists && createdPlaylists.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<ListMusic className="w-6 h-6 text-[#1db954]" />
+						<h3 className="text-2xl font-bold text-white">Created Playlists</h3>
+						<span className="text-sm text-gray-500">
+							({createdPlaylists.length})
+						</span>
+					</div>
+
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{createdPlaylists.map((playlist) => (
+							<div
+								key={playlist.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg overflow-hidden bg-[#181818] mb-3 shadow-md group-hover:shadow-xl transition-all">
+									<img
+										src={playlist.cover || "/favicon.png"}
+										alt={playlist.name}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
+
+									<button
+										onClick={(e) =>
+											handleSavePlaylist(e, playlist.id, playlist.name)
+										}
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
+										title={playlist.isSavedByCurrentUser ? "Unsave" : "Save"}
+									>
+										<Bookmark
+											className={`w-5 h-5 ${
+												playlist.isSavedByCurrentUser
+													? "fill-[#1db954] text-[#1db954]"
+													: "text-gray-400"
+											}`}
+										/>
+									</button>
+								</div>
+								<p className="text-sm font-semibold text-white truncate group-hover:text-[#1db954] transition-colors">
+									{playlist.name}
+								</p>
+								<p className="text-xs text-gray-400 truncate">
+									{playlist.creatorName}
+								</p>
+							</div>
+						))}
+					</div>
+				</section>
+			)}
+
+			{savedItems && savedItems.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<Bookmark className="w-6 h-6 text-[#1db954] fill-[#1db954]" />
+						<h3 className="text-2xl font-bold text-white">Saved Playlists</h3>
+						<span className="text-sm text-gray-500">({savedItems.length})</span>
+					</div>
+
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{savedItems.map((playlist) => (
+							<div
+								key={playlist.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg overflow-hidden bg-[#181818] mb-3 shadow-md group-hover:shadow-xl transition-all">
+									<img
+										src={playlist.cover || "/favicon.png"}
+										alt={playlist.name}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
+
+									<button
+										onClick={(e) =>
+											handleSavePlaylist(e, playlist.id, playlist.name)
+										}
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
+										title="Unsave"
+									>
+										<Bookmark className="w-5 h-5 fill-[#1db954] text-[#1db954]" />
+									</button>
+								</div>
+								<p className="text-sm font-semibold text-white truncate group-hover:text-[#1db954] transition-colors">
+									{playlist.name}
+								</p>
+								<p className="text-xs text-gray-400 truncate">
+									{playlist.creatorName}
+								</p>
+							</div>
+						))}
+					</div>
+				</section>
+			)}
+
+			{likedSongs && likedSongs.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<Heart className="w-6 h-6 text-red-500 fill-red-500" />
+						<h3 className="text-2xl font-bold text-white">Liked Songs</h3>
+						<span className="text-sm text-gray-500">
+							({likedSongs?.length})
+						</span>
+					</div>
+
+					<div className="space-y-1">
+						{likedSongs.map((song, index) => (
+							<SongItem
+								key={song.id}
+								song={{
+									id: song.id,
+									title: song.title,
+									cover: song.cover,
+									genre: song.genre,
+									link: (song as any).link,
+									releasedBy: song.releasedBy,
+									isLikedByCurrentUser: song.isLikedByCurrentUser,
+								}}
+								index={index + 1}
+								onLikeToggle={() => handleLike(song.id, song.title)}
+							/>
+						))}
+					</div>
+				</section>
+			)}
+
+			{likedAlbums && likedAlbums.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<Album className="w-6 h-6 text-[#1db954]" />
+						<h3 className="text-2xl font-bold text-white">Liked Albums</h3>
+						<span className="text-sm text-gray-500">
+							({likedAlbums.length})
+						</span>
+					</div>
+
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{likedAlbums.map((album) => (
+							<div
+								key={album.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/album/${album.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg overflow-hidden bg-[#181818] mb-3 shadow-md group-hover:shadow-xl transition-all">
+									<img
+										src={album.cover || "/favicon.png"}
+										alt={album.title}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
+
+									<button
+										onClick={(e) => {
+											e.stopPropagation();
+											handleLike(album.id, album.title);
+										}}
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
+										title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
+									>
+										<svg
+											className="w-5 h-5"
+											fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
+											stroke={
+												album.isLikedByCurrentUser ? "#ef4444" : "#9ca3af"
+											}
+											strokeWidth="2"
+											viewBox="0 0 24 24"
+										>
+											<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+										</svg>
+									</button>
+								</div>
+								<p className="font-semibold text-sm text-white truncate group-hover:text-[#1db954] transition-colors">
+									{album.title}
+								</p>
+								<p className="text-xs text-gray-400 truncate mt-1">
+									{album.releasedBy}
+								</p>
+							</div>
+						))}
+					</div>
+				</section>
+			)}
+
+			{likedEntities &&
+				likedEntities.length === 0 &&
+				(!createdPlaylists || createdPlaylists.length === 0) &&
+				(!savedItems || savedItems.length === 0) && (
+					<div className="flex flex-col items-center justify-center py-16 text-gray-500">
+						<Music className="w-20 h-20 mb-4 opacity-20" />
+						<p className="text-lg font-medium">Nothing here yet</p>
+						<p className="text-sm mt-2">
+							Start exploring music to build your collection
+						</p>
+					</div>
+				)}
+		</div>
+	);
 };
 
Index: frontend/src/components/userProfile/UserListModal.tsx
===================================================================
--- frontend/src/components/userProfile/UserListModal.tsx	(revision a5406e15fca40fca7cc5f6ddb05de390f713d71b)
+++ frontend/src/components/userProfile/UserListModal.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,3 +1,4 @@
 import { useNavigate } from "react-router-dom";
+import { baseURL } from "../../api/axiosInstance";
 import type { BaseNonAdminUser } from "../../utils/types";
 
@@ -16,14 +17,13 @@
 }: ModalProps) => {
 	const navigate = useNavigate();
-	const baseURL = import.meta.env.VITE_API_BASE_URL;
 
 	return (
-		<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm">
-			<div className="bg-white rounded-xl shadow-2xl w-full max-w-md max-h-[70vh] flex flex-col">
-				<div className="p-4 border-b flex justify-between items-center">
-					<h2 className="text-xl font-bold">{title}</h2>
+		<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm">
+			<div className="bg-[#1a1a2e] border border-white/10 rounded-xl shadow-2xl w-full max-w-md max-h-[70vh] flex flex-col">
+				<div className="p-4 border-b border-white/10 flex justify-between items-center">
+					<h2 className="text-xl font-bold text-white">{title}</h2>
 					<button
 						onClick={onClose}
-						className="text-gray-500 hover:text-black text-2xl cursor-pointer"
+						className="text-gray-400 hover:text-white text-2xl cursor-pointer transition-colors"
 					>
 						&times;
@@ -38,5 +38,5 @@
 							<div
 								key={u.username}
-								className="flex items-center justify-between p-3 hover:bg-gray-50 rounded-lg transition-colors"
+								className="flex items-center justify-between p-3 hover:bg-white/5 rounded-lg transition-colors"
 							>
 								<div
@@ -47,5 +47,5 @@
 									}}
 								>
-									<div className="w-10 h-10 rounded-full bg-blue-100 overflow-hidden shrink-0 flex items-center justify-center">
+									<div className="w-10 h-10 rounded-full bg-[#282828] overflow-hidden shrink-0 flex items-center justify-center">
 										{u.profilePhoto ? (
 											<img
@@ -55,21 +55,24 @@
 											/>
 										) : (
-											<span className="text-blue-600 font-bold">
+											<span className="text-[#1db954] font-bold">
 												{u.fullName.charAt(0)}
 											</span>
 										)}
 									</div>
-									<p className="font-semibold text-gray-900">{u.fullName}</p>
+									<div>
+										<p className="font-semibold text-white">{u.fullName}</p>
+										<p className="text-sm text-gray-400">@{u.username}</p>
+									</div>
 								</div>
 
 								<button
 									onClick={() => onFollowToggle(u.username)}
-									className={`px-4 py-1 text-sm font-medium rounded-md transition-colors cursor-pointer ${
+									className={`px-4 py-1.5 text-sm font-medium rounded-full transition-colors cursor-pointer ${
 										u.isFollowedByCurrentUser
-											? "bg-gray-200 text-gray-700 hover:bg-gray-300"
-											: "bg-blue-500 text-white hover:bg-blue-600"
+											? "bg-white/10 text-white hover:bg-white/20"
+											: "bg-[#1db954] text-black hover:bg-[#1ed760]"
 									}`}
 								>
-									{u.isFollowedByCurrentUser ? "Unfollow" : "Follow"}
+									{u.isFollowedByCurrentUser ? "Following" : "Follow"}
 								</button>
 							</div>
