diff --git a/desktop/src/__tests__/generalSettings.test.tsx b/desktop/src/__tests__/generalSettings.test.tsx
index 604a1a37..cf9cecfe 100644
--- a/desktop/src/__tests__/generalSettings.test.tsx
+++ b/desktop/src/__tests__/generalSettings.test.tsx
@@ -144,6 +144,7 @@ describe('Settings > General tab', () => {
skipWebFetchPreflight: true,
desktopNotificationsEnabled: true,
responseLanguage: '',
+ uiZoom: 1,
webSearch: { mode: 'auto', tavilyApiKey: '', braveApiKey: '' },
h5Access: {
enabled: false,
@@ -167,6 +168,9 @@ describe('Settings > General tab', () => {
setResponseLanguage: vi.fn().mockImplementation(async (language: string) => {
useSettingsStore.setState({ responseLanguage: language })
}),
+ setUiZoom: vi.fn().mockImplementation((uiZoom: number) => {
+ useSettingsStore.setState({ uiZoom })
+ }),
setWebSearch: vi.fn().mockImplementation(async (webSearch) => {
useSettingsStore.setState({ webSearch })
}),
@@ -251,6 +255,26 @@ describe('Settings > General tab', () => {
expect(screen.getByRole('button', { name: 'Warm Classic' })).toHaveAttribute('aria-pressed', 'false')
})
+ it('updates the shared UI zoom setting from the General display control', async () => {
+ render()
+
+ fireEvent.click(screen.getByText('General'))
+ await act(async () => {
+ fireEvent.change(screen.getByLabelText('UI Zoom'), {
+ target: { value: '1.25', valueAsNumber: 1.25 },
+ })
+ })
+
+ expect(useSettingsStore.getState().setUiZoom).toHaveBeenCalledWith(1.25)
+ expect(screen.getByText('125%')).toBeInTheDocument()
+
+ await act(async () => {
+ fireEvent.click(screen.getByRole('button', { name: 'Reset UI zoom to 100%' }))
+ })
+
+ expect(useSettingsStore.getState().setUiZoom).toHaveBeenLastCalledWith(1)
+ })
+
it('opens the Token usage tab from Settings navigation above Diagnostics', () => {
render()
diff --git a/desktop/src/components/layout/AppShell.tsx b/desktop/src/components/layout/AppShell.tsx
index af09547b..c9e578ab 100644
--- a/desktop/src/components/layout/AppShell.tsx
+++ b/desktop/src/components/layout/AppShell.tsx
@@ -28,7 +28,6 @@ function isChatTab(tab: Tab | undefined) {
export function AppShell() {
const fetchSettings = useSettingsStore((s) => s.fetchAll)
- const uiZoom = useSettingsStore((s) => s.uiZoom)
const sidebarOpen = useUIStore((s) => s.sidebarOpen)
const toggleSidebar = useUIStore((s) => s.toggleSidebar)
const setSidebarOpen = useUIStore((s) => s.setSidebarOpen)
@@ -195,7 +194,7 @@ export function AppShell() {
}
return (
-
+
{isMobileShell && effectiveSidebarOpen ? (
+ {/* UI Zoom */}
+
+
+
+
{t('settings.general.uiZoom')}
+
{t('settings.general.uiZoomDescription')}
+
+
+
+ {Math.round(uiZoom * 100)}%
+
+
+
+
+
+ {Math.round(UI_ZOOM_MIN * 100)}%
+ setUiZoom(e.currentTarget.valueAsNumber)}
+ className="flex-1"
+ />
+ {Math.round(UI_ZOOM_MAX * 100)}%
+
+
+
{/* Language selector */}
{t('settings.general.languageTitle')}
{t('settings.general.languageDescription')}
@@ -1777,33 +1816,6 @@ function GeneralSettings() {
- {/* UI Zoom */}
-