diff --git a/frontend/src/components/layout/AppLayout.tsx b/frontend/src/components/layout/AppLayout.tsx
index d03345a..707caec 100644
--- a/frontend/src/components/layout/AppLayout.tsx
+++ b/frontend/src/components/layout/AppLayout.tsx
@@ -1,14 +1,20 @@
-import { type ReactNode } from 'react'
+import { type ReactNode, useEffect } from 'react'
import { Sidebar } from './Sidebar'
import { ShortcutsDialog } from './ShortcutsDialog'
import { CommandPalette } from '@/components/command-palette/CommandPalette'
import { Toaster } from '@/components/ui/toast'
+import { useUIStore } from '@/lib/store'
interface AppLayoutProps {
children: ReactNode
}
export function AppLayout({ children }: AppLayoutProps) {
+ // Apply persisted UI scale on mount
+ const uiScale = useUIStore((s) => s.uiScale)
+ useEffect(() => {
+ document.documentElement.style.zoom = `${uiScale}%`
+ }, [uiScale])
return (
+ {/* Scale selector */}
+
+ {([100, 110, 125] as const).map((s) => (
+
+ ))}
+
{/* Connection + version row */}
void
setSidebarCollapsed: (collapsed: boolean) => void
toggleSidebar: () => void
setMobileSidebarOpen: (open: boolean) => void
setTheme: (theme: 'dark' | 'light') => void
+ setUIScale: (scale: UIScale) => void
}
export const useUIStore = create()(
@@ -22,6 +26,7 @@ export const useUIStore = create()(
sidebarCollapsed: false,
mobileSidebarOpen: false,
theme: 'dark',
+ uiScale: 100,
setSelectedTenantId: (id) => set({ selectedTenantId: id }),
setSidebarCollapsed: (collapsed) => set({ sidebarCollapsed: collapsed }),
@@ -31,6 +36,10 @@ export const useUIStore = create()(
applyTheme(theme)
set({ theme })
},
+ setUIScale: (scale) => {
+ document.documentElement.style.zoom = `${scale}%`
+ set({ uiScale: scale })
+ },
}),
{
name: 'tod-ui-state',
@@ -38,6 +47,7 @@ export const useUIStore = create()(
sidebarCollapsed: state.sidebarCollapsed,
theme: state.theme,
selectedTenantId: state.selectedTenantId,
+ uiScale: state.uiScale,
}),
},
),