diff --git a/src/Components/AlbumCard.tsx b/src/Components/AlbumCard.tsx
index 4c80ce3..3a9857d 100644
--- a/src/Components/AlbumCard.tsx
+++ b/src/Components/AlbumCard.tsx
@@ -23,60 +23,108 @@ export default function AlbumCard({ album }: { album: Album }) {
const theme = getThemeColors(album.id);
return (
-
-
-
-
-
-
-
-
+
- {label}
-
+
+
+
+
+
+
+ {label}
+
-
- Released:{" "}
- {new Date(releaseDate).toLocaleDateString("en-US", {
- year: "numeric",
- month: "long",
- day: "numeric",
- })}
-
+
+ Released:
+ {new Date(releaseDate).toLocaleDateString("en-US", {
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ })}
+
-
-
- {songs.count} Songs
-
- {songs.emilyLiveSongs > 0 && (
-
- {songs.emilyLiveSongs} Emily Live
+
+
+ {songs.count} Songs
- )}
- {songs.lpLiveSongs > 0 && (
-
- {songs.lpLiveSongs} LP Live
-
- )}
-
-
-
+ {songs.emilyLiveSongs > 0 && (
+
+ {songs.emilyLiveSongs} Emily Live
+
+ )}
+ {songs.lpLiveSongs > 0 && (
+
+ {songs.lpLiveSongs} LP Live
+
+ )}
+
+
+
+
);
}
diff --git a/src/Components/BackButton.tsx b/src/Components/BackButton.tsx
index 464d9d4..418f689 100644
--- a/src/Components/BackButton.tsx
+++ b/src/Components/BackButton.tsx
@@ -2,15 +2,31 @@
import { Button } from "@mantine/core";
import { Link } from "next-view-transitions";
+import type { AlbumTheme } from "@/lib/themes";
-export default function BackButton() {
+interface BackButtonProps {
+ theme?: AlbumTheme;
+}
+
+export default function BackButton({ theme }: BackButtonProps) {
return (
diff --git a/src/Components/TrackCard.tsx b/src/Components/TrackCard.tsx
new file mode 100644
index 0000000..bf6e5ea
--- /dev/null
+++ b/src/Components/TrackCard.tsx
@@ -0,0 +1,110 @@
+"use client";
+
+import { Card, Group, Text, Badge, Box } from "@mantine/core";
+import { useState } from "react";
+import type { AlbumTheme } from "@/lib/themes";
+import type { Track } from "@/lib/ListTypes";
+
+interface TrackCardProps {
+ track: Track;
+ index: number;
+ theme: AlbumTheme;
+}
+
+export default function TrackCard({ track, index, theme }: TrackCardProps) {
+ const [isHovered, setIsHovered] = useState(false);
+
+ return (
+ setIsHovered(true)}
+ onMouseLeave={() => setIsHovered(false)}
+ >
+
+
+
+ {index + 1}
+
+
+ {track.label}
+
+
+
+
+
+ {track.duration}
+
+
+ {track.studioUrl && (
+
+ Studio
+
+ )}
+ {track.emilyLiveUrl && (
+
+ Emily Live
+
+ )}
+ {track.lpLiveUrl && (
+
+ LP Live
+
+ )}
+
+
+
+
+ );
+}
diff --git a/src/app/album/[albumId]/page.tsx b/src/app/album/[albumId]/page.tsx
index f67fc61..6190517 100644
--- a/src/app/album/[albumId]/page.tsx
+++ b/src/app/album/[albumId]/page.tsx
@@ -1,8 +1,9 @@
import { notFound } from "next/navigation";
-import { Box, Container, Title, Text, Group, Badge, Card, Image, Stack, Grid, GridCol } from "@mantine/core";
+import { Box, Container, Title, Text, Image, Stack, Grid, GridCol } from "@mantine/core";
import { albums } from "../../../lib/list";
import BackButton from "../../../Components/BackButton";
import { getThemeColors } from "@/lib/themes";
+import TrackCard from "@/Components/TrackCard";
export function generateStaticParams() {
return albums.map((album) => ({
@@ -34,95 +35,96 @@ export default async function AlbumDetail({ params }: { params: Promise<{ albumI
notFound();
}
- // Theme colors based on album
-
const theme = getThemeColors(albumId);
return (
-
+
{/* Back Button */}
-
+
-
+
-
+
+
+
{album.label}
-
- Released:{" "}
+
+ Released:
{new Date(album.releaseDate).toLocaleDateString("en-US", {
year: "numeric",
month: "long",
day: "numeric",
})}
- {album.description}
+
+ {album.description}
+
{/* Track List */}
{album.tracks.length > 0 && (
-
+
Track List
-
+
{album.tracks.map((track, index) => (
-
-
-
-
- {index + 1}
-
-
- {track.label}
-
-
-
-
-
- {track.duration}
-
-
- {track.studioUrl && (
-
- Studio
-
- )}
- {track.emilyLiveUrl && (
-
- Emily Live
-
- )}
- {track.lpLiveUrl && (
-
- LP Live
-
- )}
-
-
-
-
+
))}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 91dcaf5..fd8c2e3 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,6 +1,6 @@
import "@mantine/core/styles.css";
import "../index.css";
-import { MantineProvider, ColorSchemeScript } from "@mantine/core";
+import { MantineProvider } from "@mantine/core";
import { ViewTransitions } from "next-view-transitions";
import { Nunito } from "next/font/google";
diff --git a/src/lib/list.ts b/src/lib/list.ts
index 26fc94a..a673e65 100644
--- a/src/lib/list.ts
+++ b/src/lib/list.ts
@@ -273,111 +273,135 @@ export const albums: Album[] = [
},
],
},
- // {
- // id: "minutes-to-midnight",
- // label: "Minutes to Midnight",
- // releaseDate: "2007-05-14",
- // image: "/minutes_to_midnight.jpg",
- // url: "/minutes-to-midnight",
- // description:
- // "Minutes to Midnight is the third studio album by American rock band Linkin Park, released on May 14, 2007, by Warner Bros. Records. The album marked a departure from the band's previous nu-metal sound, incorporating more alternative rock and experimental elements.",
- // tracks: [
- // {
- // id: "minutes-to-midnight-1",
- // label: "Wake",
- // duration: "01:40",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-2",
- // label: "Given Up",
- // duration: "03:09",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-3",
- // label: "Leave Out All the Rest",
- // duration: "03:29",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-4",
- // label: "Bleed It Out",
- // duration: "02:44",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-5",
- // label: "Shadow of the Day",
- // duration: "04:49",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-6",
- // label: "What I've Done",
- // duration: "03:25",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-7",
- // label: "Hands Held High",
- // duration: "03:53",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-8",
- // label: "No More Sorrow",
- // duration: "03:41",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-9",
- // label: "Valentine's Day",
- // duration: "03:16",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-10",
- // label: "In Between",
- // duration: "03:16",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-11",
- // label: "In Pieces",
- // duration: "03:38",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // {
- // id: "minutes-to-midnight-12",
- // label: "The Little Things Give You Away",
- // duration: "06:23",
- // studioUrl: null,
- // emilyLiveUrl: null,
- // lpLiveUrl: null,
- // },
- // ],
- // },
+ {
+ id: "minutes-to-midnight",
+ label: "Minutes to Midnight",
+ releaseDate: "2007-05-14",
+ image: "/minutes_to_midnight.jpg",
+ url: "/minutes-to-midnight",
+ description:
+ "Minutes to Midnight is the third studio album by American rock band Linkin Park, released on May 14, 2007, by Warner Bros. Records. The album marked a departure from the band's previous nu-metal sound, incorporating more alternative rock and experimental elements.",
+ tracks: [
+ {
+ id: "minutes-to-midnight-1",
+ label: "Wake",
+ duration: "01:40",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/0GkuKdv0osuL9QhfnXqVNP?si=0491e2d35b0a4e12",
+ },
+ {
+ id: "minutes-to-midnight-2",
+ label: "Given Up",
+ duration: "03:09",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/1fLlRApgzxWweF1JTf8yM5?si=9b22e697bdd640e8",
+ },
+ {
+ id: "minutes-to-midnight-3",
+ label: "Leave Out All the Rest",
+ duration: "03:29",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/0sp00HSXkQyqTa6QqM0O8V?si=c9ad349e7f164919",
+ },
+ {
+ id: "minutes-to-midnight-4",
+ label: "Bleed It Out",
+ duration: "02:44",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/0UFDKFqW2oGspYeYqo9wjA?si=2f4e310a85674523",
+ },
+ {
+ id: "minutes-to-midnight-5",
+ label: "Shadow of the Day",
+ duration: "04:49",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/0OYcEfskah1egYHjYRvbg1?si=e7fe66722b7544d9",
+ },
+ {
+ id: "minutes-to-midnight-6",
+ label: "What I've Done",
+ duration: "03:25",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/18lR4BzEs7e3qzc0KVkTpU?si=f04a6e933aab4ba0",
+ },
+ {
+ id: "minutes-to-midnight-7",
+ label: "Hands Held High",
+ duration: "03:53",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/0m7mTaFGMiKI3rBJpYknip?si=e382b6252c7c427a",
+ },
+ {
+ id: "minutes-to-midnight-8",
+ label: "No More Sorrow",
+ duration: "03:41",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/4CWhc9FaMMfBTt4ANjfbOf?si=dd3a00c6453c4737",
+ },
+ {
+ id: "minutes-to-midnight-9",
+ label: "Valentine's Day",
+ duration: "03:16",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/2vfshZvISOKy2Je7wQBWOV?si=51d75042da314fa4",
+ },
+ {
+ id: "minutes-to-midnight-10",
+ label: "In Between",
+ duration: "03:16",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/2ysXuQd8uOfSMZcMRR5Ux4?si=3ae5e92155874795",
+ },
+ {
+ id: "minutes-to-midnight-11",
+ label: "In Pieces",
+ duration: "03:38",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/7jeI6EdY0elPSNz80mAKS8?si=983410366a774f68",
+ },
+ {
+ id: "minutes-to-midnight-12",
+ label: "The Little Things Give You Away",
+ duration: "06:23",
+ studioUrl: null,
+ emilyLiveUrl: null,
+ lpLiveUrl: null,
+
+ __SPOTIFY_URL__: "https://open.spotify.com/track/7jeI6EdY0elPSNz80mAKS8?si=679b76c359004769",
+ },
+ ],
+ },
];
diff --git a/src/lib/themes.ts b/src/lib/themes.ts
index 45c8bfc..81d0163 100644
--- a/src/lib/themes.ts
+++ b/src/lib/themes.ts
@@ -1,25 +1,205 @@
-export const getThemeColors = (albumId: string) => {
+export interface AlbumTheme {
+ // Primary color palette
+ primary: {
+ DEFAULT: string;
+ light: string;
+ dark: string;
+ 100: string;
+ 500: string;
+ 900: string;
+ };
+ // Secondary color palette
+ secondary: {
+ DEFAULT: string;
+ light: string;
+ dark: string;
+ };
+ // Accent colors
+ accent: {
+ DEFAULT: string;
+ light: string;
+ dark: string;
+ };
+ // Background variations
+ background: {
+ primary: string;
+ secondary: string;
+ tertiary: string;
+ gradient: string;
+ };
+ // Text colors
+ text: {
+ primary: string;
+ secondary: string;
+ muted: string;
+ contrast: string;
+ };
+ // Border colors
+ border: {
+ DEFAULT: string;
+ light: string;
+ focus: string;
+ };
+ // Badge colors
+ badges: {
+ studio: string;
+ liveEmily: string;
+ liveLP: string;
+ };
+ // Card styling
+ card: {
+ background: string;
+ backgroundHover: string;
+ border: string;
+ };
+}
+
+const themes: Record = {
+ "hybrid-theory": {
+ primary: {
+ DEFAULT: "#47090E",
+ light: "#95121d",
+ dark: "#1F0506",
+ 100: "#f6b3b8",
+ 500: "#47090E",
+ 900: "#0f0203",
+ },
+ secondary: {
+ DEFAULT: "#8C786C",
+ light: "#bbaea7",
+ dark: "#554841",
+ },
+ accent: {
+ DEFAULT: "#ec6672",
+ light: "#f6b3b8",
+ dark: "#95121d",
+ },
+ background: {
+ primary: "#050404",
+ secondary: "#1F0506",
+ tertiary: "#3D3D39",
+ gradient: "linear-gradient(135deg, #050404 0%, #47090E 50%, #1F0506 100%)",
+ },
+ text: {
+ primary: "#e8e4e2",
+ secondary: "#d2c9c4",
+ muted: "#a49389",
+ contrast: "#ffffff",
+ },
+ border: {
+ DEFAULT: "#3D3D39",
+ light: "#8C786C",
+ focus: "#47090E",
+ },
+ badges: {
+ studio: "#95121d",
+ liveEmily: "#ec6672",
+ liveLP: "#8C786C",
+ },
+ card: {
+ background: "rgba(61, 61, 57, 0.3)",
+ backgroundHover: "rgba(71, 9, 14, 0.4)",
+ border: "#3D3D39",
+ },
+ },
+ meteora: {
+ primary: {
+ DEFAULT: "#8B7B65",
+ light: "#9A8B71",
+ dark: "#55493C",
+ 100: "#ebe8e2",
+ 500: "#8B7B65",
+ 900: "#1c1914",
+ },
+ secondary: {
+ DEFAULT: "#9A8B71",
+ light: "#c2b9a9",
+ dark: "#7c6f58",
+ },
+ accent: {
+ DEFAULT: "#bbb0a1",
+ light: "#d6d0c6",
+ dark: "#a4917e",
+ },
+ background: {
+ primary: "#241C16",
+ secondary: "#32271F",
+ tertiary: "#55493C",
+ gradient: "linear-gradient(135deg, #241C16 0%, #32271F 50%, #55493C 100%)",
+ },
+ text: {
+ primary: "#e8e5e0",
+ secondary: "#d2cac0",
+ muted: "#a49682",
+ contrast: "#ffffff",
+ },
+ border: {
+ DEFAULT: "#55493C",
+ light: "#8B7B65",
+ focus: "#9A8B71",
+ },
+ badges: {
+ studio: "#8B7B65",
+ liveEmily: "#bbb0a1",
+ liveLP: "#9A8B71",
+ },
+ card: {
+ background: "rgba(85, 73, 60, 0.3)",
+ backgroundHover: "rgba(139, 123, 101, 0.4)",
+ border: "#55493C",
+ },
+ },
+ "minutes-to-midnight": {
+ primary: {
+ DEFAULT: "#77716F",
+ light: "#A09D9C",
+ dark: "#292527",
+ 100: "#fafafa",
+ 500: "#77716F",
+ 900: "#181716",
+ },
+ secondary: {
+ DEFAULT: "#A09D9C",
+ light: "#c6c4c4",
+ dark: "#615e5d",
+ },
+ accent: {
+ DEFAULT: "#928d8b",
+ light: "#b3b1b0",
+ dark: "#5f5a59",
+ },
+ background: {
+ primary: "#292527",
+ secondary: "#2f2d2d",
+ tertiary: "#474443",
+ gradient: "linear-gradient(135deg, #292527 0%, #474443 50%, #5f5a59 100%)",
+ },
+ text: {
+ primary: "#F2F1F0",
+ secondary: "#d9d8d7",
+ muted: "#b3b1b0",
+ contrast: "#FEFFFC",
+ },
+ border: {
+ DEFAULT: "#474443",
+ light: "#77716F",
+ focus: "#A09D9C",
+ },
+ badges: {
+ studio: "#77716F",
+ liveEmily: "#928d8b",
+ liveLP: "#A09D9C",
+ },
+ card: {
+ background: "rgba(71, 68, 67, 0.3)",
+ backgroundHover: "rgba(119, 113, 111, 0.4)",
+ border: "#474443",
+ },
+ },
+};
+
+export const getThemeColors = (albumId: string): AlbumTheme => {
return themes[albumId] || themes["hybrid-theory"];
};
-const themes: Record = {
- "hybrid-theory": {
- primary: "#ff6b35",
- secondary: "#f7931e",
- accent: "#ff1744",
- bg: "from-orange-900 via-red-900 to-orange-800",
- },
- meteora: {
- primary: "#8b5cf6",
- secondary: "#a855f7",
- accent: "#ec4899",
- bg: "from-purple-900 via-pink-900 to-purple-800",
- },
- "minutes-to-midnight": {
- primary: "#1e40af",
- secondary: "#3b82f6",
- accent: "#06b6d4",
- bg: "from-slate-900 via-blue-900 to-slate-800",
- },
-};
-export type Theme = (typeof themes)["hybrid-theory"];
+export type Theme = AlbumTheme;