diff --git a/docs/configuration.md b/docs/configuration.md index 11c13c45..1ee65512 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -12,8 +12,8 @@ Settings are organized into tabs: | Tab | Contents | |-----|----------| -| **General** | Font family and size, terminal width, log level and buffer, shell configuration, input send behavior, default toggles (history, thinking), automatic tab naming, power management, updates, privacy, usage stats, storage location | -| **Display** | Max output lines per response, document graph settings, context window warnings | +| **General** | Shell configuration, input send behavior, default toggles (history, thinking), automatic tab naming, power management, updates, privacy, usage stats, storage location | +| **Display** | Font family and size, terminal width, log level and buffer, max output lines per response, document graph settings, context window warnings | | **Shortcuts** | Customize keyboard shortcuts (see [Keyboard Shortcuts](./keyboard-shortcuts)) | | **Themes** | Dark, light, and vibe mode themes, custom theme builder with import/export | | **Notifications** | OS notifications, custom command notifications, toast notification duration | diff --git a/src/__tests__/renderer/components/SettingsModal.test.tsx b/src/__tests__/renderer/components/SettingsModal.test.tsx index 49e396c3..dd4f86ab 100644 --- a/src/__tests__/renderer/components/SettingsModal.test.tsx +++ b/src/__tests__/renderer/components/SettingsModal.test.tsx @@ -3,7 +3,7 @@ * * Tests the SettingsModal component, including: * - Modal rendering and isOpen conditional - * - Tab navigation (general, shortcuts, theme, notifications, aicommands) + * - Tab navigation (general, display, shortcuts, theme, notifications, aicommands) * - Tab keyboard navigation (Cmd+Shift+[ and ]) * - Layer stack integration * - Agent loading and configuration @@ -297,6 +297,7 @@ describe('SettingsModal', () => { }); expect(screen.getByTitle('General')).toBeInTheDocument(); + expect(screen.getByTitle('Display')).toBeInTheDocument(); expect(screen.getByTitle('Shortcuts')).toBeInTheDocument(); expect(screen.getByTitle('Themes')).toBeInTheDocument(); expect(screen.getByTitle('Notifications')).toBeInTheDocument(); @@ -310,8 +311,8 @@ describe('SettingsModal', () => { await vi.advanceTimersByTimeAsync(50); }); - // General tab content should show the Font Size label - expect(screen.getByText('Font Size')).toBeInTheDocument(); + // General tab content should show the Default Terminal Shell label + expect(screen.getByText('Default Terminal Shell')).toBeInTheDocument(); }); it('should respect initialTab prop', async () => { @@ -383,16 +384,17 @@ describe('SettingsModal', () => { }); // Start on general tab - expect(screen.getByText('Font Size')).toBeInTheDocument(); + expect(screen.getByText('Default Terminal Shell')).toBeInTheDocument(); - // Press Cmd+Shift+] to go to shortcuts + // Press Cmd+Shift+] to go to display fireEvent.keyDown(window, { key: ']', metaKey: true, shiftKey: true }); await act(async () => { await vi.advanceTimersByTimeAsync(100); }); - expect(screen.getByPlaceholderText('Filter shortcuts...')).toBeInTheDocument(); + // Display tab has Font Size + expect(screen.getByText('Font Size')).toBeInTheDocument(); }); it('should navigate to previous tab with Cmd+Shift+[', async () => { @@ -405,13 +407,14 @@ describe('SettingsModal', () => { // Start on shortcuts tab expect(screen.getByPlaceholderText('Filter shortcuts...')).toBeInTheDocument(); - // Press Cmd+Shift+[ to go back to general + // Press Cmd+Shift+[ to go back to display fireEvent.keyDown(window, { key: '[', metaKey: true, shiftKey: true }); await act(async () => { await vi.advanceTimersByTimeAsync(100); }); + // Display tab has Font Size expect(screen.getByText('Font Size')).toBeInTheDocument(); }); @@ -432,7 +435,8 @@ describe('SettingsModal', () => { await vi.advanceTimersByTimeAsync(100); }); - expect(screen.getByText('Font Size')).toBeInTheDocument(); + // General tab has Default Terminal Shell + expect(screen.getByText('Default Terminal Shell')).toBeInTheDocument(); }); it('should wrap around when navigating before first tab', async () => { @@ -443,9 +447,9 @@ describe('SettingsModal', () => { }); // Start on general tab (first tab) - expect(screen.getByText('Font Size')).toBeInTheDocument(); + expect(screen.getByText('Default Terminal Shell')).toBeInTheDocument(); - // Press Cmd+Shift+[ to wrap to SSH (now the last tab) + // Press Cmd+Shift+[ to wrap to SSH (last tab) fireEvent.keyDown(window, { key: '[', metaKey: true, shiftKey: true }); await act(async () => { @@ -475,9 +479,9 @@ describe('SettingsModal', () => { }); }); - describe('General tab - Font settings', () => { + describe('Display tab - Font settings', () => { it('should show font loading message initially', async () => { - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(50); @@ -489,7 +493,7 @@ describe('SettingsModal', () => { it('should call setFontFamily when font is changed', async () => { const setFontFamily = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -504,7 +508,7 @@ describe('SettingsModal', () => { }); it('should load fonts when font select is focused', async () => { - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -523,10 +527,10 @@ describe('SettingsModal', () => { }); }); - describe('General tab - Font size buttons', () => { + describe('Display tab - Font size buttons', () => { it('should call setFontSize with 12 when Small is clicked', async () => { const setFontSize = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -538,7 +542,7 @@ describe('SettingsModal', () => { it('should call setFontSize with 14 when Medium is clicked', async () => { const setFontSize = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -550,7 +554,7 @@ describe('SettingsModal', () => { it('should call setFontSize with 16 when Large is clicked', async () => { const setFontSize = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -562,7 +566,7 @@ describe('SettingsModal', () => { it('should call setFontSize with 18 when X-Large is clicked', async () => { const setFontSize = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -573,7 +577,7 @@ describe('SettingsModal', () => { }); it('should highlight selected font size', async () => { - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -584,10 +588,10 @@ describe('SettingsModal', () => { }); }); - describe('General tab - Terminal width buttons', () => { + describe('Display tab - Terminal width buttons', () => { it('should call setTerminalWidth with 80', async () => { const setTerminalWidth = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -599,7 +603,7 @@ describe('SettingsModal', () => { it('should call setTerminalWidth with 100', async () => { const setTerminalWidth = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -613,10 +617,10 @@ describe('SettingsModal', () => { }); }); - describe('General tab - Log level buttons', () => { + describe('Display tab - Log level buttons', () => { it('should call setLogLevel with debug', async () => { const setLogLevel = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -628,7 +632,7 @@ describe('SettingsModal', () => { it('should call setLogLevel with info', async () => { const setLogLevel = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -640,7 +644,7 @@ describe('SettingsModal', () => { it('should call setLogLevel with warn', async () => { const setLogLevel = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -652,7 +656,7 @@ describe('SettingsModal', () => { it('should call setLogLevel with error', async () => { const setLogLevel = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -663,10 +667,10 @@ describe('SettingsModal', () => { }); }); - describe('General tab - Max log buffer buttons', () => { + describe('Display tab - Max log buffer buttons', () => { it('should call setMaxLogBuffer with various values', async () => { const setMaxLogBuffer = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -686,10 +690,10 @@ describe('SettingsModal', () => { }); }); - describe('General tab - Max output lines buttons', () => { + describe('Display tab - Max output lines buttons', () => { it('should call setMaxOutputLines with various values', async () => { const setMaxOutputLines = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1290,7 +1294,7 @@ describe('SettingsModal', () => { describe('custom fonts', () => { it('should add custom font when input is submitted', async () => { - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1308,7 +1312,7 @@ describe('SettingsModal', () => { }); it('should add custom font on Enter key', async () => { - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1326,7 +1330,7 @@ describe('SettingsModal', () => { }); it('should not add empty custom font', async () => { - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1353,7 +1357,7 @@ describe('SettingsModal', () => { const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1817,7 +1821,7 @@ describe('SettingsModal', () => { // Preload custom fonts vi.mocked(window.maestro.settings.get).mockResolvedValue(['MyCustomFont', 'AnotherFont']); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1851,7 +1855,7 @@ describe('SettingsModal', () => { describe('Terminal width 120 and 160 buttons', () => { it('should call setTerminalWidth with 120', async () => { const setTerminalWidth = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1863,7 +1867,7 @@ describe('SettingsModal', () => { it('should call setTerminalWidth with 160', async () => { const setTerminalWidth = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1877,7 +1881,7 @@ describe('SettingsModal', () => { describe('Max output lines 100 button', () => { it('should call setMaxOutputLines with 100', async () => { const setMaxOutputLines = vi.fn(); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); @@ -1895,7 +1899,7 @@ describe('SettingsModal', () => { it('should check font availability using normalized names', async () => { (window.maestro as any).fonts.detect.mockResolvedValue(['JetBrains Mono', 'Fira Code']); - render(); + render(); await act(async () => { await vi.advanceTimersByTimeAsync(100); diff --git a/src/renderer/components/SettingsModal.tsx b/src/renderer/components/SettingsModal.tsx index 2b8e3526..e6665254 100644 --- a/src/renderer/components/SettingsModal.tsx +++ b/src/renderer/components/SettingsModal.tsx @@ -951,89 +951,6 @@ export const SettingsModal = memo(function SettingsModal(props: SettingsModalPro
{activeTab === 'general' && (
- {/* Font Family */} - - - {/* Font Size */} -
- - -
- - {/* Terminal Width */} -
- - -
- - {/* Log Level */} -
- - -

- Higher levels show fewer logs. Debug shows all logs, Error shows only errors. -

-
- - {/* Max Log Buffer */} -
- - -

- Maximum number of log messages to keep in memory. Older logs are automatically - removed. -

-
- {/* Default Shell */}