From 590755169fb08c6bc9bc82678af167400ca9a113 Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Thu, 23 Jul 2026 14:06:46 +0800 Subject: [PATCH] feat(theme): refine glass and transparency settings (#578) --- src/App.vue | 2 +- src/components/dialog/GlassSettingsDialog.vue | 71 ++++-------- .../dialog/TransparencySettingsDialog.vue | 31 +++-- .../__tests__/GlassSettingsDialog.spec.ts | 41 ++++++- .../TransparencySettingsDialog.spec.ts | 87 ++++++++++++++ .../__tests__/useTransparencySettings.spec.ts | 98 ++++++++++++++++ src/composables/useTransparencySettings.ts | 106 ++++++++++++++++-- src/styles/themes/glass.scss | 4 - 8 files changed, 368 insertions(+), 72 deletions(-) create mode 100644 src/components/dialog/__tests__/TransparencySettingsDialog.spec.ts create mode 100644 src/composables/__tests__/useTransparencySettings.spec.ts diff --git a/src/App.vue b/src/App.vue index 3506e848..8b8c558d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -28,7 +28,7 @@ import { useGlobalOfflineStatus, type ConnectionFailureReason } from '@/composab const LOGIN_WALLPAPER_ROUTE = '/login' const BACKGROUND_CROSSFADE_DURATION_MS = 1500 -const WINDOW_BLUR_RENDER_THROTTLE_DELAY_MS = 180_000 +const WINDOW_BLUR_RENDER_THROTTLE_DELAY_MS = 60_000 const MEDIA_DENSE_OPTICAL_DEFER_MS = 1_600 // 生效主题 diff --git a/src/components/dialog/GlassSettingsDialog.vue b/src/components/dialog/GlassSettingsDialog.vue index 4f252f26..09ee8546 100644 --- a/src/components/dialog/GlassSettingsDialog.vue +++ b/src/components/dialog/GlassSettingsDialog.vue @@ -88,6 +88,16 @@ function updateQuality(value: unknown) { previewGlassSettings({ glassQuality: option.value }) } +/** 将当前草稿恢复为玻璃主题默认值并立即预览。 */ +function resetSettings() { + draftAppearance.value = 'clear' + draftQuality.value = 'css' + previewGlassSettings({ + glassAppearance: draftAppearance.value, + glassQuality: draftQuality.value, + }) +} + /** 一次提交当前预览,持久化后关闭不会发生视觉回跳。 */ async function saveSettings() { if (isSaving.value) return @@ -111,19 +121,16 @@ onScopeDispose(cancelGlassPreview) diff --git a/src/components/dialog/TransparencySettingsDialog.vue b/src/components/dialog/TransparencySettingsDialog.vue index d1a9bcd9..61278a02 100644 --- a/src/components/dialog/TransparencySettingsDialog.vue +++ b/src/components/dialog/TransparencySettingsDialog.vue @@ -29,6 +29,7 @@ const emit = defineEmits<{ const visible = computed({ get: () => props.modelValue, set: value => { + if (!value) cancelTransparencySettings() emit('update:modelValue', value) if (!value) emit('close') }, @@ -38,6 +39,7 @@ const { adjustTransparency, backgroundBlur, backgroundPosterOpacity, + cancelTransparencySettings, currentPresetLevel, onBackgroundBlurChange, onBackgroundPosterOpacityChange, @@ -45,10 +47,28 @@ const { onGlassQualityChange, onOpacityChange, resetTransparencySettings, + saveTransparencySettings, transparencyBlur, transparencyGlassQuality, transparencyOpacity, } = useTransparencySettings() + +/** 父级控制弹窗生命周期时,未保存关闭仍需恢复持久化设置。 */ +watch( + () => props.modelValue, + (value, previous) => { + if (!value && previous) cancelTransparencySettings() + }, +) + +/** 保存当前透明度预览,随后关闭面板。 */ +function saveSettings() { + saveTransparencySettings() + visible.value = false +} + +// 弹窗的任意未保存销毁路径都应恢复持久化快照。 +onScopeDispose(cancelTransparencySettings)