import { Stack, Text, Group, SegmentedControl, rem, Slider, TextInput, type MantineColorScheme, } from '@mantine/core'; import { Sun, Moon, Monitor } from 'lucide-react'; import { useState, useEffect } from 'react'; import { usePreferencesStore } from '@/stores/preferences'; import { zoomLevelToPercentage, percentageToZoomLevel, isValidZoomPercentage, } from '@/utils/zoom'; import { ZOOM } from '@/constants'; export const AppearanceTab = () => { 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 (!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 (isNaN(numValue) || !isValidZoomPercentage(numValue)) { setZoomPercentage(zoomLevelToPercentage(zoomLevel).toString()); } }} rightSection={ % } size="sm" w={80} styles={{ input: { textAlign: 'center', }, }} />
`${zoomLevelToPercentage(value)}%`} style={{ marginBottom: '0.5rem' }} />
); };