diff --git a/src/lib/components/chat/SettingsModal.svelte b/src/lib/components/chat/SettingsModal.svelte index 53979264bf..2b88850ea4 100644 --- a/src/lib/components/chat/SettingsModal.svelte +++ b/src/lib/components/chat/SettingsModal.svelte @@ -63,6 +63,23 @@ let tabState: Record | null = null; let personalUiSettings: Record = {}; + const mergeUiSettings = (defaults: Record, userSettings: Record) => { + const merged = { ...defaults }; + for (const [key, value] of Object.entries(userSettings)) { + const defaultValue = merged[key]; + merged[key] = + defaultValue && + value && + typeof defaultValue === 'object' && + typeof value === 'object' && + !Array.isArray(defaultValue) && + !Array.isArray(value) + ? mergeUiSettings(defaultValue, value) + : value; + } + return merged; + }; + const loadPersonalUiSettings = async () => { const userSettings = await getUserSettings(localStorage.token, true).catch((error) => { console.error(error); @@ -838,6 +855,9 @@ const saved = await updateUserSettings(localStorage.token, { ui: $settings }); personalUiSettings = saved?.ui && typeof saved.ui === 'object' && !Array.isArray(saved.ui) ? saved.ui : {}; + await settings.set( + mergeUiSettings($config?.ui?.default_interface_settings ?? {}, personalUiSettings) + ); }; const getModels = async () => { diff --git a/src/lib/components/common/InterfaceSettings.svelte b/src/lib/components/common/InterfaceSettings.svelte index dd198d47dc..c3295607ae 100644 --- a/src/lib/components/common/InterfaceSettings.svelte +++ b/src/lib/components/common/InterfaceSettings.svelte @@ -111,6 +111,7 @@ let showManageImageCompressionModal = false; let textScale: number | null = null; + let showTextScaleSlider = false; const settingRowClass = 'flex items-center justify-between gap-2.5'; const settingLabelClass = 'min-w-0 text-xs text-gray-600 dark:text-gray-400'; const settingControlClass = 'flex shrink-0 items-center justify-end gap-1.5'; @@ -243,9 +244,6 @@ setTextScale(textScale); } - if (textScale === 1) { - textScale = null; - } saveSettings({ textScale }); }; @@ -328,6 +326,7 @@ webSearch = currentSettings?.webSearch ?? null; textScale = currentSettings?.textScale ?? null; + showTextScaleSlider = false; defaultUploadContext = currentSettings?.defaultUploadContext ?? 'focused'; }; @@ -401,14 +400,20 @@ aria-live="polite" type="button" on:click={() => { - if (textScale === null) { - textScale = 1; - } else if (!isDefaultSetting('textScale')) { - setTextScaleHandler(defaultSettings.textScale ?? 1); + if (textScale === null || (isDefaultSetting('textScale') && !showTextScaleSlider)) { + textScale = textScale ?? defaultSettings.textScale ?? 1; + showTextScaleSlider = true; + } else { + showTextScaleSlider = false; + if (!externalSettings) { + setTextScale(defaultSettings.textScale ?? 1); + } + textScale = null; + saveSettings({ textScale }); } }} > - {#if textScale === null || isDefaultSetting('textScale')} + {#if textScale === null || (isDefaultSetting('textScale') && !showTextScaleSlider)} {$i18n.t('Default')} {:else} {textScale}x @@ -417,7 +422,7 @@ - {#if textScale !== null && !isDefaultSetting('textScale')} + {#if textScale !== null && (showTextScaleSlider || !isDefaultSetting('textScale'))}