+ {/* Reuse components but pass the specific snapshot data */}
+
+
+
+
+ {/* Playlist Compositions if available */}
+ {selectedSnapshot.playlist_composition && (
+
+
+
+ Archived Playlists
+
+
+ {/* We need to parse playlist composition if it's stored as JSON string */}
+ {(() => {
+ const playlists = safeParse(selectedSnapshot.playlist_composition);
+ if (!playlists) return No playlist data archived.;
+
+ return (
+
+ {playlists.six_hour && (
+ Short & Sweet (6h)}>
+
+
+ );
+};
+
+export default Navbar;
diff --git a/frontend/src/components/PlaylistsSection.jsx b/frontend/src/components/PlaylistsSection.jsx
index 60f94ac..0f078cb 100644
--- a/frontend/src/components/PlaylistsSection.jsx
+++ b/frontend/src/components/PlaylistsSection.jsx
@@ -9,6 +9,7 @@ import {
CustomerServiceOutlined
} from '@ant-design/icons';
import Tooltip from './Tooltip';
+import TrackList from './TrackList';
const { Title, Text, Paragraph } = Typography;
@@ -86,6 +87,8 @@ const PlaylistsSection = () => {
"{playlists?.six_hour?.reasoning || 'Analyzing your recent listening patterns to find the perfect vibe.'}"
+
+
@@ -132,6 +135,8 @@ const PlaylistsSection = () => {
A blend of 30 all-time favorites and 20 recent discoveries to keep your rotation fresh but familiar.
+
+
diff --git a/frontend/src/components/TrackList.jsx b/frontend/src/components/TrackList.jsx
new file mode 100644
index 0000000..a535f91
--- /dev/null
+++ b/frontend/src/components/TrackList.jsx
@@ -0,0 +1,61 @@
+import React from 'react';
+import { Button, Typography, Tooltip as AntTooltip, Avatar } from 'antd';
+import {
+ PlayCircleOutlined,
+ HistoryOutlined,
+ CustomerServiceOutlined,
+ RobotOutlined
+} from '@ant-design/icons';
+
+const { Text } = Typography;
+
+const TrackList = ({ tracks, maxHeight = "max-h-60" }) => {
+ if (!tracks || tracks.length === 0) return