From b1129cedec5e4890d82fcddc186b13467f466a6f Mon Sep 17 00:00:00 2001 From: mesalogo Date: Fri, 2 Oct 2026 10:40:16 +0800 Subject: [PATCH] fix: enable frosted glass effect by default --- UI-DESIGN.md | 2 +- src/main/application-settings-store.test.ts | 6 +++--- src/main/application-settings-store.ts | 2 +- src/renderer/src/App.tsx | 2 +- src/renderer/src/SettingsPanel.test.tsx | 12 ++++++------ src/renderer/src/SettingsPanel.tsx | 2 +- src/shared/application-settings-contracts.ts | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/UI-DESIGN.md b/UI-DESIGN.md index 72e0c458..4a6b5661 100644 --- a/UI-DESIGN.md +++ b/UI-DESIGN.md @@ -43,7 +43,7 @@ 两种主题必须保持相同的信息层级,但不要求机械地反转明暗。浅色主题以白色主内容画布、冰蓝灰侧栏和轻微着色的顶栏建立空间关系;深色主题使用深海军蓝与蓝灰表面逐层提亮,避免纯黑。蓝色承担主要选择和交互,青绿色主要承担成功与可用状态,二者不得混用语义。 -外观设置提供“透明磨砂特效”开关,当前默认关闭,文字在左、共享 Switch 在右。选择保存在应用设置中,保存成功后立即生效,重启后恢复。开启时,右侧内容框架顶栏的背景不透明度在浅色主题为 65%、深色主题为 70%,保留 18px 背景模糊与淡分隔线。聊天滚动视口向上延伸 58px,消息上滚时实际经过顶栏背后;不使用人工渐变充当背景。初始留白放在滚动内容中,包含顶栏高度和当前任务/待办条的实测高度,首条消息仍从这些控件下方开始。任务/待办条固定在顶栏下方并保持实色;展开的 Runtime 待办卡片使用两主题各自的 75% 不透明背景、18px 背景模糊和清晰的文字颜色。 +外观设置提供“透明磨砂特效”开关,默认开启,文字在左、共享 Switch 在右。新用户及缺少该字段的旧配置使用开启状态;已保存的开关选择保持不变。选择保存在应用设置中,保存成功后立即生效,重启后恢复。开启时,右侧内容框架顶栏的背景不透明度在浅色主题为 65%、深色主题为 70%,保留 18px 背景模糊与淡分隔线。聊天滚动视口向上延伸 58px,消息上滚时实际经过顶栏背后;不使用人工渐变充当背景。初始留白放在滚动内容中,包含顶栏高度和当前任务/待办条的实测高度,首条消息仍从这些控件下方开始。任务/待办条固定在顶栏下方并保持实色;展开的 Runtime 待办卡片使用两主题各自的 75% 不透明背景、18px 背景模糊和清晰的文字颜色。 已保存的开关状态同步到文档根节点,卸载时清理,使 body/top layer 中的待办卡片也能应用样式;其他菜单保持原有表面。输入区、右侧工作栏和非聊天页面保持原有位置,聊天加载态及无活动消息面板时不扩展视口。窗口拖拽和控制按钮保持原有行为;该效果不透出操作系统桌面。关闭后恢复顶栏下方的聊天布局,顶栏与待办卡片均恢复实色。`tests/frosted-glass.electron.test.ts` 使用真实 `ChatHistoryPane` 检查消息与顶栏的可见矩形交叠、初始留白、关闭恢复、浅深主题、跳底、历史加载锚点和会话切换。 diff --git a/src/main/application-settings-store.test.ts b/src/main/application-settings-store.test.ts index 76299d5b..f0c3122c 100644 --- a/src/main/application-settings-store.test.ts +++ b/src/main/application-settings-store.test.ts @@ -75,18 +75,18 @@ describe('ApplicationSettingsStore', () => { } }) - it.each([11, 12])('defaults missing frosted glass to off in version %s', async (version) => { + it.each([11, 12])('defaults missing frosted glass to on in version %s', async (version) => { const { filePath, store } = await createStore() const legacy: Record = { ...defaultApplicationSettings, version, lastSeenReleaseNotesVersion: null, checkUpdatesOnStartup: false } delete legacy.transparentFrostedEffectEnabled await writeFile(filePath, JSON.stringify(legacy)) expect(await store.get()).toEqual({ ...defaultApplicationSettings, checkUpdatesOnStartup: false }) - expect(applicationSettingsSchema.parse({ ...defaultApplicationSettings, transparentFrostedEffectEnabled: undefined }).transparentFrostedEffectEnabled).toBe(false) + expect(applicationSettingsSchema.parse({ ...defaultApplicationSettings, transparentFrostedEffectEnabled: undefined }).transparentFrostedEffectEnabled).toBe(true) }) it('persists and publishes both frosted glass choices across unrelated updates and reloads', async () => { const { filePath, store } = await createStore() - expect((await store.get()).transparentFrostedEffectEnabled).toBe(false) + expect((await store.get()).transparentFrostedEffectEnabled).toBe(true) const changed = vi.fn() store.onChanged(changed) for (const transparentFrostedEffectEnabled of [true, false]) { diff --git a/src/main/application-settings-store.ts b/src/main/application-settings-store.ts index a4e5e0c5..6b1f5e49 100644 --- a/src/main/application-settings-store.ts +++ b/src/main/application-settings-store.ts @@ -251,7 +251,7 @@ export const resolveLegacyLocalToolEnvironmentPaths: LegacyLocalToolEnvironmentR export const defaultApplicationSettings: ApplicationSettings = { checkUpdatesOnStartup: true, desktopNotificationsEnabled: true, - transparentFrostedEffectEnabled: false, + transparentFrostedEffectEnabled: true, updateSource: 'github', modelDownloadSource: 'modelscope', localToolEnvironment: defaultLocalToolEnvironmentSettings, diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 9b6155a2..f48469fc 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -11173,7 +11173,7 @@ function App(): React.JSX.Element { { const { rerender } = render() fireEvent.click(screen.getByRole('tab', { name: category })) const toggle = screen.getByRole('switch', { name: label }) - expect(toggle).not.toBeChecked() + expect(toggle).toBeChecked() expect(toggle).toHaveAccessibleDescription(description) expect(toggle.closest('label')).toHaveClass('toggle-row') fireEvent.click(toggle) - expect(onChange).toHaveBeenCalledExactlyOnceWith(true) - rerender() - expect(toggle).toBeChecked() + expect(onChange).toHaveBeenCalledExactlyOnceWith(false) + rerender() + expect(toggle).not.toBeChecked() expect(toggle).toBeDisabled() - rerender() + rerender() fireEvent.click(toggle) - expect(onChange).toHaveBeenLastCalledWith(false) + expect(onChange).toHaveBeenLastCalledWith(true) }) it.each([ diff --git a/src/renderer/src/SettingsPanel.tsx b/src/renderer/src/SettingsPanel.tsx index 83b69d8e..6aa5a483 100644 --- a/src/renderer/src/SettingsPanel.tsx +++ b/src/renderer/src/SettingsPanel.tsx @@ -656,7 +656,7 @@ export function SettingsPanel({ onClearLocalData, onExpertsChanged = () => {}, appearanceTheme = 'system', - transparentFrostedEffectEnabled = false, + transparentFrostedEffectEnabled = true, applicationSettingsPending = false, applicationSettingsLocked = false, applicationSettingsError, diff --git a/src/shared/application-settings-contracts.ts b/src/shared/application-settings-contracts.ts index 55ee3513..25be956e 100644 --- a/src/shared/application-settings-contracts.ts +++ b/src/shared/application-settings-contracts.ts @@ -59,7 +59,7 @@ const applicationPreferencesSchema = z .object({ checkUpdatesOnStartup: z.boolean(), desktopNotificationsEnabled: z.boolean().default(true), - transparentFrostedEffectEnabled: z.boolean().default(false), + transparentFrostedEffectEnabled: z.boolean().default(true), updateSource: updateSourceSchema, modelDownloadSource: modelDownloadSourceSchema, localToolEnvironment: localToolEnvironmentSettingsSchema,