import { Group, type MantineColorScheme, rem, SegmentedControl, Slider, Stack, Text, TextInput, } from '@mantine/core'; import { Monitor, Moon, Sun } from 'lucide-react'; import { useEffect, useState } from 'react'; import { FrontendInterfaceSelector } from '@/components/settings/FrontendInterfaceSelector'; import { ZOOM } from '@/constants'; import { usePreferencesStore } from '@/stores/preferences'; import { isValidZoomPercentage, percentageToZoomLevel, zoomLevelToPercentage } from '@/utils/zoom'; interface AppearanceTabProps { isOnInterfaceScreen?: boolean; } export const AppearanceTab = ({ isOnInterfaceScreen = false }: AppearanceTabProps) => { const { rawColorScheme, resolvedColorScheme, setColorScheme: setStoreColorScheme, } = usePreferencesStore(); const isDark = resolvedColorScheme === 'dark'; const [zoomLevel, setZoomLevel] = useState(ZOOM.DEFAULT_LEVEL); const [zoomPercentage, setZoomPercentage] = useState(ZOOM.DEFAULT_PERCENTAGE.toString()); useEffect(() => { const loadSettings = async () => { const currentZoom = await window.electronAPI.app.getZoomLevel(); if (typeof currentZoom === 'number') { setZoomLevel(currentZoom); setZoomPercentage(zoomLevelToPercentage(currentZoom).toString()); } }; void loadSettings(); }, []); const handleColorSchemeChange = (value: string) => { const newColorScheme = value as MantineColorScheme; void setStoreColorScheme(newColorScheme); }; const handleZoomChange = (newZoomLevel: number) => { setZoomLevel(newZoomLevel); const percentage = zoomLevelToPercentage(newZoomLevel); setZoomPercentage(percentage.toString()); void window.electronAPI.app.setZoomLevel(newZoomLevel); }; const handleZoomPercentageChange = (value: string) => { setZoomPercentage(value); const numValue = Number(value); if (!Number.isNaN(numValue) && isValidZoomPercentage(numValue)) { const newZoomLevel = percentageToZoomLevel(numValue); setZoomLevel(newZoomLevel); void window.electronAPI.app.setZoomLevel(newZoomLevel); } }; return (
Theme Choose how the application should appear ({ root: { border: `0.5px solid ${isDark ? theme.colors.dark[4] : theme.colors.gray[4]}`, }, indicator: { backgroundColor: isDark ? theme.colors.dark[5] : theme.colors.gray[2], border: `1px solid ${isDark ? theme.colors.dark[4] : theme.colors.gray[4]}`, }, })} data={[ { label: ( Light ), value: 'light', }, { label: ( Dark ), value: 'dark', }, { label: ( System ), value: 'auto', }, ]} />
Zoom Level Adjust the zoom level of the application interface handleZoomPercentageChange(event.currentTarget.value)} onBlur={(event) => { const value = event.currentTarget.value; const numValue = Number(value); if (Number.isNaN(numValue) || !isValidZoomPercentage(numValue)) { setZoomPercentage(zoomLevelToPercentage(zoomLevel).toString()); } }} rightSection={ % } size="sm" w={80} styles={{ input: { textAlign: 'center', }, }} />
`${zoomLevelToPercentage(value)}%`} style={{ marginBottom: '0.5rem' }} />
); };