diff --git a/src/lib/components/common/InterfaceSettings.svelte b/src/lib/components/common/InterfaceSettings.svelte index 51cef5ee3b..34952d9362 100644 --- a/src/lib/components/common/InterfaceSettings.svelte +++ b/src/lib/components/common/InterfaceSettings.svelte @@ -4,7 +4,7 @@ import { toast } from 'svelte-sonner'; import { updateUserInfo } from '$lib/apis/users'; import { getUserPosition } from '$lib/utils'; - import { setTextScale } from '$lib/utils/text-scale'; + import { normalizeAppFontFamily, setAppFontFamily, setTextScale } from '$lib/utils/text-scale'; import Minus from '$lib/components/icons/Minus.svelte'; import Plus from '$lib/components/icons/Plus.svelte'; @@ -115,7 +115,10 @@ let showManageImageCompressionModal = false; let textScale: number | null = null; + let fontFamily: string | null = null; + let fontFamilyInput = ''; let showTextScaleSlider = false; + let showFontFamilyInput = 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'; @@ -234,9 +237,18 @@ }; export const save = async () => { + const normalizedFontFamily = normalizeAppFontFamily(fontFamilyInput) || null; + fontFamily = normalizedFontFamily; + fontFamilyInput = normalizedFontFamily ?? ''; + + if (!externalSettings) { + setAppFontFamily(fontFamily || defaultFontFamily()); + } + saveSettings({ models: [defaultModelId], - imageCompressionSize: imageCompressionSize + imageCompressionSize: imageCompressionSize, + fontFamily }); }; @@ -255,6 +267,51 @@ saveSettings({ textScale }); }; + const defaultFontFamily = () => normalizeAppFontFamily(defaultSettings.fontFamily) || null; + + const previewFontFamily = (value: string) => { + fontFamilyInput = value; + fontFamily = normalizeAppFontFamily(value) || null; + + if (!externalSettings) { + setAppFontFamily(fontFamily || defaultFontFamily()); + } + }; + + const setFontFamilyHandler = (value: string | null) => { + const normalized = normalizeAppFontFamily(value); + fontFamily = normalized || null; + fontFamilyInput = normalized; + + if (!externalSettings) { + setAppFontFamily(fontFamily || defaultFontFamily()); + } + + saveSettings({ fontFamily }); + }; + + const toggleFontFamilyInput = () => { + if (!showFontFamilyInput && (fontFamily === null || isDefaultSetting('fontFamily'))) { + fontFamily = fontFamily ?? defaultFontFamily(); + fontFamilyInput = fontFamily ?? ''; + showFontFamilyInput = true; + + if (!externalSettings) { + setAppFontFamily(fontFamily); + } + } else { + showFontFamilyInput = false; + fontFamily = null; + fontFamilyInput = ''; + + if (!externalSettings) { + setAppFontFamily(defaultFontFamily()); + } + + saveSettings({ fontFamily }); + } + }; + const init = () => { titleAutoGenerate = currentSettings?.title?.auto ?? true; autoTags = currentSettings?.autoTags ?? true; @@ -338,7 +395,10 @@ webSearch = currentSettings?.webSearch ?? null; textScale = currentSettings?.textScale ?? null; + fontFamily = normalizeAppFontFamily(currentSettings?.fontFamily) || null; + fontFamilyInput = fontFamily ?? ''; showTextScaleSlider = false; + showFontFamilyInput = false; defaultUploadContext = currentSettings?.defaultUploadContext ?? 'focused'; }; @@ -488,6 +548,46 @@
++ {$i18n.t('Use a local font family for the app interface.')} +
+