From c6e6d6a5960e553717f61c925dbccc9843417bf2 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 22 Dec 2025 22:53:59 +0000
Subject: [PATCH 1/6] Add light theme and fix hardcoded styles
- Add light theme CSS variables in styles.css
- Add 'Light' option to settings in index.html
- Update theme manager defaults in js/storage.js
- Replace hardcoded colors with CSS variables for logo and player bar
- Add support for explicit badge text color customization
---
index.html | 6 ++++--
js/storage.js | 24 ++++++++++++++++++++----
styles.css | 27 ++++++++++++++++++++++++---
3 files changed, 48 insertions(+), 9 deletions(-)
diff --git a/index.html b/index.html
index 8b82374..fc7c704 100644
--- a/index.html
+++ b/index.html
@@ -47,7 +47,7 @@
-
Black
+
System
+
Light
Dark
+
Black
Ocean
Purple
Forest
diff --git a/js/storage.js b/js/storage.js
index 20ef4d2..58660e4 100644
--- a/js/storage.js
+++ b/js/storage.js
@@ -229,8 +229,9 @@ export const themeManager = {
CUSTOM_THEME_KEY: 'monochrome-custom-theme',
defaultThemes: {
- monochrome: {},
+ light: {},
dark: {},
+ monochrome: {},
ocean: {},
purple: {},
forest: {}
@@ -238,15 +239,21 @@ export const themeManager = {
getTheme() {
try {
- return localStorage.getItem(this.STORAGE_KEY) || 'monochrome';
+ return localStorage.getItem(this.STORAGE_KEY) || 'system';
} catch (e) {
- return 'monochrome';
+ return 'system';
}
},
setTheme(theme) {
localStorage.setItem(this.STORAGE_KEY, theme);
- document.documentElement.setAttribute('data-theme', theme);
+
+ if (theme === 'system') {
+ const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
+ document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');
+ } else {
+ document.documentElement.setAttribute('data-theme', theme);
+ }
},
getCustomTheme() {
@@ -318,3 +325,12 @@ export const lyricsSettings = {
localStorage.setItem(this.DOWNLOAD_WITH_TRACKS, enabled ? 'true' : 'false');
}
};
+
+// System theme listener
+if (typeof window !== 'undefined' && window.matchMedia) {
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
+ if (themeManager.getTheme() === 'system') {
+ document.documentElement.setAttribute('data-theme', e.matches ? 'dark' : 'light');
+ }
+ });
+}
diff --git a/styles.css b/styles.css
index 830bbdd..06391e7 100644
--- a/styles.css
+++ b/styles.css
@@ -114,6 +114,27 @@
--explicit-badge: #f59e0b;
}
+:root[data-theme="light"] {
+ --background: #ffffff;
+ --foreground: #000000;
+ --card: #f4f4f5;
+ --card-foreground: #000000;
+ --primary: #2563eb;
+ --primary-foreground: #ffffff;
+ --secondary: #e4e4e7;
+ --secondary-foreground: #000000;
+ --muted: #e4e4e7;
+ --muted-foreground: #71717a;
+ --border: #e4e4e7;
+ --input: #e4e4e7;
+ --ring: #2563eb;
+ --highlight: #2563eb;
+ --highlight-rgb: 37, 99, 235;
+ --active-highlight: var(--highlight);
+ --explicit-badge: #000000;
+ --explicit-badge-foreground: #ffffff;
+}
+
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
@@ -178,7 +199,6 @@ kbd {
flex-direction: column;
gap: 2rem;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
- z-index: 2000;
}
.main-content {
@@ -190,7 +210,7 @@ kbd {
.now-playing-bar {
grid-area: player;
- background-color: #050505;
+ background-color: var(--card);
border-top: 1px solid var(--border);
padding: var(--spacing-md) var(--spacing-lg);
display: grid;
@@ -491,7 +511,7 @@ kbd {
align-items: center;
justify-content: center;
background-color: var(--explicit-badge);
- color: #000;
+ color: var(--explicit-badge-foreground, #000);
font-size: 0.65rem;
font-weight: 700;
padding: 0.15rem 0.35rem;
@@ -1850,6 +1870,7 @@ input:checked + .slider::before {
height: 100%;
transform: translateX(-100%);
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
+ z-index: 2000;
}
.sidebar.is-open {
From 0aee58b823c38e49e0e92c67870eb7df33c024be Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 22 Dec 2025 23:28:09 +0000
Subject: [PATCH 2/6] Fix album track sorting and formatting for multi-disc
albums
- Updated `renderAlbumPage` in `js/ui.js` to sort tracks by disc/volume number before track number.
- Updated `renderListWithTracks` to detect multi-disc albums.
- Updated `createTrackItemHTML` to display track numbers as `Disc-Track` (e.g., "1-1") for multi-disc albums when cover art is hidden (album view).
---
js/ui.js | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/js/ui.js b/js/ui.js
index 7b72122..293ee6a 100644
--- a/js/ui.js
+++ b/js/ui.js
@@ -23,10 +23,19 @@ export class UIRenderer {
`;
}
- createTrackItemHTML(track, index, showCover = false) {
+ createTrackItemHTML(track, index, showCover = false, hasMultipleDiscs = false) {
const playIconSmall = '
';
const trackImageHTML = showCover ? `
})
` : '';
- const trackNumberHTML = `
${showCover ? trackImageHTML : index + 1}
`;
+
+ let displayIndex;
+ if (hasMultipleDiscs && !showCover) {
+ const discNum = track.volumeNumber ?? track.discNumber ?? 1;
+ displayIndex = `${discNum}-${track.trackNumber}`;
+ } else {
+ displayIndex = index + 1;
+ }
+
+ const trackNumberHTML = `
${showCover ? trackImageHTML : displayIndex}
`;
const explicitBadge = hasExplicitContent(track) ? this.createExplicitBadge() : '';
const trackArtists = getTrackArtists(track);
const trackTitle = getTrackTitle(track);
@@ -117,8 +126,11 @@ export class UIRenderer {
const fragment = document.createDocumentFragment();
const tempDiv = document.createElement('div');
+ // Check if there are multiple discs in the tracks array
+ const hasMultipleDiscs = tracks.some(t => (t.volumeNumber || t.discNumber || 1) > 1);
+
tempDiv.innerHTML = tracks.map((track, i) =>
- this.createTrackItemHTML(track, i, showCover)
+ this.createTrackItemHTML(track, i, showCover, hasMultipleDiscs)
).join('');
while (tempDiv.firstChild) {
@@ -288,7 +300,12 @@ export class UIRenderer {
`;
- tracks.sort((a, b) => a.trackNumber - b.trackNumber);
+ tracks.sort((a, b) => {
+ const discA = a.volumeNumber ?? a.discNumber ?? 1;
+ const discB = b.volumeNumber ?? b.discNumber ?? 1;
+ if (discA !== discB) return discA - discB;
+ return a.trackNumber - b.trackNumber;
+ });
this.renderListWithTracks(tracklistContainer, tracks, false);
recentActivityManager.addAlbum(album);
From 43f04e74548fd2794080868479f6782c7492391b Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 22 Dec 2025 22:57:02 +0000
Subject: [PATCH 3/6] Fix "Invalid Date" display in album details
- Backfill album release date from tracks if missing in API response.
- Gracefully handle invalid or missing dates in UI rendering.
- Fix potential NaN in download folder naming due to invalid dates.
---
index.html | 2 +-
js/api.js | 14 ++++++++++++++
js/downloads.js | 10 ++++++++--
js/ui.js | 49 +++++++++++++++++++++++++++++++++++++++----------
4 files changed, 62 insertions(+), 13 deletions(-)
diff --git a/index.html b/index.html
index fc7c704..f755577 100644
--- a/index.html
+++ b/index.html
@@ -138,9 +138,9 @@