From 383fd05c6cc6c8c5740856ed5d9b8bd8dec24f04 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Mon, 9 Jun 2025 21:19:44 -0700 Subject: [PATCH] Split appearance settings into theme/interface --- src-web/components/Settings/Settings.tsx | 15 +- .../components/Settings/SettingsInterface.tsx | 137 ++++++++++++++++++ ...ttingsAppearance.tsx => SettingsTheme.tsx} | 124 +--------------- 3 files changed, 148 insertions(+), 128 deletions(-) create mode 100644 src-web/components/Settings/SettingsInterface.tsx rename src-web/components/Settings/{SettingsAppearance.tsx => SettingsTheme.tsx} (53%) diff --git a/src-web/components/Settings/Settings.tsx b/src-web/components/Settings/Settings.tsx index 21d1888c..1629b68a 100644 --- a/src-web/components/Settings/Settings.tsx +++ b/src-web/components/Settings/Settings.tsx @@ -8,22 +8,24 @@ import { capitalize } from '../../lib/capitalize'; import { HStack } from '../core/Stacks'; import { TabContent, Tabs } from '../core/Tabs/Tabs'; import { HeaderSize } from '../HeaderSize'; -import { SettingsAppearance } from './SettingsAppearance'; +import { SettingsInterface } from './SettingsInterface'; import { SettingsGeneral } from './SettingsGeneral'; import { SettingsLicense } from './SettingsLicense'; import { SettingsPlugins } from './SettingsPlugins'; import { SettingsProxy } from './SettingsProxy'; +import { SettingsTheme } from './SettingsTheme'; interface Props { hide?: () => void; } const TAB_GENERAL = 'general'; -const TAB_APPEARANCE = 'appearance'; +const TAB_INTERFACE = 'interface'; +const TAB_THEME = 'theme'; const TAB_PROXY = 'proxy'; const TAB_PLUGINS = 'plugins'; const TAB_LICENSE = 'license'; -const tabs = [TAB_GENERAL, TAB_APPEARANCE, TAB_PROXY, TAB_PLUGINS, TAB_LICENSE] as const; +const tabs = [TAB_GENERAL, TAB_THEME, TAB_INTERFACE, TAB_PROXY, TAB_PLUGINS, TAB_LICENSE] as const; export type SettingsTab = (typeof tabs)[number]; export default function Settings({ hide }: Props) { @@ -73,8 +75,11 @@ export default function Settings({ hide }: Props) { - - + + + + + diff --git a/src-web/components/Settings/SettingsInterface.tsx b/src-web/components/Settings/SettingsInterface.tsx new file mode 100644 index 00000000..feacb660 --- /dev/null +++ b/src-web/components/Settings/SettingsInterface.tsx @@ -0,0 +1,137 @@ +import { type } from '@tauri-apps/plugin-os'; +import { useFonts } from '@yaakapp-internal/fonts'; +import type { EditorKeymap } from '@yaakapp-internal/models'; +import { patchModel, settingsAtom } from '@yaakapp-internal/models'; +import { useAtomValue } from 'jotai'; +import React from 'react'; +import { activeWorkspaceAtom } from '../../hooks/useActiveWorkspace'; +import { clamp } from '../../lib/clamp'; +import { Checkbox } from '../core/Checkbox'; +import { Icon } from '../core/Icon'; +import { Select } from '../core/Select'; +import { HStack, VStack } from '../core/Stacks'; + +const NULL_FONT_VALUE = '__NULL_FONT__'; + +const fontSizeOptions = [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, +].map((n) => ({ label: `${n}`, value: `${n}` })); + +const keymaps: { value: EditorKeymap; label: string }[] = [ + { value: 'default', label: 'Default' }, + { value: 'vim', label: 'Vim' }, + { value: 'vscode', label: 'VSCode' }, + { value: 'emacs', label: 'Emacs' }, +]; + +export function SettingsInterface() { + const workspace = useAtomValue(activeWorkspaceAtom); + const settings = useAtomValue(settingsAtom); + const fonts = useFonts(); + + if (settings == null || workspace == null) { + return null; + } + + return ( + + + {fonts.data && ( + patchModel(settings, { interfaceFontSize: parseInt(v) })} + /> + + + {fonts.data && ( + + patchModel(settings, { editorFontSize: clamp(parseInt(v) || 14, 8, 30) }) + } + /> + + ({ - label: f, - value: f, - })) ?? []), - // Some people like monospace fonts for the UI - ...(fonts.data.editorFonts.map((f) => ({ - label: f, - value: f, - })) ?? []), - ]} - onChange={async (v) => { - const interfaceFont = v === NULL_FONT_VALUE ? null : v; - await patchModel(settings, { interfaceFont }); - }} - /> - )} - ({ - label: f, - value: f, - })) ?? []), - ]} - onChange={async (v) => { - const editorFont = v === NULL_FONT_VALUE ? null : v; - await patchModel(settings, { editorFont }); - }} - /> - )} - } - size="sm" - name="editorKeymap" - label="Editor Keymap" - value={`${settings.editorKeymap}`} - options={keymaps} - onChange={(v) => patchModel(settings, { editorKeymap: v })} - /> -
- patchModel(settings, { editorSoftWrap })} - /> - patchModel(settings, { coloredMethods })} - /> -
- - {type() !== 'macos' && ( - patchModel(settings, { hideWindowControls })} - /> - )} - - -