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
This commit is contained in:
parent
58efbf04c6
commit
c6e6d6a596
3 changed files with 48 additions and 9 deletions
|
|
@ -47,7 +47,7 @@
|
||||||
<div>
|
<div>
|
||||||
<div class="sidebar-logo">
|
<div class="sidebar-logo">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="14.75 14.75 70.5 70.5" >
|
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="14.75 14.75 70.5 70.5" >
|
||||||
<g fill="white" >
|
<g fill="currentColor" >
|
||||||
<path d="M38.25 14.75H85.25V61.75H61.75V38.25H38.25ZM14.75 38.25H38.25V61.75H61.75V85.25H14.75Z" />
|
<path d="M38.25 14.75H85.25V61.75H61.75V38.25H38.25ZM14.75 38.25H38.25V61.75H61.75V85.25H14.75Z" />
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -236,8 +236,10 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theme-picker" id="theme-picker">
|
<div class="theme-picker" id="theme-picker">
|
||||||
<div class="theme-option" data-theme="monochrome">Black</div>
|
<div class="theme-option" data-theme="system">System</div>
|
||||||
|
<div class="theme-option" data-theme="light">Light</div>
|
||||||
<div class="theme-option" data-theme="dark">Dark</div>
|
<div class="theme-option" data-theme="dark">Dark</div>
|
||||||
|
<div class="theme-option" data-theme="monochrome">Black</div>
|
||||||
<div class="theme-option" data-theme="ocean">Ocean</div>
|
<div class="theme-option" data-theme="ocean">Ocean</div>
|
||||||
<div class="theme-option" data-theme="purple">Purple</div>
|
<div class="theme-option" data-theme="purple">Purple</div>
|
||||||
<div class="theme-option" data-theme="forest">Forest</div>
|
<div class="theme-option" data-theme="forest">Forest</div>
|
||||||
|
|
|
||||||
|
|
@ -229,8 +229,9 @@ export const themeManager = {
|
||||||
CUSTOM_THEME_KEY: 'monochrome-custom-theme',
|
CUSTOM_THEME_KEY: 'monochrome-custom-theme',
|
||||||
|
|
||||||
defaultThemes: {
|
defaultThemes: {
|
||||||
monochrome: {},
|
light: {},
|
||||||
dark: {},
|
dark: {},
|
||||||
|
monochrome: {},
|
||||||
ocean: {},
|
ocean: {},
|
||||||
purple: {},
|
purple: {},
|
||||||
forest: {}
|
forest: {}
|
||||||
|
|
@ -238,15 +239,21 @@ export const themeManager = {
|
||||||
|
|
||||||
getTheme() {
|
getTheme() {
|
||||||
try {
|
try {
|
||||||
return localStorage.getItem(this.STORAGE_KEY) || 'monochrome';
|
return localStorage.getItem(this.STORAGE_KEY) || 'system';
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return 'monochrome';
|
return 'system';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setTheme(theme) {
|
setTheme(theme) {
|
||||||
localStorage.setItem(this.STORAGE_KEY, 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() {
|
getCustomTheme() {
|
||||||
|
|
@ -318,3 +325,12 @@ export const lyricsSettings = {
|
||||||
localStorage.setItem(this.DOWNLOAD_WITH_TRACKS, enabled ? 'true' : 'false');
|
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');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
||||||
27
styles.css
27
styles.css
|
|
@ -114,6 +114,27 @@
|
||||||
--explicit-badge: #f59e0b;
|
--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 {
|
*, *::before, *::after {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|
@ -178,7 +199,6 @@ kbd {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 2rem;
|
gap: 2rem;
|
||||||
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
z-index: 2000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-content {
|
.main-content {
|
||||||
|
|
@ -190,7 +210,7 @@ kbd {
|
||||||
|
|
||||||
.now-playing-bar {
|
.now-playing-bar {
|
||||||
grid-area: player;
|
grid-area: player;
|
||||||
background-color: #050505;
|
background-color: var(--card);
|
||||||
border-top: 1px solid var(--border);
|
border-top: 1px solid var(--border);
|
||||||
padding: var(--spacing-md) var(--spacing-lg);
|
padding: var(--spacing-md) var(--spacing-lg);
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|
@ -491,7 +511,7 @@ kbd {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
background-color: var(--explicit-badge);
|
background-color: var(--explicit-badge);
|
||||||
color: #000;
|
color: var(--explicit-badge-foreground, #000);
|
||||||
font-size: 0.65rem;
|
font-size: 0.65rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
padding: 0.15rem 0.35rem;
|
padding: 0.15rem 0.35rem;
|
||||||
|
|
@ -1850,6 +1870,7 @@ input:checked + .slider::before {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
transform: translateX(-100%);
|
transform: translateX(-100%);
|
||||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
|
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
|
||||||
|
z-index: 2000;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar.is-open {
|
.sidebar.is-open {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue