diff --git a/src/i18n/lang/en-US/settings.ts b/src/i18n/lang/en-US/settings.ts index 0e5ab57..3bfc93c 100644 --- a/src/i18n/lang/en-US/settings.ts +++ b/src/i18n/lang/en-US/settings.ts @@ -183,7 +183,12 @@ export default { dark: 'Dark' }, hideMiniPlayBar: 'Hide Mini Play Bar', - hideLyrics: 'Hide Lyrics' + hideLyrics: 'Hide Lyrics', + tabs: { + interface: 'Interface', + display: 'Display', + typography: 'Typography' + } }, shortcutSettings: { title: 'Shortcut Settings', diff --git a/src/i18n/lang/zh-CN/settings.ts b/src/i18n/lang/zh-CN/settings.ts index 334e198..80c3b9b 100644 --- a/src/i18n/lang/zh-CN/settings.ts +++ b/src/i18n/lang/zh-CN/settings.ts @@ -183,7 +183,12 @@ export default { dark: '暗色' }, hideMiniPlayBar: '隐藏迷你播放栏', - hideLyrics: '隐藏歌词' + hideLyrics: '隐藏歌词', + tabs: { + interface: '界面', + typography: '文字', + display: '显示' + } }, shortcutSettings: { title: '快捷键设置', diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index bcbdfed..118001c 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -17,6 +17,8 @@ declare module 'vue' { NCarouselItem: typeof import('naive-ui')['NCarouselItem'] NCheckbox: typeof import('naive-ui')['NCheckbox'] NCheckboxGroup: typeof import('naive-ui')['NCheckboxGroup'] + NCollapse: typeof import('naive-ui')['NCollapse'] + NCollapseItem: typeof import('naive-ui')['NCollapseItem'] NConfigProvider: typeof import('naive-ui')['NConfigProvider'] NDialogProvider: typeof import('naive-ui')['NDialogProvider'] NDrawer: typeof import('naive-ui')['NDrawer'] diff --git a/src/renderer/components/lyric/LyricSettings.vue b/src/renderer/components/lyric/LyricSettings.vue index f3c1991..2e1ff77 100644 --- a/src/renderer/components/lyric/LyricSettings.vue +++ b/src/renderer/components/lyric/LyricSettings.vue @@ -2,94 +2,119 @@
{{ t('settings.lyricSettings.title') }}
-
- {{ t('settings.lyricSettings.pureMode') }} - -
+ + + +
+
+
+ {{ t('settings.lyricSettings.pureMode') }} + +
+
+ {{ t('settings.lyricSettings.hideCover') }} + +
+
+ {{ t('settings.lyricSettings.centerDisplay') }} + +
+
+ {{ t('settings.lyricSettings.showTranslation') }} + +
+
+ {{ t('settings.lyricSettings.hideLyrics') }} + +
+
+
+
-
- {{ t('settings.lyricSettings.hideCover') }} - -
+ + +
+
+
+ {{ t('settings.lyricSettings.hidePlayBar') }} + +
+
+ {{ t('settings.lyricSettings.hideMiniPlayBar') }} + +
+
+
+
{{ t('settings.lyricSettings.backgroundTheme') }}
+ + + {{ + t('settings.lyricSettings.themeOptions.default') + }} + {{ + t('settings.lyricSettings.themeOptions.light') + }} + {{ + t('settings.lyricSettings.themeOptions.dark') + }} + + +
+
+
-
- {{ t('settings.lyricSettings.centerDisplay') }} - -
+ + +
+
+
+ {{ t('settings.lyricSettings.fontSize') }} + +
-
- {{ t('settings.lyricSettings.showTranslation') }} - -
+
+ {{ t('settings.lyricSettings.letterSpacing') }} + +
-
- {{ t('settings.lyricSettings.hidePlayBar') }} - -
- -
- {{ t('settings.lyricSettings.hideMiniPlayBar') }} - -
- -
- {{ t('settings.lyricSettings.hideLyrics') }} - -
- -
- {{ t('settings.lyricSettings.fontSize') }} - -
- -
- {{ t('settings.lyricSettings.letterSpacing') }} - -
- -
- {{ t('settings.lyricSettings.lineHeight') }} - -
- -
- {{ t('settings.lyricSettings.backgroundTheme') }} - - {{ t('settings.lyricSettings.themeOptions.default') }} - {{ t('settings.lyricSettings.themeOptions.light') }} - {{ t('settings.lyricSettings.themeOptions.dark') }} - -
+
+ {{ t('settings.lyricSettings.lineHeight') }} + +
+
+
+
+
@@ -98,39 +123,12 @@ import { onMounted, ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; +import { DEFAULT_LYRIC_CONFIG, LyricConfig } from '@/types/lyric'; + const { t } = useI18n(); - -interface LyricConfig { - hideCover: boolean; - centerLyrics: boolean; - fontSize: number; - letterSpacing: number; - lineHeight: number; - showTranslation: boolean; - theme: 'default' | 'light' | 'dark'; - hidePlayBar: boolean; - hideMiniPlayBar: boolean; - pureModeEnabled: boolean; - hideLyrics: boolean; -} - -const config = ref({ - hideCover: false, - centerLyrics: false, - fontSize: 22, - letterSpacing: 0, - lineHeight: 2, - showTranslation: true, - theme: 'default', - hidePlayBar: false, - hideMiniPlayBar: false, - pureModeEnabled: false, - hideLyrics: false -}); - +const config = ref({ ...DEFAULT_LYRIC_CONFIG }); const emit = defineEmits(['themeChange']); -// 监听配置变化并保存到本地存储 watch( () => config.value, (newConfig) => { @@ -139,7 +137,6 @@ watch( { deep: true } ); -// 监听主题变化 watch( () => config.value.theme, (newTheme) => { @@ -147,14 +144,12 @@ watch( } ); -// 更新 CSS 变量 const updateCSSVariables = (config: LyricConfig) => { document.documentElement.style.setProperty('--lyric-font-size', `${config.fontSize}px`); document.documentElement.style.setProperty('--lyric-letter-spacing', `${config.letterSpacing}px`); document.documentElement.style.setProperty('--lyric-line-height', config.lineHeight.toString()); }; -// 加载保存的配置 onMounted(() => { const savedConfig = localStorage.getItem('music-full-config'); if (savedConfig) { @@ -170,14 +165,50 @@ defineExpose({ diff --git a/src/renderer/components/player/MiniPlayBar.vue b/src/renderer/components/player/MiniPlayBar.vue index 73a0c61..518fd30 100644 --- a/src/renderer/components/player/MiniPlayBar.vue +++ b/src/renderer/components/player/MiniPlayBar.vue @@ -585,4 +585,16 @@ const setMusicFull = () => { .playlist-items { padding: 4px 0; } + +.dark { + .song-info { + .song-title { + color: var(--text-color-1, #fff); + } + + .song-artist { + color: var(--text-color-2, #fff); + } + } +} diff --git a/src/renderer/layout/components/MusicFull.vue b/src/renderer/layout/components/MusicFull.vue index 92f20c0..8672ad2 100644 --- a/src/renderer/layout/components/MusicFull.vue +++ b/src/renderer/layout/components/MusicFull.vue @@ -29,6 +29,7 @@
@@ -159,6 +160,7 @@ import { import { useArtist } from '@/hooks/useArtist'; import { usePlayerStore } from '@/store/modules/player'; import { useSettingsStore } from '@/store/modules/settings'; +import { DEFAULT_LYRIC_CONFIG, LyricConfig } from '@/types/lyric'; import { getImgUrl, isMobile } from '@/utils'; import { animateGradient, getHoverBackgroundColor, getTextColors } from '@/utils/linearColor'; @@ -173,34 +175,8 @@ const isDark = ref(false); const showStickyHeader = ref(false); const lyricSettingsRef = ref>(); -interface LyricConfig { - hideCover: boolean; - centerLyrics: boolean; - fontSize: number; - letterSpacing: number; - lineHeight: number; - showTranslation: boolean; - theme: 'default' | 'light' | 'dark'; - hidePlayBar: boolean; - pureModeEnabled: boolean; - hideMiniPlayBar: boolean; - hideLyrics: boolean; -} - // 移除 computed 配置 -const config = ref({ - hideCover: false, - centerLyrics: false, - fontSize: 22, - letterSpacing: 0, - lineHeight: 1.5, - showTranslation: true, - theme: 'default', - hidePlayBar: false, - pureModeEnabled: false, - hideMiniPlayBar: false, - hideLyrics: false -}); +const config = ref({ ...DEFAULT_LYRIC_CONFIG }); // 监听设置组件的配置变化 watch( @@ -617,7 +593,7 @@ defineExpose({ transition: all 0.3s ease; &.center { - @apply w-full; + @apply w-auto; .music-lrc { @apply w-full max-w-3xl mx-auto; } diff --git a/src/renderer/types/lyric.ts b/src/renderer/types/lyric.ts new file mode 100644 index 0000000..4cbf670 --- /dev/null +++ b/src/renderer/types/lyric.ts @@ -0,0 +1,27 @@ +export interface LyricConfig { + hideCover: boolean; + centerLyrics: boolean; + fontSize: number; + letterSpacing: number; + lineHeight: number; + showTranslation: boolean; + theme: 'default' | 'light' | 'dark'; + hidePlayBar: boolean; + pureModeEnabled: boolean; + hideMiniPlayBar: boolean; + hideLyrics: boolean; +} + +export const DEFAULT_LYRIC_CONFIG: LyricConfig = { + hideCover: false, + centerLyrics: false, + fontSize: 22, + letterSpacing: 0, + lineHeight: 2, + showTranslation: true, + theme: 'default', + hidePlayBar: false, + hideMiniPlayBar: true, + pureModeEnabled: false, + hideLyrics: false +};